«Болгарский пасьянс» - это однопользовательская игра, популярная у Мартина Гарднера в его математической колонке « Scientific American» .
У вас есть N
одинаковые карты, разбитые на стопки. Вы берете карту из каждой колоды и формируете новую колоду с удаленными картами. Вы повторяете этот процесс до тех пор, пока не достигнете состояния, которое вы уже видели, и поэтому продолжение будет повторять цикл.
Например, скажем, у вас есть 8
карты, разбитые на стопку 5
и стопку 3
. Пишем размеры кучи в порядке убывания: 5 3
. Вот стенограмма игры:
5 3
4 2 2
3 3 1 1
4 2 2
Сначала вы удаляете карту из каждой из двух стопок, оставляя стопки 4
и 2
, и вновь созданную стопку 2
раздачи 4 2 2
. На следующем шаге они уменьшаются до 3 1 1
новой стопки 3
. Наконец, последний шаг очищает груды размера 1
и производит 4 2 2
уже появившиеся, поэтому мы остановимся.
Обратите внимание, что сумма размеров стопки остается неизменной.
Ваша цель - напечатать такую стенограмму игры из заданной стартовой конфигурации. Это код гольф, поэтому побеждает меньше байтов.
вход
Список положительных чисел в порядке убывания, представляющих начальные размеры стопки. Возьмите вход через STDIN или функциональный вход. Вы можете использовать любую похожую на список структуру.
Вы не получаете общее количество карт N
в качестве входных данных.
Вывод
Распечатайте последовательность размеров кучи, через которую проходит игра «Болгарский пасьянс». Обратите внимание, что печать требуется, а не возврат. У каждого шага должна быть своя линия.
Каждая строка должна иметь последовательность положительных чисел в убывающем порядке без цифр 0
. У вас могут быть разделители, а также начальный и конечный токены (например, [3, 3, 1, 1]
). Числа могут иметь несколько цифр, поэтому их нужно как-то разделить.
Распечатайте фрагменты по размеру стопки, которые вы видите до и включая повторение. Итак, первая строка должна быть входной, а последняя строка должна повторять предыдущую строку. Других повторений не должно быть.
Контрольные примеры
>> [1]
1
1
>> [2]
2
1 1
2
>> [1, 1, 1, 1, 1, 1, 1]
1 1 1 1 1 1 1
7
6 1
5 2
4 2 1
3 3 1
3 2 2
3 2 1 1
4 2 1
>> [5, 3]
5 3
4 2 2
3 3 1 1
4 2 2
>> [3, 2, 1]
3 2 1
3 2 1
>> [4, 4, 3, 2, 1]
4 4 3 2 1
5 3 3 2 1
5 4 2 2 1
5 4 3 1 1
5 4 3 2
4 4 3 2 1
v$input()$
наQ
. 2. Если вы храните список в порядке убывания, вам не нужноN
вообще:W!}QYQ~Y]Q=Q_S+fTmtdQ]lQ;Q
QW!}QY~Y]Q=Q_S+]lQfTmtdQQ
. Точно так же, символ за персонажем, вплоть до коммутативности.CJam, 26 байт
Попробуйте онлайн.
Пример запуска
источник
:p
работал, я мог бы ...:p
Руби, 98
объяснение
Array
.Hash
g
.Array#map
для уменьшения каждого элемента на 1, добавьте длину элемента вArray
качестве элемента, отсортируйте его по убыванию и удалите элемент0
.g
игровое состояние, достаточно проверить наличие ключа для нового игрового состояния.источник
sort_by
вещь, безусловно, умна,sort.reverse
на самом деле она на один символ короче ^^CJam,
35 3433 байта(Черт, это отключение электричества, которое я не первым опубликовал в CJam)
Входные данные:
Вывод:
Попробуйте онлайн здесь
источник
Питон 2 - 103
Аналогичен ответу Quincunx, но заменяет добавление дополнением и удаляет последние две строки.
Пример вывода:
источник
GolfScript,
5046Почти наверняка можно дальше играть в гольф. Попробуйте это здесь.
источник
Хаскелл, 99
источник
CJam,
403634 байтаПроверьте это здесь. Введите ввод в виде массива в стиле CJam, например
[5 3]
, в поле STDIN. Формат вывода похож, поэтому квадратные скобки и пробелы в качестве разделителей.Даже если я продолжу играть в гольф (что, безусловно, возможно), нет никакого способа победить Пита с этим. Может быть, пришло время изучить J. Объяснение будет позже.
источник
JavaScript (E6) 113
Худшая запись до сих пор :(
Тест в консоли FireFox / FireBug
Вывод
источник
Python 2,
148130101Это просто запоминает все предыдущие итерации и проверяет, есть ли новая в этом списке. Затем он распечатывает это.
Образец прогона:
Входные данные:
Вывод:
Изменить: я перечитал спецификации для гольфа, а также много играл в гольф.
источник
[4,2,2]
. Там легко исправить, хотя.Python 3: 89 символов
Очень похоже на уже опубликованные решения Python, но с рекурсивными вызовами функций, а не с циклами. В списке
s
хранятся уже увиденные разбиения, и в случае повторения происходит короткое замыкание рекурсии.Функцию
print()
(это Python 3) просто нужно как-то вызывать в каждом цикле. Хитрость в том, чтоlambda
допускается только одно выражение, поэтому мы не можем этого сделатьprint(l);...
. Кроме того, это выводитNone
, с которым трудно работать. Я ставлюprint(l)
одну сторону неравенства;==
не работает по какой-то причине, которую я не понимаю.Альтернативный подход для размещения его в списке использует одинаковое количество символов.
Использование
print(*l)
будет форматировать выходные данные как,4 2 2
а не[4,2,2]
.источник