Недавно я отправил на вопрос о Diffy играх, остались без ответа. Это хорошо, вопрос действительно сложный, но я хотел бы сделать более легкий вопрос об играх Диффи, чтобы мы могли начать игру.
Как работает Diffy
Скопировано из Find Diffy Games
Игра Diffy работает следующим образом: вы начинаете со списка неотрицательных целых чисел, в этом примере мы будем использовать
3 4 5 8
Тогда вы берете абсолютную разницу между соседними числами
(8) 3 4 5 8
5 1 1 3
Тогда вы повторяете. Вы повторяете, пока не поймете, что вступили в цикл. И тогда, как правило, игра начинается заново.
3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0
Большинство игр заканчиваются цепочкой всех нулей, что считается проигрышным состоянием, но в редких играх они зацикливаются на больших циклах.
задача
Учитывая начальное состояние игры Diffy, определите, достигнет ли игра в конечном итоге состояния всех нулей. Вы должны вывести значение «Истина» или «Ложь» для каждого из двух состояний. Который соответствует, который не имеет значения.
Цель состоит в том, чтобы минимизировать количество байтов в вашем источнике.
источник
1 1 0
является периодическим,42 42 41
таково и такое состояние.n
нечетная, игра не обнуляется, если все числа не равны. Если длина является степенью 2, она всегда стремится к нулю.n
элементами и максимумомm
занимает самое большее количествоn * bit_length(m)
шагов. Итак,n*m
это тоже верхняя граница. Более сильная верхняя границаt(n) * bit_length(m)
, гдеt(n)
наибольшая степень 2, это факторn
.Ответы:
Pyth, 6 байт
Тестирование
Эта программа очень учтивая. 0 (ложь) означает все нули, все остальное (правда) означает не все нули.
Как это работает:
источник
Mathematica, 52 байта
Чистая функция, принимающая в качестве входных данных список неотрицательных целых чисел
True
илиFalse
.Abs[#-RotateLeft@#]&
это функция, которая выполняет один раунд игры с неповторимым характером. (Технически так и должно бытьRotateRight
, но окончательный ответ не затрагивается, и, эй, свободный байт.) Таким образом,Nest[...,#,R]
выполняетсяR
раунд игры diffy, а затем1>Max@
определяется, все ли результаты равны нулю .Как мы узнаем, сколько нужно пройти раундов игры
R
? Еслиm
это наибольшее значение во входных данных, обратите внимание, что мы никогда не получим целое число больше, чемm
независимо от того, сколько раундов мы делаем. Общее количество списков длиныl
неотрицательных целых чисел, ограниченных,m
равно(m+1)^l
. Таким образом, если мы проводим(m+1)^l
раунды игры «уклончиво», мы к тому времени гарантированно увидим какой-то список дважды и, следовательно, будем в периодической части игры. В частности, игра заканчивается во всех нулях, если и только если результатом(m+1)^l
раундов игры является список из всех нулей. Это выражение - то, чтоMax[1+#]^Tr[1^#]
вычисляет.источник
Желе , 13 байт
Выводит 0 (ложь), если будет достигнуто нулевое состояние, в противном случае возвращается истинное значение (положительное целое число).
Попробуйте онлайн!
Использует наблюдение, впервые сделанное Грегом Мартином , о том, что числа в массиве могут никогда не покинуть область [0, m], где m - максимальный элемент на входе, поэтому выполняется (m + 1) l циклов, где l - длина входа, хватай.
Как?
источник
PHP, 144 байта
выведите 0 для всех нулей и любое положительное целое значение для true
Онлайн версия
расширенный
источник
array_push
? Но почему ?$_GET
качестве входных данных вы должны предполагать, что он содержит строку.?0[0]=1&0[1]=1&0[2]=0
или?0[]=1&0[]=1&0[]=0
представляет собой массив строк, но это не имеет значения. Но вы правы, я мог бы сделать это короче,?0=1&1=1&2=0
почему бы не àrray_push` Я уверен, что вы или Титус найдете лучшие способы сократить это.array_push($e,$e[$c=0]);
просто точно так же, как$e[]=$e[$c=0];
и вы даже используете синтаксис уже ($r[]=$n
). Вы уже используете вmax
настоящее время , так что вы должны также заменитьend($r)
с ,$n
потому что$n
всегда равно ,end($r)
когда эхо выполняется.R (3.3.1), 87 байт
Возвращает ноль для игры, заканчивающейся на все нули, и положительное число в противном случае.
использует тот же факт Грег Мартин и использует встроенный diff, чтобы сделать диффузию
источник
Röda , 80 байт
Попробуйте онлайн!
Ungolfed:
источник
05AB1E , 13 байтов
Возвращает 1, если оно заканчивается нулями, и 0 в противном случае.
Попробуйте онлайн!
объяснение
Использует верхнюю границу раундов:
max(input)*len(input)
объясняется xnor в разделе комментариев.источник
J, 22 байта
Возвращает
0
(что эффективноfalse
в J) для вырожденной игры, оканчивающейся на все нули. Возвращает1
(true
), если n-я итерация содержит ненулевое число, где n равно наибольшему целому числу в исходной последовательности, умноженному на длину списка. Смотрите ответ Грега Мартина, объясняющий, почему это так.Перевод:
*
>./
^:( )
#
умноженная*
на наибольшее значение в списке>./
:|&
в(- )
и1&|.
Примеры:
источник
JavaScript (ES6),
95 9290 байтобъяснение
Рекурсивная функция, которая вызывает себя до тех пор, пока счетчик (который начинается с максимального значения в списке плюс единица в степени длины списка [
= (max + 1)**length
]) не равен нулю. При каждом вызове счетчик уменьшается, и когда он достигает нуля, все элементы в списке проверяются на ноль. Если все они равны нулю, программа возвращаетсяtrue
, и вfalse
противном случае.источник
PHP,
123115принимая ввод через HTTP get, например,
?3&4&5&8
сохраняет несколько байтов.Печатает 1, если он достигает всех нулей или вообще ничего.
принимает список аргументов через командную строку. У меня такое чувство, что это можно сделать еще глубже (глядя на @Titus).
источник
Python 3.6, 101 байт
Принимает кортеж чисел и возвращает False, если оно заканчивается нулями, и True, если оно повторяется.
источник
JavaScript (ES6),
8483 байтаВ противном случае возвращается
true
игра, заканчивающаяся на все нулиfalse
.Тест
Показать фрагмент кода
источник