Skip to content

Instantly share code, notes, and snippets.

@tfrisk-old
Created November 7, 2014 08:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tfrisk-old/8a39de67d50b3a7fc7d6 to your computer and use it in GitHub Desktop.
Save tfrisk-old/8a39de67d50b3a7fc7d6 to your computer and use it in GitHub Desktop.
Finnish Lottery (Lotto) calculations in Clojure
; ##############
; vaativampi ESIMERKKI: lottoarvonta
; tila myohempaa kayttoa varten, ei viela kaytossa
(def app-state (atom
{:rivimaara 0 ; montako rivia pelataan?
:rivit [] ; arvotut n rivia
:voittorivi [] ; arvottu voittorivi
:tulokset [] ; montako oikein per rivi?
:voittosumma 0 ; yhteenlaskettu voittosumma tuloksista
:rivihinta 1.00 ; yhden rivin hinta
:kulut 0 ; kulut yhteensa
:balanssi 0 ; voitot - kulut
}))
; arvo rivi lottoa (7 varsinaista ja 2 lisanumeroa)
; ei tue talla hetkella lisanumeroita
(defn arvo-lottorivi []
(set (take 7 ; ota 7 arvoa (14 luvusta saadaan usein samoja)
(set ; luo setti (uniikkeja arvoja)
(take 14 ; ota 14 arvoa loputtomasta ketjusta
(repeatedly ; toista seuraavaa komentoa loputtomiin
#(inc (rand-int 39)))))))) ; satunnaisluku 1-39
(def lotto-tulokset (arvo-lottorivi))
(def omarivi #{3 6 9 12 15 22 38})
; luo monta satunnaista rivia kerralla
(defn arvo-monta-rivia [riveja]
(vec (take riveja (repeatedly #(arvo-lottorivi)))))
; tarkista montako oikein yhdella rivilla
(defn tarkista-lotto [tulokset rivi]
(count ; laske osumat
(filter true? ; suodata pois false-arvot
(map #(contains? lotto-tulokset %) omarivi))))
; tarkista yksi omin kasin tehty rivi
(tarkista-lotto lotto-tulokset omarivi)
; tarkista monta rivia kerralla
(defn tarkista-kaikki-rivit [tulokset rivit]
(map #(tarkista-lotto tulokset %) rivit))
(def kaikki-tulokset
(tarkista-kaikki-rivit lotto-tulokset (arvo-monta-rivia 10)))
(reduce max kaikki-tulokset) ; paras rivi
; suodata tuloksista pois kaikki rivit ilman voittoa
(def kaikki-voitot
(filter #(<= 4 %) kaikki-tulokset))
; taulukko keskimaaraisista voitoista
; ei talla hetkella tue lisanumeroita (arvotaan 2 / kierros)
(def voittosumma-taulukko
[0 0 0 0 10 50 2000 999999])
; etsi tuloksia vastaavat voittosummat
(defn voittosumma [tulokset voittosummat]
(reduce + (map #(nth voittosummat %) tulokset)))
(voittosumma kaikki-tulokset voittosumma-taulukko)
(defn pelihinta [rivit rivihinta]
(* rivit rivihinta))
(pelihinta 1.00 10)
(defn balanssi [voittosumma pelihinta]
(- voittosumma pelihinta))
(balanssi
(voittosumma kaikki-tulokset voittosumma-taulukko)
(pelihinta 1.00 10))
; tee viela arvio veikkaamisen kustannuksista
; kustannus / rivi / satsi
; keskimaarainen voitto / numeroita oikein
; voittosumma keskimaarin
; 7: paavoitto
; 6+1: n. 50000
; 6: n. 2000
; 5: n. 50
; 4: kiintea 10e
; hinta 1,00e / rivi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment