マルバツゲームの審判をするプログラムを作る。
機械ちゃんなんでもやってくれやーと。
3つの文字列要素からなる配列を引数として渡されて、3種の勝利パターンいずれかが存在するかを確認し、勝敗の決しないものには不名誉の"D"を渡す。
自分の回答
function xoReferee(data) {
let winner = "";
data[0] = data[0].split('');
data[1] = data[1].split('');
data[2] = data[2].split('');
for (let i = 0; i < 3; i++) {
//checking horizontally
if (data[i][0] == data[i][1] && data[i][1] == data[i][2]) {
winner = data[i][0];
}
//checking vertically
else if (data[0][i] == data[1][i] && data[1][i] == data[2][i]) {
winner = data[0][i];
}
//checking diagnolly
else if (data[0][0] == data[1][1] && data[1][1] == data[2][2]) {
winner = data[0][0];
} else if (data[0][2] == data[1][1] && data[1][1] == data[2][0]) {
winner = data[0][2];
}
}
if (winner != "X" && winner != "O") {
winner = "D";
}
return winner;
}
論理演算子も使ってちょっとだけ簡潔にできた。
盤面が拡大すれば無用の長物と化す。holy shit!!
すごいとおもったかいとう
function checkio(data) {
var chars = data.map(function (a) {return a.split('')});
for(var i=0; i<3; i++){
data.push(chars[0][i] + chars[1][i] + chars[2][i]);
}
data.push(chars[0][0] + chars[1][1] + chars[2][2]);
data.push(chars[2][0] + chars[1][1] + chars[0][2]);
if (data.indexOf("XXX") + 1) {
return "X"
}
if (data.indexOf("OOO") + 1) {
return "O"
}
return "D"
}
ンンンンなるほど。
勝利パターンのフォーミュラを一つの配列に全て盛り込み、X、Oそれぞれの連続した文字列(勝利パターン)がその中にあるかをindexで確認する。
+1しているのは0番目のインデックスのため。
学び
・map()関数
配列クラスのメソッド。引数に与えた関数を配列の要素全てに呼び出して新しい配列を返す。
var numbers = [1, 4, 9]; var roots = numbers.map(Math.sqrt);
例えばこう呼び出せばnumbersの内容は保持しつつ、rootsに平方根バージョンの配列を作り出す。
これをfor文で書くと、
var numbers = [1,4,9];
var roots = [];
for (let i of numbers) {
roots.push(Math.sqrt(i));
}
なるほど簡潔。関数をもっとしっかり書きたいときに便利そう。
反省
もっと早く回答できるようにしよう。
あと2層のifで勝利パターンを確認していた時なぜかうまく行かないことがあったので、if文の動きを確認する。