Slide 1

Slide 1 text

Pattern Matching Wojtek Mach

Slide 2

Slide 2 text

Card „Ace of Spades”

Slide 3

Slide 3 text

Card "As" „Ace of Spades”

Slide 4

Slide 4 text

Card "A♠" „Ace of Spades”

Slide 5

Slide 5 text

Card { :A, :s } „Ace of Spades”

Slide 6

Slide 6 text

Card { rank, suit } „Ace of Spades”

Slide 7

Slide 7 text

Hand { {:A,:s}, {:A,:h}, {6,:s}, {6,:d}, {2,:c} } „Aces and Sixes”

Slide 8

Slide 8 text

Ranks •Straight Flush •Four of a Kind •Full House •Flush •Straight •Three of a Kind •Two Pairs •One Pair •High Card

Slide 9

Slide 9 text

Conditionals Card = Struct.new :rank, :suit def rank(hand) if hand[0].rank == hand[1].rank && hand[0].rank == hand[2].rank && hand[0].rank == hand[3].rank :four_of_a_kind elsif hand[0].rank == hand[1].rank && hand[0].rank == hand[2].rank && hand[3].rank == hand[4].rank :full_house # ... end end

Slide 10

Slide 10 text

OOP! Card = Struct.new :rank, :suit class Hand def four_of_a_kind? cards[0].rank == cards[1].rank && cards[0].rank == cards[2].rank && cards[0].rank == cards[3].rank end def full_house? # ... end # ... end

Slide 11

Slide 11 text

Pattern matching case value do pattern1 -> result1 pattern2 -> result2 # ... end

Slide 12

Slide 12 text

Pattern matching case hand do { card1, card2, card3, card4, card5 } -> rank1 { card1, card2, card3, card4, card5 } -> rank2 # ... end

Slide 13

Slide 13 text

Pattern matching case hand do { card1, card2, _ , _ , card5 } -> rank1 { card1, card2, _ , _ , card5 } -> rank2 # ... end

Slide 14

Slide 14 text

Pattern matching case hand do { {r1,s1}, {r2,s2}, _ , _ , {r5,s5} } -> rank1 { {r1,s1}, {r2,s2}, _ , _ , {r5,s5} } -> rank2 # ... end

Slide 15

Slide 15 text

Pattern matching case hand do { {a,_}, {a,_}, {a,_}, {a,_}, _ } -> :four_of_a_kind end

Slide 16

Slide 16 text

Pattern matching case hand do { {a,_}, {a,_}, {a,_}, {a,_}, _ } -> :four_of_a_kind { {a,_}, {a,_}, {a,_}, {b,_}, {b,_} } -> :full_house end

Slide 17

Slide 17 text

Pattern matching case hand do { {a,_}, {a,_}, {a,_}, {a,_}, _ } -> :four_of_a_kind { {a,_}, {a,_}, {a,_}, {b,_}, {b,_} } -> :full_house { {_,a}, {_,a}, {_,a}, {_,a}, {_,a} } -> :flush end

Slide 18

Slide 18 text

Pattern matching case hand do { {a,_}, {a,_}, {a,_}, {a,_}, _ } -> {:four_of_a_kind, a} { {a,_}, {a,_}, {a,_}, {b,_}, {b,_} } -> {:full_house, a, b} { {_,a}, {_,a}, {_,a}, {_,a}, {_,a} } -> {:flush} end

Slide 19

Slide 19 text

Pattern matching case hand do { {a,_}, {a,_}, {a,_}, {a,_}, _ } -> {:four_of_a_kind, a} { {a,_}, {a,_}, {a,_}, {b,_}, {b,_} } -> {:full_house, a, b} { {_,a}, {_,a}, {_,a}, {_,a}, {_,a} } -> {:flush} # straights are tricky! end

Slide 20

Slide 20 text

Thanks! @wojtekmach @wojtekmach