typestar

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

  1. (apply min temps) y (apply max temps) acotan la semana, y (/ (reduce + temps) (double (count temps))) da la media.
  2. (+ 1 (int (* 20 (/ (- t lo) (double span))))) escala sobre el rango de la semana, y el 1 deja ver el día más frío.
  3. (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í

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.

Escribe este fragmento

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

← Anterior