typestar

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

  1. split_iterator recorre el pasaje; counts[word] += 1 cuenta en el map.
  2. Las entradas pasan a un [dynamic]Entry y slice.sort_by las ordena.
  3. Rebanar una barra de numerales hasta e.count dibuja la línea de cada palabra.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

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

← Anterior Siguiente →