Регулярное выражение просматривает 11 символов, потому что board
объединено с двумя дополнительными -
символами:
board = board.join('-')
Предположительно, исходный board
является двумерным массивом, а запятые, введенные этим объединением (поскольку вложенные массивы в процессе сортируются), удаляются с помощью:
.replace(/,/g,'');
Итак, оригинальная доска вот так:
[
[1, 0, 1],
[2, 2, 0],
[0, 0, 0]
]
... превращается в строку с .join("-")
:
"1,0,1-2,2,0-0,0,0"
... и, наконец, очищены от запятых:
"101-220-000".
Дополнительный разделитель облегчает поиск некоторых шаблонов, не вызывая ложных срабатываний. Например, когда есть совпадение с 222
, можно быть уверенным, что они будут в одном ряду, а совпадение с 1..1..1
также обнаружит три возможных вертикальных 3-в-ряда без ложных срабатываний как совпадение может начинаться только с позиции 0, 1 или 2. Длина 1....1....1
составляет 11 символов и может совпадать только с позицией 0 для одной из диагоналей. Наконец, 1..1..1
также может совпадать только в одной позиции, то есть в позиции 2, так как в противном случае один из дефисов будет конфликтовать с 1
в шаблоне. Совпадение представляет противоположную диагональ.
Дальнейшее улучшение
Можно объединить два регулярных выражения в одно (сэкономив некоторое время выполнения), используя обратную ссылку, и использовать некоторую логику, чтобы объединить все возможности в одном выражении:
function isSolved(board) {
board = board.join('-').replace(/,/g,'');
var match = board.search(/([12])(\1|...\1...|....\1....|..\1..)\1/);
return +(board[match] || board.includes("0") && -1);
}