Bucket some readings
A chart needs counts per band rather than raw readings — how many orders fell between 0 and 9, 10 and 19, and so on.
- Readings are never negative.
- A bucket is named by the value it starts at, written as a string: "0", "10", "20".
- Buckets with nothing in them do not appear.
- A bucket size of zero or less gives an empty result.
histogram(values: list<int>, bucketSize: int) → map<string, int>
Go needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.
Where you start
func histogram(values []int, bucketSize int) map[string]int {
}
Worked examples
| Call | Result |
|---|---|
histogram([]int{0, 5, 10, 15, 23}, 10) | map[string]int{"0": 2, "10": 2, "20": 1} |
histogram([]int{9, 10}, 10) | map[string]int{"0": 1, "10": 1} |
histogram([]int{1, 2, 3}, 1) | map[string]int{"1": 1, "2": 1, "3": 1} |
histogram([]int{1, 2}, 0) | map[string]int{} |
Hint
Integer-divide by the bucket size, multiply back, and that is the bucket name.
Reference solution in Go
func histogram(values []int, bucketSize int) map[string]int {
result := map[string]int{}
if bucketSize <= 0 {
return result
}
for _, v := range values {
k := strconv.Itoa(v / bucketSize * bucketSize)
result[k]++
}
return result
}