word_freq.odin en Odin
Una tabla de frecuencia de palabras con iterador de split, un map, un sort y un gráfico.
// Count word frequencies in a passage and chart the leaders.
package main
import "core:fmt"
import "core:slice"
import "core:strings"
PASSAGE :: "the rain in maine falls mainly on the plain and " +
"the rain stays on the plain"
Entry :: struct {
word: string,
count: int,
}
more_first :: proc(a, b: Entry) -> bool {
return a.count > b.count
}
main :: proc() {
// Tally every word into a map keyed by its slice of the passage.
counts := make(map[string]int)
defer delete(counts)
rest := PASSAGE
for word in strings.split_iterator(&rest, " ") {
counts[word] += 1
}
// Pull the entries out and sort by count, biggest first.
ranked: [dynamic]Entry
defer delete(ranked)
for word, n in counts {
append(&ranked, Entry{word, n})
}
slice.sort_by(ranked[:], more_first)
fmt.println(len(ranked), "distinct words")
fmt.println("word ct bar")
bars := "####################"
for e in ranked {
fmt.printfln("%-7s %2d %s", e.word, e.count, bars[:e.count])
}
}
Cómo funciona
split_iteratorrecorre el pasaje;counts[word] += 1cuenta en el map.- Las entradas pasan a un
[dynamic]Entryyslice.sort_bylas ordena. - Rebanar una barra de numerales hasta
e.countdibuja la línea de cada palabra.
Palabras clave y builtins usados aquí
appendbooldeferdeletedynamicforimportinintlenmakemappackageprocreturnstringstruct
El intento, en números
- Líneas
- 43
- Caracteres a escribir
- 955
- Tokens
- 207
- Ritmo de tres estrellas
- 65 tpm
Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 191 segundos.
Paso 1 de 3 en Bis; paso 25 de 27 en Fundamentos del lenguaje.