-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQ_030_150xp_rock_paper_scissors.nim
More file actions
120 lines (88 loc) · 2.09 KB
/
Q_030_150xp_rock_paper_scissors.nim
File metadata and controls
120 lines (88 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import sequtils
import random
# first run: nimble install fusion
import fusion/matching
{.experimental: "caseStmtMacros".}
type
Choice = enum
rock, paper, scissors
proc poorMansPatternMatching() =
echo "string case as pattern matching workaround"
var p1Wins = 0
var p2Wins = 0
var draws = 0
let choices = Choice.toSeq
for i in 1 .. 10:
let p1 = choices.sample
let p2 = choices.sample
echo "p1: ", p1, "; p2: ", p2
if p1 == p2:
draws.inc
else:
case $p1 & $p2:
of $rock & $scissors, $scissors & $paper, $paper & $rock:
p1Wins.inc
else:
p2Wins.inc
echo "Round ", i, ": p1:p2 = ", p1Wins, ":", p2Wins, "; Draws: ", draws
proc useOutcomeLookUpTable() =
echo "Look up table"
type Outcome = enum
win, lose, draw
let outcomes: array[Choice, array[Choice, Outcome]] = [
rock: [
rock: draw,
paper: lose,
scissors: win,
],
paper: [
rock: win,
paper: draw,
scissors: lose,
],
scissors: [
rock: lose,
paper: win,
scissors: draw,
],
]
var p1Wins = 0
var p2Wins = 0
var draws = 0
let choices = Choice.toSeq
for i in 1 .. 10:
let p1 = choices.sample
let p2 = choices.sample
echo "p1: ", p1, "; p2: ", p2
case outcomes[p1][p2]:
of win:
p1Wins.inc
of lose:
p2Wins.inc
of draw:
draws.inc
echo "Round ", i, ": p1:p2 = ", p1Wins, ":", p2Wins, "; Draws: ", draws
proc experimentalPatternMatching() =
echo "Experimental pattern matching"
var p1Wins = 0
var p2Wins = 0
var draws = 0
let choices = Choice.toSeq
for i in 1 .. 10:
let p1 = choices.sample
let p2 = choices.sample
echo "p1: ", p1, "; p2: ", p2
if p1 == p2:
draws.inc
else:
case (p1, p2):
of (rock, scissors), (scissors, paper), (paper, rock):
p1Wins.inc
else:
p2Wins.inc
echo "Round ", i, ": p1:p2 = ", p1Wins, ":", p2Wins, "; Draws: ", draws
when isMainModule:
randomize()
poorMansPatternMatching()
useOutcomeLookUpTable()
experimentalPatternMatching()