Вступление
В этом задании ваша задача - смоделировать игру определенного типа. В игре участники стоят в кругу, и все держат целое число. В каждом раунде игры каждый участник указывает на человека, n
отступающего, если n
это число, которое он держит. Если n
положительный, они считают справа, если n
отрицательный, они считают слева, а если n
ноль, они указывают на себя. Каждый участник, на которого кто-то указывает, исключается и покидает круг; это заканчивается раунд. Раунды продолжаются до тех пор, пока не останется ни одного участника.
вход
Ваш ввод представляет собой непустой список целых чисел в любом приемлемом формате. Он представляет собой числа, которые держат участники игры.
Выход
Ваш результат - это количество раундов, которое требуется до окончания игры.
пример
Рассмотрим список ввода [3,1,-2,0,8]
. В первом раунде происходит следующее:
- Лицо, занимающее
3
очки прямо на человека, держащего0
. - Лицо, занимающее
1
очки прямо на человека, держащего-2
. - Лицо, занимающее
-2
очки, осталось у человека, держащего3
. - Человек держит
0
очки на себя. - Человек, держащий
8
точки, прямо на человека, который держит-2
(список представляет собой круг, поэтому он оборачивается на концах).
Это означает , что 0
, -2
и 3
отпадают, так что второй раунд делается со списком [1,8]
. Здесь, 1
указывает на 8
, и 8
указывает на себя, поэтому 8
устраняется. Третий раунд делается со списком [1]
, где 1
просто указывает на себя и исключается. Потребовалось три раунда, чтобы устранить всех участников, поэтому правильный вывод 3
.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Контрольные примеры
[3] -> 1
[0,0,0] -> 1
[-2,-1,0,1,2,3,4,5,6,7] -> 2
[5,5,5,6,6,6] -> 2
[3,-7,-13,18,-10,8] -> 2
[-7,5,1,-5,-13,-10,9] -> 2
[4,20,19,16,8,-9,-14,-2,17,7,2,-2,10,0,18,-5,-5,20] -> 3
[11,2,7,-6,-15,-8,15,-12,-2,-8,-17,6,-6,-5,0,-20,-2,11,1] -> 4
[2,-12,-11,7,-16,9,15,-10,7,3,-17,18,6,6,13,0,18,10,-7,-1] -> 3
[18,-18,-16,-2,-19,1,-9,-18,2,1,6,-15,12,3,-10,8,-3,7,-4,-11,5,-15,17,17,-20,11,-13,9,15] -> 6
n
номер ли человек держит?Ответы:
Pyth, 15 байт
Тестовый набор благодаря Кирби
Использует тот же механизм итераций, что и @orlp, но определяет количество итераций, используя
f
функцию «Повторить до ложного», чтобы определить,[]
когда мы закончим.источник
Matlab,
9177 байтСтарая версия:
Это проблема, когда светится Matlab, сердце этого кода - удаление записей массива,
a(mod((1:l)+a-1,l)+1)=[]
что, на мой взгляд, довольно элегантно.источник
CJam, 21 байт
Тестирование.
Принимает ввод как список стилей CJam, но набор тестов заботится о преобразовании из формата в задаче.
объяснение
источник
ee
это почти то, что я искал вчера для другого вопроса.C #,
251219211197193 байтаСамый неуловимый неэзотерический язык поражает снова.
Эта программа ожидает входную последовательность в качестве аргументов командной строки. Например, чтобы ввести список
[5,5,5,6,6,6]
, вызовите его с аргументами командной строки5 5 5 6 6 6
.Спасибо Мартину Бюттнеру за несколько советов.
Гольф до 197 , осознав, что я могу использовать
args
массив, хотя это массив строк. Мне нужно только разобрать их в целое число в одном месте.Гольф до 193 года, понимая, что
.Where(...==x).Any()
короче.Select(...).Contains(x)
.Ungolfed
источник
Pyth, 21 байт
Живая демоверсия с тестовыми примерами.
источник
R, 105 байт
код
ungolfed
источник
Pyth, 17 байт
По совпадению очень похож на ответ Кирбифана.
источник
Mathematica, 71 байт
источник
(i=0;#//.l:{__}:>l~Delete~Mod[++i;Plus~MapIndexed~l,Length@l,1];i)&
Plus~MapIndexed~#
действительно умно, но мне интересно, если нет более короткого пути использованияl+Range@Length@l
.STATA, 146 байт
Использует платную версию STATA. Предполагается, что входные данные находятся в отдельном файле с именем новой строки
a.
. Ограничено ситуациями, когда требуется не более 1023 раундов из-за максимально допустимого количества переменных (может быть исправлено за счет 10 байтов). Он читает данные и запускает цикл, пока больше не будет наблюдений. На каждой итерации создавайте переменную со значением индекса, на который она указывает. Для каждого наблюдения, если на него указывает другое наблюдение, установите индикатор для удаления переменной. Затем отбросьте все наблюдения с помощью этого индикатора и увеличьте счетчик. После цикла распечатайте счетчик.источник
Рубин,
7874 байтаисточник
awk, 66 байт
Просто использует,
mod length array
чтобы держать его внутри массива. На входе числа должны быть разделены пробелами.Пример использования
Вот все примеры ввода в соответствующем формате
источник
Python 2, 122 байта
источник