Skip to content

Instantly share code, notes, and snippets.

@tfrisk-old
Last active August 29, 2015 14:13
Show Gist options
  • Save tfrisk-old/5602af66d3c9ce480dd2 to your computer and use it in GitHub Desktop.
Save tfrisk-old/5602af66d3c9ce480dd2 to your computer and use it in GitHub Desktop.
Hassuimmat sanat Alastalon salissa -koodaustehtävä
; Wunderdogin koodaustehtävän ratkaisuehdotukseni, alkuperäinen sivu täällä: http://wunderdog.fi/koodaus-hassuimmat-sanat/
; Julkistettu kaikille kilpailun päättymisen jälkeen.
(ns alastalon-salissa-clj.core)
; sanojen pisteytys:
; Jokainen vokaaliketju saa n×2n pistettä, jossa n on vokaalien määrä ketjussa.
; Sanan vokaaliketjujen saamat pisteet lasketaan yhteen, jolloin saadaan sanan
; hassuuspisteet.
;
; Esimerkiksi sana "koira" saa 10 pistettä, koska "koira" sisältää vokaaliketjut
; "oi" (2×22 = 8 pistettä) ja "a" (1×21 = 2 pistettä), ja 8 + 2 = 10.
;
; Sana "hääyöaie" saa 896 pistettä, koska vokaaliketju "ääyöaie" saa
; (7×27 = 896 pistettä).
; regex lukemaan vokaalit sanoista
; (?i) = case insensitive
; ([aeuoiyäö]+) = etsi yhden tai useamman vokaalin ryhmiä
(def vokaalit-regex #"(?i)([aeuoiyäö]+)")
; tallennetaan tulokset atomiin
(def tulokset (atom {}))
; laske yksittäisen vokaalijonon hauskuusosamäärä
; koodin yksinkertaistamiseksi hauskuusarvon laskennassa
; kaava laskentaan on n * 2^n
(defn hauskuusosamäärä [n]
(* n (int (Math/pow 2 n))))
; laske annetun sanan hauskuusarvo ja tallenna tulokset
(defn hauskuusarvo [sana]
(swap! tulokset assoc sana ; tallenna tulokset
(reduce + ; summaa osamäärät
(map (fn [m] (hauskuusosamäärä (count (first m))))
(re-seq vokaalit-regex sana)))))
; avaa teksti
(defn lue-tiedosto [tiedosto]
(with-open [r (clojure.java.io/reader
tiedosto
:encoding "UTF-8")]
(doseq [rivi (line-seq r)]
(doall (map ; tarvitaan doall jotta saadaan lazy-seq toteutettua
#(hauskuusarvo %)
(clojure.string/split rivi #" "))))))
; nollaa tulokset
(reset! tulokset {})
; avaa tiedosto ja laske hauskuusarvot
;(use 'alastalon-salissa-clj.core)
(lue-tiedosto "alastalon_salissa.txt")
; etsi tuloksista suurimman hauskuusarvon sanat
; samalla arvolla voi tulla useampia sanoja
(defn etsi-suurimmat-hauskuusarvot []
(let [maksimiarvo (val (apply max-key val @tulokset))]
(filter #(= maksimiarvo (val %)) @tulokset)))
; Koodi antaa seuraavan ratkaisun:
;
; (etsi-suurimmat-hauskuusarvot)
; (["seremoniioilla" 72] ["puuaineen," 72] ["niiaamaan" 72] ["liioittelematta," 72] ["seremoniioissa," 72] ["Leeaakaan," 72])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment