Tic-tac-toe: Difference between revisions
m
→{{header|J}}: place sample output before exposition
(→{{header|J}}: shorten code; prefer separate explanation over comments) |
m (→{{header|J}}: place sample output before exposition) |
||
Line 6,698:
</syntaxhighlight>
This version is stateless, purely functional, and tacit. CPU selects a random open position. The <code>turn</code> and <code>board</code> verbs extract the turn/board from the state vector. The board is represented by a vector of -1's, 0’s and 1’s, which index into the character vector '.XO' when it’s time to display the board. ▼
Output:
Encoding data with numbers this way allows the convenience of e.g. being able to simply check whether the absolute value of the sum across a given line is 3, indicating a win. ▼
<pre> ▼
▲<pre>
]M=: 0 1 _1{~?3 3$3▼
0 _1 _1▼
_1 1 1▼
_1 1 0▼
M{'.XO'▼
.OO▼
OXX▼
OX.▼
</pre>▼
The verb <code>open</code> tests whether the selected position is available on the board. Fold (<code>F.</code>) is used because <code>Until=:<tt>{{</tt>u^:(-.@:v)^:_<tt>}}</tt></code> would've quit upon receiving invalid input, as the argument would be unchanged between that iteration and the next. ▼
▲<pre> ttt 0
enter a move (1–9) each turn; you're X's
1 2 3
Line 6,774 ⟶ 6,759:
X wins
</pre>
▲This version is stateless, purely functional, and tacit. CPU selects a random open position. The <code>turn</code> and <code>board</code> verbs extract the turn/board from the state vector. The board is represented by a vector of -1's, 0’s and 1’s, which index into the character vector '.XO' when it’s time to display the board.
▲Encoding data with numbers this way allows the convenience of e.g. being able to simply check whether the absolute value of the sum across a given line is 3, indicating a win.
<pre>
▲ ]M=: 0 1 _1{~?3 3$3
▲ 0 _1 _1
▲_1 1 1
▲_1 1 0
▲ M{'.XO'
▲.OO
▲OXX
▲OX.
▲</pre>
▲The verb <code>open</code> tests whether the selected position is available on the board. Fold (<code>F.</code>) is used because <code>Until=:<tt>{{</tt>u^:(-.@:v)^:_<tt>}}</tt></code> would've quit upon receiving invalid input, as the argument would be unchanged between that iteration and the next.
=={{header|Java}}==
|