Skip to content

Commit e54ae71

Browse files
Add state-of-tic-tac-toe exercise
1 parent d8347c2 commit e54ae71

File tree

7 files changed

+561
-0
lines changed

7 files changed

+561
-0
lines changed

config.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,14 @@
655655
"prerequisites": [],
656656
"difficulty": 5
657657
},
658+
{
659+
"slug": "state-of-tic-tac-toe",
660+
"name": "State of Tic-Tac-Toe",
661+
"uuid": "fc70e5b9-6861-437e-81ac-d4334bde3bfc",
662+
"practices": [],
663+
"prerequisites": [],
664+
"difficulty": 5
665+
},
658666
{
659667
"slug": "two-bucket",
660668
"name": "Two Bucket",
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# Instructions
2+
3+
In this exercise, you're going to implement a program that determines the state of a [tic-tac-toe][] game.
4+
(_You may also know the game as "noughts and crosses" or "Xs and Os"._)
5+
6+
The games is played on a 3×3 grid.
7+
Players take turns to place `X`s and `O`s on the grid.
8+
The game ends when one player has won by placing three of marks in a row, column, or along a diagonal of the grid, or when the entire grid is filled up.
9+
10+
In this exercise, we will assume that `X` starts.
11+
12+
It's your job to determine which state a given game is in.
13+
14+
There are 3 potential game states:
15+
16+
- The game is **ongoing**.
17+
- The game ended in a **draw**.
18+
- The game ended in a **win**.
19+
20+
If the given board is invalid, throw an appropriate error.
21+
22+
If a board meets the following conditions, it is invalid:
23+
24+
- The given board cannot be reached when turns are taken in the correct order (remember that `X` starts).
25+
- The game was played after it already ended.
26+
27+
## Examples
28+
29+
### Ongoing game
30+
31+
```text
32+
| |
33+
X | |
34+
___|___|___
35+
| |
36+
| X | O
37+
___|___|___
38+
| |
39+
O | X |
40+
| |
41+
```
42+
43+
### Draw
44+
45+
```text
46+
| |
47+
X | O | X
48+
___|___|___
49+
| |
50+
X | X | O
51+
___|___|___
52+
| |
53+
O | X | O
54+
| |
55+
```
56+
57+
### Win
58+
59+
```text
60+
| |
61+
X | X | X
62+
___|___|___
63+
| |
64+
| O | O
65+
___|___|___
66+
| |
67+
| |
68+
| |
69+
```
70+
71+
### Invalid
72+
73+
#### Wrong turn order
74+
75+
```text
76+
| |
77+
O | O | X
78+
___|___|___
79+
| |
80+
| |
81+
___|___|___
82+
| |
83+
| |
84+
| |
85+
```
86+
87+
#### Continued playing after win
88+
89+
```text
90+
| |
91+
X | X | X
92+
___|___|___
93+
| |
94+
O | O | O
95+
___|___|___
96+
| |
97+
| |
98+
| |
99+
```
100+
101+
[tic-tac-toe]: https://en.wikipedia.org/wiki/Tic-tac-toe
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"authors": [
3+
"keiravillekode"
4+
],
5+
"files": {
6+
"solution": [
7+
"state-of-tic-tac-toe.v"
8+
],
9+
"test": [
10+
"run_test.v"
11+
],
12+
"example": [
13+
".meta/example.v"
14+
]
15+
},
16+
"blurb": "Determine the game state of a match of Tic-Tac-Toe.",
17+
"source": "Created by Sascha Mann for the Julia track of the Exercism Research Experiment.",
18+
"source_url": "https://github.com/exercism/research_experiment_1/tree/julia-dev/exercises/julia-1-a"
19+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
module main
2+
3+
enum State as u8 {
4+
ongoing
5+
draw
6+
win
7+
}
8+
9+
fn gamestate(board []string) !State {
10+
mut count_x := 0
11+
mut count_o := 0
12+
mut bitset_x := 0
13+
mut bitset_o := 0
14+
for row in 0 .. 3 {
15+
for column in 0 .. 3 {
16+
if board[row][column] == `X` {
17+
count_x++
18+
bitset_x |= 1 << (4 * row + column)
19+
}
20+
21+
if board[row][column] == `O` {
22+
count_o++
23+
bitset_o |= 1 << (4 * row + column)
24+
}
25+
}
26+
}
27+
28+
if count_o > count_x {
29+
return error('Wrong turn order: O started')
30+
}
31+
32+
if count_x > count_o + 1 {
33+
return error('Wrong turn order: X went twice')
34+
}
35+
36+
mut win_x := false
37+
mut win_o := false
38+
39+
lines := [
40+
0x007,
41+
0x070,
42+
0x700,
43+
0x111,
44+
0x222,
45+
0x444,
46+
0x124,
47+
0x421,
48+
]
49+
50+
for line in lines {
51+
if (bitset_x & line) == line {
52+
win_x = true
53+
}
54+
55+
if (bitset_o & line) == line {
56+
win_o = true
57+
}
58+
}
59+
60+
if win_x || win_o {
61+
if win_x && win_o {
62+
return error('Impossible board: game should have ended after the game was won')
63+
}
64+
65+
return .win
66+
}
67+
68+
return if count_x + count_o == 9 { .draw } else { .ongoing }
69+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# This is an auto-generated file. Regular comments will be removed when this
2+
# file is regenerated. Regenerating will not touch any manually added keys,
3+
# so comments can be added in a "comment" key.
4+
5+
[fe8e9fa9-37af-4d7e-aa24-2f4b8517161a]
6+
description = "Won games -> Finished game where X won via left column victory"
7+
8+
[96c30df5-ae23-4cf6-bf09-5ef056dddea1]
9+
description = "Won games -> Finished game where X won via middle column victory"
10+
11+
[0d7a4b0a-2afd-4a75-8389-5fb88ab05eda]
12+
description = "Won games -> Finished game where X won via right column victory"
13+
14+
[bd1007c0-ec5d-4c60-bb9f-1a4f22177d51]
15+
description = "Won games -> Finished game where O won via left column victory"
16+
17+
[c032f800-5735-4354-b1b9-46f14d4ee955]
18+
description = "Won games -> Finished game where O won via middle column victory"
19+
20+
[662c8902-c94a-4c4c-9d9c-e8ca513db2b4]
21+
description = "Won games -> Finished game where O won via right column victory"
22+
23+
[2d62121f-7e3a-44a0-9032-0d73e3494941]
24+
description = "Won games -> Finished game where X won via top row victory"
25+
26+
[108a5e82-cc61-409f-aece-d7a18c1beceb]
27+
description = "Won games -> Finished game where X won via middle row victory"
28+
include = false
29+
30+
[346527db-4db9-4a96-b262-d7023dc022b0]
31+
description = "Won games -> Finished game where X won via middle row victory"
32+
reimplements = "108a5e82-cc61-409f-aece-d7a18c1beceb"
33+
34+
[a013c583-75f8-4ab2-8d68-57688ff04574]
35+
description = "Won games -> Finished game where X won via bottom row victory"
36+
37+
[2c08e7d7-7d00-487f-9442-e7398c8f1727]
38+
description = "Won games -> Finished game where O won via top row victory"
39+
40+
[bb1d6c62-3e3f-4d1a-9766-f8803c8ed70f]
41+
description = "Won games -> Finished game where O won via middle row victory"
42+
43+
[6ef641e9-12ec-44f5-a21c-660ea93907af]
44+
description = "Won games -> Finished game where O won via bottom row victory"
45+
46+
[ab145b7b-26a7-426c-ab71-bf418cd07f81]
47+
description = "Won games -> Finished game where X won via falling diagonal victory"
48+
49+
[7450caab-08f5-4f03-a74b-99b98c4b7a4b]
50+
description = "Won games -> Finished game where X won via rising diagonal victory"
51+
52+
[c2a652ee-2f93-48aa-a710-a70cd2edce61]
53+
description = "Won games -> Finished game where O won via falling diagonal victory"
54+
55+
[5b20ceea-494d-4f0c-a986-b99efc163bcf]
56+
description = "Won games -> Finished game where O won via rising diagonal victory"
57+
58+
[035a49b9-dc35-47d3-9d7c-de197161b9d4]
59+
description = "Won games -> Finished game where X won via a row and a column victory"
60+
61+
[e5dfdeb0-d2bf-4b5a-b307-e673f69d4a53]
62+
description = "Won games -> Finished game where X won via two diagonal victories"
63+
64+
[b42ed767-194c-4364-b36e-efbfb3de8788]
65+
description = "Drawn games -> Draw"
66+
67+
[227a76b2-0fef-4e16-a4bd-8f9d7e4c3b13]
68+
description = "Drawn games -> Another draw"
69+
70+
[4d93f15c-0c40-43d6-b966-418b040012a9]
71+
description = "Ongoing games -> Ongoing game: one move in"
72+
73+
[c407ae32-4c44-4989-b124-2890cf531f19]
74+
description = "Ongoing games -> Ongoing game: two moves in"
75+
76+
[199b7a8d-e2b6-4526-a85e-78b416e7a8a9]
77+
description = "Ongoing games -> Ongoing game: five moves in"
78+
79+
[1670145b-1e3d-4269-a7eb-53cd327b302e]
80+
description = "Invalid boards -> Invalid board: X went twice"
81+
82+
[47c048e8-b404-4bcf-9e51-8acbb3253f3b]
83+
description = "Invalid boards -> Invalid board: O started"
84+
85+
[b1dc8b13-46c4-47db-a96d-aa90eedc4e8d]
86+
description = "Invalid boards -> Invalid board"
87+
include = false
88+
89+
[6c1920f2-ab5c-4648-a0c9-997414dda5eb]
90+
description = "Invalid boards -> Invalid board: X won and O kept playing"
91+
reimplements = "b1dc8b13-46c4-47db-a96d-aa90eedc4e8d"
92+
93+
[4801cda2-f5b7-4c36-8317-3cdd167ac22c]
94+
description = "Invalid boards -> Invalid board: players kept playing after a win"

0 commit comments

Comments
 (0)