Некоторое время назад я для развлечения создал небольшое веб-приложение для карточных игр.Плеер играет против компьютера и в основном работает нормально.Иногда, хотя компьютерный игрок зацикливается, смысл игры в том, чтобы потерять все свои карты, и если у вас нет карты для игры, вы берете колоду.Иногда компьютер играет x, y, z, берет кучу, играет x, yz, берет кучу и т.д.
Я отслеживаю шаги, которые я сделал, поэтому в любой момент у меня есть массив, которыйвыглядит примерно так: [C2, D5, H2, S4, C5, H2, S4, C5, H2, S4, C5 ]
В этом случае я вижу, что я получилв цикле игры H2, S4, C5, затем взятия стопки и повторения.
Итак, общая проблема в том, как лучше всего обнаружить повторяющиеся шаблоны в списке?Я мог бы, вероятно, набросать что-нибудь, используя простой цикл for, пытаясь найти карту, которую я собираюсь сыграть, и если я найду это в позиции x, то я смогу проверить, повторяется ли паттерн от x до n в позиции x- (nx)к х, но это похоже на проблему, которая может иметь хороший алгоритм для этого.Как бы вы закодировали это, учитывая следующую подпись функции:
function findLoops(previousMoves, nextMove, maxPatternLength) {
//Return [loopLength, loopCount] or null if there are no loops
}
ps это не домашнее задание, игра существует и находится по адресу http://www.idiot -cardgame.com , если кто-либозаинтересован:)