The weekly challenge 335 - Task 2: Find Winner
1 #!/usr/bin/env perl
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 use v5.36;
85
86 find_winner([0,0],[2,0],[1,1],[2,1],[2,2]);
87 find_winner([0,0],[1,0],[1,1],[2,1],[2,2]);
88 find_winner([0,0],[1,1],[0,1],[0,2],[1,0],[2,0]);
89 find_winner([0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2],[2,2]);
90 find_winner([0,0],[1,1]);
91 find_winner([1,1],[0,0],[2,2],[0,1],[1,0],[0,2]);
92
93
94 sub find_winner( @moves ) {
95 say "Input: (" . join(", ", map {"[$_->[0],$_->[1]]"} @moves) . ")";
96 my $board = [ ["_", "_", "_"], ["_", "_", "_"], ["_", "_", "_"] ];
97 my $next = "A";
98 foreach my $move (@moves) {
99 $board->[$move->[0]]->[$move->[1]] = $next;
100 $next = $next eq "A" ? "B" : "A";
101 }
102 my $winner = "Pending";
103 my $is_filled = 1;
104 foreach my $x (0..2) {
105 foreach my $y (0..2) {
106 $is_filled = 0 if $board->[$x]->[$y] eq "_";
107 }
108 }
109
110 foreach my $x (0..2) {
111 if($board->[$x]->[0] eq $board->[$x]->[1] && $board->[$x]->[1] eq $board->[$x]->[2] && $board->[$x]->[0] ne "_") {
112 return say "Output: $board->[$x]->[0]";
113 }
114 }
115
116 foreach my $y (0..2) {
117 if($board->[0]->[$y] eq $board->[1]->[$y] && $board->[1]->[$y] eq $board->[2]->[$y] && $board->[0]->[$y] ne "_") {
118 return say "Output: $board->[0]->[$y]";
119 }
120 }
121
122 if($board->[0]->[0] eq $board->[1]->[1] && $board->[1]->[1] eq $board->[2]->[2] && $board->[1]->[1] ne "_") {
123 return say "Output: $board->[0]->[0]";
124 }
125 if($board->[2]->[0] eq $board->[1]->[1] && $board->[1]->[1] eq $board->[0]->[2] && $board->[1]->[1] ne "_") {
126 return say "Output: $board->[2]->[0]";
127 }
128 if($is_filled) {
129 $winner = "Draw";
130 }
131 say "Output: $winner";
132 }