RosettaCodeData/Task/Bin-given-limits/Objective-C/bin-given-limits.m

65 lines
3.0 KiB
Objective-C

#import <Foundation/Foundation.h>
NSArray<NSNumber *> *bins(NSArray<NSNumber *> *limits, NSArray<NSNumber *> *data) {
NSMutableArray<NSNumber *> *result = [[NSMutableArray alloc] initWithCapacity:[limits count] + 1];
for (NSInteger i = 0; i <= [limits count]; i++) {
[result addObject:@0];
}
for (NSNumber *n in data) {
NSUInteger i = [limits indexOfObject:n
inSortedRange:NSMakeRange(0, [limits count])
options:NSBinarySearchingInsertionIndex|NSBinarySearchingLastEqual
usingComparator:^(NSNumber *x, NSNumber *y){ return [x compare: y]; }];
result[i] = @(result[i].integerValue + 1);
}
return result;
}
void printBins(NSArray<NSNumber *> *limits, NSArray<NSNumber *> *bins) {
NSUInteger n = [limits count];
if (n == 0)
return;
NSCAssert(n + 1 == [bins count], @"Wrong size of bins");
NSLog(@" < %3@: %2@", limits[0], bins[0]);
for (NSInteger i = 1; i < n; i++) {
NSLog(@">= %3@ and < %3@: %2@", limits[i-1], limits[i], bins[i]);
}
NSLog(@">= %3@ : %2@", limits[n-1], bins[n]);
}
int main(void) {
@autoreleasepool {
NSArray<NSNumber *> *limits = @[@23, @37, @43, @53, @67, @83];
NSArray<NSNumber *> *data = @[
@95, @21, @94, @12, @99, @4, @70, @75, @83, @93, @52, @80, @57, @5, @53, @86, @65,
@17, @92, @83, @71, @61, @54, @58, @47, @16, @8, @9, @32, @84, @7, @87, @46, @19,
@30, @37, @96, @6, @98, @40, @79, @97, @45, @64, @60, @29, @49, @36, @43, @55];
NSLog(@"Example 1:");
printBins(limits, bins(limits, data));
limits = @[@14, @18, @249, @312, @389, @392, @513, @591, @634, @720];
data = @[
@445, @814, @519, @697, @700, @130, @255, @889, @481, @122, @932, @77, @323, @525,
@570, @219, @367, @523, @442, @933, @416, @589, @930, @373, @202, @253, @775, @47,
@731, @685, @293, @126, @133, @450, @545, @100, @741, @583, @763, @306, @655, @267,
@248, @477, @549, @238, @62, @678, @98, @534, @622, @907, @406, @714, @184, @391,
@913, @42, @560, @247, @346, @860, @56, @138, @546, @38, @985, @948, @58, @213,
@799, @319, @390, @634, @458, @945, @733, @507, @916, @123, @345, @110, @720, @917,
@313, @845, @426, @9, @457, @628, @410, @723, @354, @895, @881, @953, @677, @137,
@397, @97, @854, @740, @83, @216, @421, @94, @517, @479, @292, @963, @376, @981,
@480, @39, @257, @272, @157, @5, @316, @395, @787, @942, @456, @242, @759, @898,
@576, @67, @298, @425, @894, @435, @831, @241, @989, @614, @987, @770, @384, @692,
@698, @765, @331, @487, @251, @600, @879, @342, @982, @527, @736, @795, @585, @40,
@54, @901, @408, @359, @577, @237, @605, @847, @353, @968, @832, @205, @838, @427,
@876, @959, @686, @646, @835, @127, @621, @892, @443, @198, @988, @791, @466, @23,
@707, @467, @33, @670, @921, @180, @991, @396, @160, @436, @717, @918, @8, @374,
@101, @684, @727, @749];
NSLog(@"");
NSLog(@"Example 2:");
printBins(limits, bins(limits, data));
}
return 0;
}