Created
November 7, 2014 08:11
-
-
Save tfrisk-old/8a39de67d50b3a7fc7d6 to your computer and use it in GitHub Desktop.
Finnish Lottery (Lotto) calculations in Clojure
This file contains hidden or 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
; ############## | |
; 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