Аккордеон - это карточная игра-пасьянс, с которой я недавно столкнулся, где почти каждая раскладка разрешима, но невероятно сложна. Вы можете сыграть здесь .
правила
52 лицевые карты помещаются лицом вверх в случайном порядке. Каждый ход вы заменяете карту более поздней картой, где две карты :
- Поделитесь костюмом или номером и
- Находятся на расстоянии 1 (смежно) или 3 (две карты между ними).
Игра выиграна, когда остается только 1 карта . Вы можете предположить, что каждый вход разрешим. Замененная карта всегда должна предшествовать заменяющей.
пример
В качестве примера рассмотрим следующий макет:
2H,2S,1S,2D (H: Hearts, S: Spades, D: Diamonds)
Здесь есть 3 возможных хода:
- Замените на
2H
соседний2S
, чтобы мы в конечном итоге2S,1S,2D
- Замените на
2S
соседний1S
, чтобы мы в конечном итоге2H,1S,2D
- Заменить
2H
с2D
(на расстоянии 3), так что мы в конечном итоге с2D,2S,1S
Из этих 3 ходов только последний может выиграть (Вы выигрываете, заменяя 2D <- 2S
, затем 2S <- 1S
).
Ввод, вывод
Ваша задача - написать аккордеонный решатель . Вам передан список карт, и вам необходимо вернуть список ходов, чтобы решить игру.
Вам передается список карточек в виде строки, разделенной запятыми, где каждая карточка передается как целое число, представляющее их числовое значение, а затем символ, представляющий их масть.
Вы должны вернуть список замен в виде строки, разделенной запятыми, где каждая замена имеет формат Card <- Card
(в соответствии с форматом карты, описанным выше). Первая карта в каждой паре является заменяемой картой.
Тестовые случаи:
5H,1C,12S,9C,9H,2C,12C,11H,10C,13S,3D,8H,1H,12H,4S,1D,7H,1S,13D,13C,7D,12D,6H,10H,4H,8S,3H,5D,2D,11C,10S,7S,4C,2H,3C,11S,13H,3S,6C,6S,4D,11D,8D,8C,6D,5C,7C,5S,9D,10D,2S,9S
5H,9C,11H,7S,7D,12D,6H,10S,3H,4D,12C,2S,3C,5C,7H,6S,1H,8S,2H,11S,4C,10D,12H,9H,2D,4H,6C,13H,11C,2C,10H,8C,1S,11D,3S,12S,7C,5D,13S,8D,4S,6D,13C,3D,8H,13D,1D,9D,9S,1C,5S,10C
7H,11C,8C,7S,10D,13H,4S,10C,4D,2C,4H,13D,3C,2H,12C,6C,9H,4C,12H,11H,9S,5H,8S,13S,8H,6D,2S,5D,11D,10S,1H,2D,5C,1C,1S,5S,3H,6S,7C,11S,9C,6H,8D,12S,1D,13C,9D,12D,3D,7D,10H,3S
Несмотря на то, что этот турнир представляет собой код-гольф , меня особенно интересуют эффективные по времени решения, и я, вероятно, вознагражу гениальные решения за вознаграждение. Тем не менее, решения, которые занимают астрономическое время, все еще приемлемы (я бы рекомендовал тестировать с меньшей колодой, такой как 16-карточная колода из 4 мастей).
источник
Ответы:
Python 3,
274272271 байт2 байта сохранены благодаря @orlp .
Это очень медленно. Тем не менее, вы можете попробовать это с памяткой . Это имеет несколько дополнительных возможностей
list
-tuple
преобразования, но в остальном эквивалентны.Даже этот астрономически медленный с определенными входами.
Код использует строки, а не числа, поэтому он также поддерживает нотацию как
KH
вместо13H
.Пример:
источник
functools.lru_cache
вместо того, чтобы писать свой собственный.list
крути, это не работает.str.split
возвратlist
). Я бы предпочел, чтобы две программы были функционально эквивалентными.h=lambda p:lru_cache(None)(g)(''.join(p))
.