temp_stats.m in Objective-C
A week of temperatures: extremes, mean, a bar chart, and swings.
// Summarize a week of temperature readings: extremes, mean, swings.
#import <Foundation/Foundation.h>
int main(void) {
@autoreleasepool {
NSArray<NSString *> *days =
@[ @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat", @"Sun" ];
NSArray<NSNumber *> *temps =
@[ @(-4.0), @(-1.5), @2.0, @3.5, @1.0, @(-2.5), @(-6.0) ];
NSUInteger coldest = 0, warmest = 0;
double sum = 0;
for (NSUInteger i = 0; i < [temps count]; i++) {
double t = [temps[i] doubleValue];
sum += t;
if (t < [temps[coldest] doubleValue]) coldest = i;
if (t > [temps[warmest] doubleValue]) warmest = i;
}
NSLog(@"Coldest: %@ at %@ C", days[coldest], temps[coldest]);
NSLog(@"Warmest: %@ at %@ C", days[warmest], temps[warmest]);
NSLog(@"Mean: %.1f C", sum / (double)[temps count]);
// Chart each day against the freezing line.
for (NSUInteger i = 0; i < [temps count]; i++) {
double t = [temps[i] doubleValue];
NSUInteger len = t + 7 > 1 ? (NSUInteger)(t + 7) : 1;
NSString *bar = [@"" stringByPaddingToLength:len
withString:@"#"
startingAtIndex:0];
NSLog(@"%-4s %5.1f %@ %@", [days[i] UTF8String], t, bar,
t > 0 ? @"above" : @"below");
}
double sharpest = 0;
for (NSUInteger i = 1; i < [temps count]; i++) {
double swing = [temps[i] doubleValue]
- [temps[i - 1] doubleValue];
if (swing < 0) swing = -swing;
if (swing > sharpest) sharpest = swing;
}
NSLog(@"Sharpest overnight swing: %.1f C", sharpest);
}
return 0;
}
How it works
- Parallel arrays hold days and boxed readings.
- One indexed pass finds the records and the sum.
stringByPaddingToLength:draws each bar against freezing.
Keywords and builtins used here
NSArrayNSNumberNSStringdoubleforifintmainreturnvoid
The run, in numbers
- Lines
- 45
- Characters to type
- 1384
- Tokens
- 400
- Three-star pace
- 60 tpm
At the three-star pace of 60 tokens a minute, this run takes about 400 seconds.
Step 3 of 3 in Encore, step 27 of 27 in Language basics.