temp_stats.clj en Clojure
Informa una semana de máximas con una barra a escala por día y la distancia de cada día a la media.
;; Daily high temperatures for one week, in degrees Fahrenheit.
(def week
[["Mon" 61] ["Tue" 68] ["Wed" 74] ["Thu" 79]
["Fri" 72] ["Sat" 65] ["Sun" 58]])
(def temps (map second week))
(def lo (apply min temps))
(def hi (apply max temps))
(def mean (/ (reduce + temps) (double (count temps))))
;; Each bar is scaled against the week's spread rather than against
;; zero, and the offset of 1 keeps the coolest day visible.
(defn bar [t]
(let [span (max 1 (- hi lo))
width (+ 1 (int (* 20 (/ (- t lo) (double span)))))]
(apply str (repeat width \#))))
(println (format "%-5s %5s %-21s %5s" "DAY" "HIGH" "RANGE" "DIFF"))
(println (apply str (repeat 39 "-")))
(doseq [[day t] week]
(println (format "%-5s %5d %-21s %+5.1f" day t (bar t) (- t mean))))
(println (apply str (repeat 39 "-")))
(println (format "%-5s %5d" "LOW" lo))
(println (format "%-5s %5d" "HIGH" hi))
(println (format "%-5s %5.1f" "MEAN" mean))
(println (format "%-5s %5d" "WARM" (count (filter #(> % mean) temps))))
Cómo funciona
(apply min temps)y(apply max temps)acotan la semana, y(/ (reduce + temps) (double (count temps)))da la media.(+ 1 (int (* 20 (/ (- t lo) (double span)))))escala sobre el rango de la semana, y el1deja ver el día más frío.(format "%-5s %5d %-21s %+5.1f" day t (bar t) (- t mean))imprime día, máxima, barra y diferencia con signo alineadas.
Palabras clave y builtins usados aquí
applycountdefdefndoseqdoublefilterintletmapmaxminprintlnreducerepeatsecondstr
El intento, en números
- Líneas
- 26
- Caracteres a escribir
- 981
- Tokens
- 249
- Ritmo de tres estrellas
- 80 tpm
Al ritmo de tres estrellas de 80 tokens por minuto, este intento toma unos 187 segundos.
Paso 3 de 3 en Bis; paso 27 de 27 en Fundamentos del lenguaje.