Last active
August 29, 2015 14:13
-
-
Save tfrisk-old/5602af66d3c9ce480dd2 to your computer and use it in GitHub Desktop.
Hassuimmat sanat Alastalon salissa -koodaustehtävä
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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