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
componentsSeparatedByString:parte; los conteos encajonados suman.- El comparador clasifica por conteo con empates alfabéticos.
stringByPaddingToLength:repite # en cada barra.
Palabras clave y builtins usados aquí
NSArrayNSMutableDictionaryNSNumberNSStringforinintlongreturnunsignedvoid
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.
Paso 1 de 3 en Bis; paso 25 de 27 en Fundamentos del lenguaje.