Skip to content

Commit

Permalink
perf: scan only single diag lines if win counts == grid size
Browse files Browse the repository at this point in the history
  • Loading branch information
mrdcvlsc committed Sep 7, 2023
1 parent c1ceb62 commit cf5576d
Showing 1 changed file with 84 additions and 45 deletions.
129 changes: 84 additions & 45 deletions lib/TicTacToe.js
Original file line number Diff line number Diff line change
Expand Up @@ -218,13 +218,15 @@ class TicTacToe {
}
}

// check diag \
for (let i = 1; i < this.grid; ++i) {
let samePiece = 1,
prevPiece = null;
for (let j = 0; j < i + 1; ++j) {
const CURRENT_INDEX = this.grid - i + (this.grid + 1) * j - 1;
if (prevPiece === this.board[CURRENT_INDEX] && this.board[CURRENT_INDEX] !== NA) {
if (this.pieceWinCount == this.grid) {
// scans only the longest diagonals
let samePiece = 1;
for (let i = 0; i < this.grid - 1; ++i) {
const CURRENT_INDEX = i * this.grid + i;
if (
this.board[CURRENT_INDEX] !== NA &&
this.board[CURRENT_INDEX] === this.board[(i + 1) * this.grid + (i + 1)]
) {
samePiece++;
if (samePiece === this.pieceWinCount) {
this.winner = this.board[CURRENT_INDEX];
Expand All @@ -233,16 +235,15 @@ class TicTacToe {
} else {
samePiece = 1;
}
prevPiece = this.board[CURRENT_INDEX];
}
}

for (let i = 1; i < this.grid - 1; ++i) {
let samePiece = 1,
prevPiece = null;
for (let j = 0; this.grid - i - j > 0; ++j) {
const CURRENT_INDEX = i * this.grid + (this.grid + 1) * j;
if (prevPiece === this.board[CURRENT_INDEX] && this.board[CURRENT_INDEX] !== NA) {
samePiece = 1;
for (let i = this.grid - 1; i > 0; --i) {
const CURRENT_INDEX = i * this.grid + (this.grid - 1 - i);
if (
this.board[CURRENT_INDEX] !== NA &&
this.board[CURRENT_INDEX] === this.board[(i - 1) * this.grid + (this.grid - i)]
) {
samePiece++;
if (samePiece === this.pieceWinCount) {
this.winner = this.board[CURRENT_INDEX];
Expand All @@ -251,44 +252,82 @@ class TicTacToe {
} else {
samePiece = 1;
}
prevPiece = this.board[CURRENT_INDEX];
}
}
} else {
// scan all diagonals

// check diag \
for (let i = 1; i < this.grid; ++i) {
let samePiece = 1,
prevPiece = null;
for (let j = 0; j < i + 1; ++j) {
const CURRENT_INDEX = this.grid - i + (this.grid + 1) * j - 1;
if (prevPiece === this.board[CURRENT_INDEX] && this.board[CURRENT_INDEX] !== NA) {
samePiece++;
if (samePiece === this.pieceWinCount) {
this.winner = this.board[CURRENT_INDEX];
return this.board[CURRENT_INDEX];
}
} else {
samePiece = 1;
}
prevPiece = this.board[CURRENT_INDEX];
}
}

// check diag /
for (let i = 1; i < this.grid; ++i) {
let samePiece = 1,
prevPiece = null;
for (let j = 0; j < i + 1; ++j) {
const CURRENT_INDEX = i + j * this.grid - j;
if (prevPiece === this.board[CURRENT_INDEX] && this.board[CURRENT_INDEX] !== NA) {
samePiece++;
if (samePiece === this.pieceWinCount) {
this.winner = this.board[CURRENT_INDEX];
return this.board[CURRENT_INDEX];
for (let i = 1; i < this.grid - 1; ++i) {
let samePiece = 1,
prevPiece = null;
for (let j = 0; this.grid - i - j > 0; ++j) {
const CURRENT_INDEX = i * this.grid + (this.grid + 1) * j;
if (prevPiece === this.board[CURRENT_INDEX] && this.board[CURRENT_INDEX] !== NA) {
samePiece++;
if (samePiece === this.pieceWinCount) {
this.winner = this.board[CURRENT_INDEX];
return this.board[CURRENT_INDEX];
}
} else {
samePiece = 1;
}
} else {
samePiece = 1;
prevPiece = this.board[CURRENT_INDEX];
}
prevPiece = this.board[CURRENT_INDEX];
}
}

for (let i = 1; i < this.grid - 1; ++i) {
let samePiece = 1,
prevPiece = null;
for (let j = 0; this.grid - i - j > 0; ++j) {
const CURRENT_INDEX = this.grid * (i + 1) - 1 + (this.grid - 1) * j;
if (prevPiece === this.board[CURRENT_INDEX] && this.board[CURRENT_INDEX] !== NA) {
samePiece++;
if (samePiece === this.pieceWinCount) {
this.winner = this.board[CURRENT_INDEX];
return this.board[CURRENT_INDEX];
// check diag /
for (let i = 1; i < this.grid; ++i) {
let samePiece = 1,
prevPiece = null;
for (let j = 0; j < i + 1; ++j) {
const CURRENT_INDEX = i + j * this.grid - j;
if (prevPiece === this.board[CURRENT_INDEX] && this.board[CURRENT_INDEX] !== NA) {
samePiece++;
if (samePiece === this.pieceWinCount) {
this.winner = this.board[CURRENT_INDEX];
return this.board[CURRENT_INDEX];
}
} else {
samePiece = 1;
}
} else {
samePiece = 1;
prevPiece = this.board[CURRENT_INDEX];
}
}

for (let i = 1; i < this.grid - 1; ++i) {
let samePiece = 1,
prevPiece = null;
for (let j = 0; this.grid - i - j > 0; ++j) {
const CURRENT_INDEX = this.grid * (i + 1) - 1 + (this.grid - 1) * j;
if (prevPiece === this.board[CURRENT_INDEX] && this.board[CURRENT_INDEX] !== NA) {
samePiece++;
if (samePiece === this.pieceWinCount) {
this.winner = this.board[CURRENT_INDEX];
return this.board[CURRENT_INDEX];
}
} else {
samePiece = 1;
}
prevPiece = this.board[CURRENT_INDEX];
}
prevPiece = this.board[CURRENT_INDEX];
}
}

Expand Down

0 comments on commit cf5576d

Please sign in to comment.