259 lines
5.1 KiB
Plaintext
259 lines
5.1 KiB
Plaintext
:: Hoon 201 - Week 1
|
|
:: ~bannum-magtus || s@p7.co.nz
|
|
::
|
|
:: im very sorry i messed up all my faces and i also dont know
|
|
:: how to make gates that make gates so this is messy code :(
|
|
:: dont leave your assignments until the last minute kids.
|
|
::
|
|
/+ playing-cards
|
|
:- %say
|
|
|= [[* eny=@uv *] *]
|
|
:- %noun
|
|
=<
|
|
%- rank-hands
|
|
%- score-hands
|
|
%- sort-hands
|
|
%- draw-hands
|
|
[%pregame 4]
|
|
!:
|
|
|%
|
|
+$ title
|
|
$% %royal-flush
|
|
%straight-flush
|
|
%four-of-a-kind
|
|
%full-house
|
|
%flush
|
|
%straight
|
|
%three-of-a-kind
|
|
%two-pair
|
|
%pair
|
|
%high-card
|
|
==
|
|
+$ card darc:playing-cards
|
|
+$ suit suit:playing-cards
|
|
+$ deck deck:playing-cards
|
|
+$ grouped (list (list card))
|
|
+$ unsorted (list card)
|
|
+$ sorted (list card)
|
|
+$ hands [g=grouped s=sorted u=unsorted]
|
|
+$ tiebreaker (list [v=@ s=@])
|
|
+$ draw-phase-state [h=(list unsorted) d=deck]
|
|
+$ sort-phase-state [h=(list hands) d=deck]
|
|
+$ score-phase-state [s=(list [r=@ t=title h=hands b=tiebreaker]) d=deck]
|
|
+$ rank-phase-state (list [r=@ t=title h=unsorted])
|
|
++ rank-hands
|
|
|= [%score st=score-phase-state]
|
|
^- [%ranking rank-phase-state]
|
|
=. s.st (sort s.st rank-sort)
|
|
[%ranking (flop (rank-display s.st))]
|
|
++ rank-display
|
|
|= i=(list [* t=title h=hands *])
|
|
^- (list [r=@ t=title h=unsorted])
|
|
=/ c=@ 1
|
|
=| l=(list [r=@ t=title h=unsorted])
|
|
|-
|
|
?~ i l
|
|
=/ s [c t.i.i u.h.i.i]
|
|
%= $
|
|
c .+(c)
|
|
l :-(s l)
|
|
i t.i
|
|
==
|
|
++ rank-sort
|
|
|= [a=[r=@ * * b=tiebreaker] b=[r=@ * * b=tiebreaker]]
|
|
^- ?
|
|
?. =(r.a r.b)
|
|
(gth r.a r.b)
|
|
(tb-comp b.a b.b)
|
|
++ tb-comp
|
|
|= [a=tiebreaker b=tiebreaker]
|
|
^- ?
|
|
?. =((lent a) (lent b))
|
|
!!
|
|
|-
|
|
?~ a %.y
|
|
?~ b %.n
|
|
?. =(v.i.a v.i.b)
|
|
(gth v.i.a v.i.b)
|
|
$(a t.a, b t.b)
|
|
++ draw-hands
|
|
|= [%pregame n=@]
|
|
=/ d=deck init-deck
|
|
=| h=(list unsorted)
|
|
^- [%draw draw-phase-state]
|
|
|-
|
|
?~ n [%draw [h d]]
|
|
=/ i (draw:playing-cards 5 d)
|
|
$(h :-(hand.i h), d rest.i, n (dec n))
|
|
++ sort-hands
|
|
|= [%draw st=draw-phase-state]
|
|
^- [%sort sort-phase-state]
|
|
[%sort [(turn h.st zip-sorted) d.st]]
|
|
++ card-sort
|
|
|= [a=card b=card]
|
|
^- ?
|
|
(gth val.a val.b)
|
|
++ sort-hand
|
|
|= u=unsorted
|
|
^- sorted
|
|
(sort u card-sort)
|
|
++ tuples
|
|
|= h=sorted
|
|
^- grouped
|
|
=| c=(list card)
|
|
=| l=(list (list card))
|
|
|-
|
|
?~ h :-(c l)
|
|
?~ c
|
|
%= $
|
|
c [i.h ~]
|
|
h t.h
|
|
==
|
|
?: =(val.i.c val.i.h)
|
|
%= $
|
|
c :-(i.h c)
|
|
h t.h
|
|
==
|
|
%= $
|
|
c ~
|
|
l :-(c l)
|
|
==
|
|
++ zip-sorted
|
|
|= u=unsorted
|
|
^- hands
|
|
=/ sh (sort-hand u)
|
|
=/ gh (tuples sh)
|
|
[gh sh u]
|
|
++ score-hands
|
|
|= [%sort st=sort-phase-state]
|
|
^- [%score score-phase-state]
|
|
[%score (turn h.st con-tb) d.st]
|
|
++ init-deck
|
|
(shuffle-deck:playing-cards make-deck:playing-cards eny)
|
|
++ suit-to-num
|
|
|= c=darc:playing-cards
|
|
^- @
|
|
?- sut.c
|
|
%spades 4
|
|
%hearts 3
|
|
%diamonds 2
|
|
%clubs 1
|
|
==
|
|
++ get-title
|
|
|= h=hands
|
|
^- [t=title r=@]
|
|
?: (is-royal-flush h) [%royal-flush 9]
|
|
?: (is-straight-flush h) [%straight-flush 8]
|
|
?: (is-four-of-a-kind h) [%four-of-a-kind 7]
|
|
?: (is-full-house h) [%full-house 6]
|
|
?: (is-flush h) [%flush 5]
|
|
?: (is-straight h) [%straight 4]
|
|
?: (is-three-of-a-kind h) [%three-of-a-kind 3]
|
|
?: (is-two-pair h) [%two-pair 2]
|
|
?: (is-pair h) [%pair 1]
|
|
[%high-card 0]
|
|
++ is-flush
|
|
|= [* h=sorted *]
|
|
^- ?
|
|
=| s=?(~ suit)
|
|
|-
|
|
?~ h %.y
|
|
?~ s
|
|
$(h t.h, s sut.i.h)
|
|
?. =(s sut.i.h)
|
|
%.n
|
|
$(h t.h)
|
|
++ is-straight
|
|
|= [* h=sorted *]
|
|
^- ?
|
|
=| l=?(~ @)
|
|
|-
|
|
?~ h %.y
|
|
?~ l
|
|
$(h t.h, l val.i.h)
|
|
?. =(.+(l) val.i.h)
|
|
%.n
|
|
$(l val.i.h, h t.h)
|
|
++ high-card
|
|
|= [* h=sorted *]
|
|
^- card
|
|
?~ h !!
|
|
i.h
|
|
++ is-royal-flush
|
|
|= i=[* h=sorted *]
|
|
^- ?
|
|
?& (is-straight-flush i)
|
|
=(13 val:(high-card i))
|
|
==
|
|
++ is-straight-flush
|
|
|= i=[* h=sorted *]
|
|
^- ?
|
|
?& (is-straight i)
|
|
(is-flush i)
|
|
==
|
|
++ one-of
|
|
|= [n=@ [g=grouped * *]]
|
|
^- @
|
|
=| t=@
|
|
|-
|
|
?~ g t
|
|
?: =(n (lent i.g))
|
|
$(g t.g, t .+(t))
|
|
$(g t.g)
|
|
++ is-four-of-a-kind
|
|
|= i=[g=grouped * *]
|
|
^- ?
|
|
=(1 (one-of 4 i))
|
|
++ is-full-house
|
|
|= i=[g=grouped * *]
|
|
^- ?
|
|
?& =(1 (one-of 3 i))
|
|
=(1 (one-of 2 i))
|
|
==
|
|
++ is-three-of-a-kind
|
|
|= i=[g=grouped * *]
|
|
^- ?
|
|
=(1 (one-of 3 i))
|
|
++ is-two-pair
|
|
|= i=[g=grouped * *]
|
|
^- ?
|
|
=(2 (one-of 2 i))
|
|
++ is-pair
|
|
|= i=[g=grouped * *]
|
|
^- ?
|
|
=(1 (one-of 2 i))
|
|
++ con-tb
|
|
|= fh=hands
|
|
=/ o=[t=title r=@] (get-title fh)
|
|
[r.o t.o fh (get-tiebreaker fh)]
|
|
++ get-tiebreaker
|
|
|= [g=grouped * *]
|
|
^- tiebreaker
|
|
=. g (sort g tuple-sort)
|
|
(turn g tuple-tb)
|
|
++ tuple-tb
|
|
|= l=(list card)
|
|
^- [v=@ s=@]
|
|
=| sv=@
|
|
=| vv=@
|
|
|-
|
|
?~ l [vv sv]
|
|
=. vv val.i.l
|
|
?. (gth (suit-to-num i.l) sv)
|
|
$(l t.l)
|
|
$(l t.l, sv (suit-to-num i.l))
|
|
++ tuple-sort
|
|
|= [a=(list card) b=(list card)]
|
|
^- ?
|
|
=/ la (lent a)
|
|
=/ lb (lent b)
|
|
?. =(la lb)
|
|
(gth la lb)
|
|
?~ a !!
|
|
?~ b !!
|
|
?: =(val.i.a val.i.b)
|
|
(gth (suit-to-num i.a) (suit-to-num i.b))
|
|
(gth val.i.a val.i.b)
|
|
--
|
|
|