WOO logo

Seitsemän kortin sijainnin muuntaminen yhdeksi numeroksi

Tämän uutiskirjeen julkaisuhetki on neljä päivää ennen täydellistä auringonpimennystä. Toivon, että olette kaikki innoissanne ja että kaikki te, jotka olette fyysisesti ja taloudellisesti kykeneviä todistamaan sitä kokonaisvaltaisella polulla, tulette varmasti innostumaan. Valitettavasti Texasissa, jossa aion nähdä sen, on ennustettu ukkosmyrskyjä kyseiselle päivälle. Toivon kuitenkin edelleen selkeää taivasta.

Ennen kuin pääsin itse aiheeseen, sain yllättävän vahvan vastauksen viimeisimpäänpääsiäistietokilpailua käsittelevään uutiskirjeeseeni. Vaikuttaa siltä, että jotkut teistä tuntevat Raamattua varsin hyvin ja kyseenalaistivat joitakin vastauksiani. Tässä olivat kaksi pääkysymystä, joihin vastustin ja jotka liittyvät läheisesti toisiinsa:

Kysymys 8: Juudas palautti myöhemmin rahat papeille, jotka hänelle maksettiin Jeesuksen kavaltamisesta. Mitä he tekivät rahoilla?

Vastaus 8: He ostivat savenvalajan pellon, jonne haudataan lunastamattomat ruumiit. (Matteus 27:6–8)

Minulle huomautettiin, että Apostolien teoissa kerrotaan erilainen tarina siitä, mitä 30 hopearahalle tapahtui. Siellä sanotaan, että Juudas osti itse savenvalajan pellon (Apostolien teot 1:18).

Kysymys 9: Kuinka Juudas tappoi itsensä?

Vastaus 9: Hirttäminen (Matteus 27:3-5)

Jälleen kerran Apostolien teoissa näyttää olevan eri versio. En ole aivan varma, mitä siitä ajatella, joten annan raamatunkohdan puhua puolestaan: "Pahuutensa hinnalla Juudas osti pellon; sinne hän kaatui pää edellä, hänen ruumiinsa halkesi ja kaikki hänen sisälmyksensä valuivat ulos." – Apostolien teot 1:18.

Tulkintani tästä on, että Juudas sairastui, hänelle tuli turvonnut ja hänelle tuli avohaavoja. Lopulta hän heikkeni niin, että hän kaatui ja hänen suolistonsa puhkesivat. On mahdollista, että kaatuminen oli tahallinen.

Tutkiessani tätä olen huomannut, että jotkut Raamatun erehtymättömyyden kannattajat ovat nähneet paljon vaivaa yrittäessään yhdistää nämä kaksi tarinaa yhdeksi mutkikkaaksi kokonaisuudeksi. Minä voin kuitenkin vain pyöritellä silmiäni tällaisille selityksille.

Kun tämä on nyt selvitetty, siirrytään tämän viikon pääaiheeseen, tehokkaaseen koodaukseen seitsemän kortin pokerikäden pisteyttämiseksi. Tämä ei ehkä vaikuta suurelta ongelmalta tietokoneiden nopeuden vuoksi. Ultimate Texas Hold 'Emissä on kuitenkin analysoitava 56 biljoonaa tapaa, joilla kortit voivat pudota. Jokainen niistä vaatii kahden seitsemän kortin pokerikäden pisteyttämisen. Tämä voisi kestää vuosia ilman oikoteitä.

On olemassa combin(52,7) = 133 784 560 tapaa valita seitsemän korttia 52 kortin pakasta. Tärkeä ajansäästötekniikka on pisteyttää kaikki mahdolliset yhdistelmät kerran ja tallentaa pisteet tauluun. Mutta miten seitsemästä yksittäisestä kortista päästään yhteen paikkaan taulukossa?

Ennen vastaukseni antamista voisi ehdottaa seitsemänulotteisen taulukon käyttöä, jonka koko on 52^7. Tällaisen taulukon tarvitsisi sisältää 1 028 071 702 528 kokonaislukua. En usko, että mikään pöytätietokone sallii näin paljon muistin allokointia. Ei, meidän täytyy jotenkin yhdistää 7 korttia kokonaislukuun 0 - 133 784 559. C++-kääntäjäni sallii tällaisen kokoiset taulukot valittamatta.

Ensin, anna jokaiselle kortille kokonaisluku väliltä 0–51. Voit tehdä tämän haluamallasi tavalla. Itse aloitan kakkosilla arvoina 0–3, kolmosilla 4–7 ja niin edelleen aina ässiin asti, jotka ovat arvoja 48–51. On tärkeää, että kun jaat kortin numeron 4:llä, jakojäännös antaa johdonmukaisesti saman maan. Esimerkiksi kaikilla hertoilla voi olla jakojäännös 0, välilyönneillä 1, ristillä 2 ja ruuduilla 3.

Funktioni kuvaa pienimmän korttijoukon 0, 1, 2, 3, 4, 5 ja 6 numeroon 0. Samoin suurin joukko 45, 46, 47, 48, 49, 50 ja 51 kuvataan maksimiarvoon 133 784 559.

Esimerkkinä tarkastellaan korttien sarjaa 5, 10, 15, 20, 25, 30, 35 ja määritetään, mihin kokonaislukuun tämä joukko tulisi kuvata.

Tarkastellaan ensin pienintä korttia numerolla 5. Voimme ohittaa useita yhdistelmiä, joissa on vähintään yksi kortti numeroilla 0–4. Pakassa jäljellä olevista 47 kortista voidaan valita 7 korttia seuraavasti: combin(47,7) = 62 891 499. Kuten aiemmin mainittiin, 52 kortin joukosta voidaan valita 7 korttia combin(52,7) = 133 784 560 tavalla. Voimme siis ohittaa 133 784 560 numeroa, joiden joukossa on 62 891 499 = 70 893 061 numeroa, joissa on vähintään yksi kortti väliltä 0–4.

Tarkastellaan seuraavaksi toista korttia, jonka arvo on 10. Voimme ohittaa useampia yhdistelmiä, joissa on mukana ainakin yksi kortti väliltä 6–9. Pakassa jäljellä olevien 42 kortin joukosta jäljellä olevien kuuden kortin valitsemiseen on combin(42,6) = 5 245 786 tapaa. Tämä on combin(46,6) = 9 366 819 mahdollista tapaa valita kuusi muuta korttia ensimmäisen kortin arvon 5 yläpuolella. Voimme siis ohittaa luvut 9 366 819 - 5 245 786 = 4 121 033 korttisarjalle, joissa on ainakin yksi arvo väliltä 6 ja 9.

Tarkastellaan seuraavaksi kolmatta korttia, jonka arvo on 15. Voimme ohittaa lisää yhdistelmiä, joissa on vähintään yksi kortti väliltä 11–14. Pakassa jäljellä olevien 37 kortin joukosta jäljellä olevien viiden kortin valitsemiseen on combin(37,5) = 435 897. Tämä on combin(41,5) = 749 398 mahdollista tapaa valita viisi muuta korttia, joiden arvo on toisen kortin arvo 10. Voimme siis ohittaa luvut 749 398 - 435 897 = 313 501 korttisarjoille, joissa on vähintään yksi arvo väliltä 11–14.

Tarkastellaan seuraavaksi neljättä korttia, jonka arvo on 20. Voimme ohittaa lisää yhdistelmiä, joissa on vähintään yksi kortti väliltä 16–19. Pakassa jäljellä olevien 32 kortin joukosta jäljellä olevien neljän kortin valitsemiseen on combin(32,4) = 35 960 tapaa. Tämä on combin(36,4) = 58 905 mahdollisesta tavasta valita neljä muuta korttia, joiden arvo on kolmannen kortin 15 yläpuolella. Voimme siis ohittaa luvut 58 905 - 35 960 = 22 945 korttisarjoille, joissa on vähintään yksi arvo väliltä 16 ja 19.

Tarkastellaan seuraavaksi viidettä korttia, jonka arvo on 25. Voimme ohittaa lisää yhdistelmiä, joissa on vähintään yksi kortti väliltä 21–24. Pakassa jäljellä olevien 27 kortin joukosta jäljellä olevien kolmen kortin valitsemiseen on combin(27,3) = 2 925 tapaa. Tämä on combin(31,3) = 4 495 mahdollisesta tavasta valita kolme muuta korttia, jotka ovat neljännen kortin arvon 20 yläpuolella. Voimme siis ohittaa luvun 4 495 - 2 925 = 1 570 korttisarjoille, jotka sisältävät vähintään yhden arvon väliltä 21 ja 24.

Tarkastellaan seuraavaksi kuudetta korttia, jonka arvo on 30. Voimme ohittaa lisää yhdistelmiä, joissa on vähintään yksi kortti väliltä 26–29. Pakassa jäljellä olevien 22 kortin joukosta jäljellä olevien kahden kortin valitsemiseen on combin(22,2) = 231 tapaa. Tämä on combin(26,3) = 325 mahdollista tapaa valita kaksi muuta korttia, jotka ovat viidennen kortin arvon 20 yläpuolella. Voimme siis ohittaa luvun 325 - 231 = 94 korttisarjoille, jotka sisältävät vähintään yhden arvon väliltä 26 ja 29.

Meillä on nyt enää yksi kortti jäljellä. Kuudennesta kortista lähtien sen täytyy olla suurempi kuin 30. Itse asiassa tiedämme, että se on 35. Joten voimme ohittaa neljä korttia numeroilla 31–34 seitsemännen kortin vuoksi.

Yhteensä olemme ohittaneet yli 70 893 061 + 4 121 033 + 313 501 + 22 945 + 1 570 + 94 + 4 = 75 352 208 korttia.

Koska aloitamme numeroinnin nollasta, kuten kaikki hyvät ohjelmoijat tekevät, voimme antaa numerojoukolle 5, 10, 15, 20, 25, 30, 35 arvon luvulle 75 352 208.

Tietenkin sama logiikka toimii minkä tahansa kokoiselle pakalle ja siitä valittaville korteille kuinka monta tahansa.

Ensi viikolla aion antaa teille ainakin alustavan raportin 8. huhtikuuta 2024 tapahtuvasta täydellisestä auringonpimennyksestä!