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>
C# 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
public Dictionary<string, int> Histogram(List<int> values, int bucketSize) {
}
Worked examples
| Call | Result |
|---|---|
Histogram(new List<int> { 0, 5, 10, 15, 23 }, 10) | new Dictionary<string, int> { { "0", 2 }, { "10", 2 }, { "20", 1 } } |
Histogram(new List<int> { 9, 10 }, 10) | new Dictionary<string, int> { { "0", 1 }, { "10", 1 } } |
Histogram(new List<int> { 1, 2, 3 }, 1) | new Dictionary<string, int> { { "1", 1 }, { "2", 1 }, { "3", 1 } } |
Histogram(new List<int> { 1, 2 }, 0) | new Dictionary<string, int> { } |
Hint
Integer-divide by the bucket size, multiply back, and that is the bucket name.
Reference solution in C#
public Dictionary<string, int> Histogram(List<int> values, int bucketSize) {
var result = new Dictionary<string, int>();
if (bucketSize <= 0) return result;
foreach (var v in values) {
string k = ((v / bucketSize) * bucketSize).ToString();
result[k] = result.ContainsKey(k) ? result[k] + 1 : 1;
}
return result;
}