typestar

temp_stats.m en Objective-C

Una semana de temperaturas: extremos, media, barras y saltos.

// 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;
}

Cómo funciona

  1. Arreglos paralelos guardan los días y las lecturas encajonadas.
  2. Una sola pasada indexada encuentra los récords y la suma.
  3. stringByPaddingToLength: dibuja cada barra contra el congelamiento.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
45
Caracteres a escribir
1384
Tokens
400
Ritmo de tres estrellas
60 tpm

Al ritmo de tres estrellas de 60 tokens por minuto, este intento toma unos 400 segundos.

Escribe este fragmento

Paso 3 de 3 en Bis; paso 27 de 27 en Fundamentos del lenguaje.

← Anterior