typestar

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

  1. Parallel arrays hold days and boxed readings.
  2. One indexed pass finds the records and the sum.
  3. stringByPaddingToLength: draws each bar against freezing.

Keywords and builtins used here

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.

Type this snippet

Step 3 of 3 in Encore, step 27 of 27 in Language basics.

← Previous