typestar

word_freq.m en Objective-C

Una tabla de frecuencias con split, un diccionario contador y un orden.

// Count word frequencies in a passage and chart the leaders.
#import <Foundation/Foundation.h>

int main(void) {
    @autoreleasepool {
        NSString *passage = @"the rain in maine falls mainly on the "
                            @"plain and the rain stays on the plain";

        // Tally every word into a mutable dictionary of counts.
        NSMutableDictionary<NSString *, NSNumber *> *counts =
            [[NSMutableDictionary alloc] init];
        for (NSString *word in
             [passage componentsSeparatedByString:@" "]) {
            NSInteger n = [counts[word] integerValue];
            counts[word] = @(n + 1);
        }

        // Rank keys by count, biggest first, ties alphabetical.
        NSArray<NSString *> *ranked = [[counts allKeys]
            sortedArrayUsingComparator:^(NSString *a, NSString *b) {
                NSComparisonResult byCount =
                    [counts[b] compare:counts[a]];
                return byCount != NSOrderedSame ? byCount
                                                : [a compare:b];
            }];

        NSLog(@"%lu distinct words", (unsigned long)[ranked count]);
        for (NSString *word in ranked) {
            NSInteger n = [counts[word] integerValue];
            NSString *bar = [@"" stringByPaddingToLength:(NSUInteger)n
                                              withString:@"#"
                                         startingAtIndex:0];
            NSLog(@"%-8s %2ld %@", [word UTF8String], (long)n, bar);
        }
    }
    return 0;
}

Cómo funciona

  1. componentsSeparatedByString: parte; los conteos encajonados suman.
  2. El comparador clasifica por conteo con empates alfabéticos.
  3. stringByPaddingToLength: repite # en cada barra.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
37
Caracteres a escribir
1115
Tokens
227
Ritmo de tres estrellas
60 tpm

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

Escribe este fragmento

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

← Anterior Siguiente →