Вместо того, чтобы быть умелым воином, способным убить Гидр (см. Здесь и здесь ), на этот раз вы - воин, который не имеет предварительных знаний о том, как убить одно или какое оружие использовать против существа.
В этой задаче, когда вы отсекаете одну голову, две будут расти в одном месте. Поскольку у вас нет механизма, позволяющего одновременно отрезать много голов, количество голов будет только расти. В этом случае наша Гидра может начинаться с N
(N ⩾ 1) голов. Давайте назовем первое столкновение поколением, и мы будем представлять головы первого поколения как 0 , головы, созданные после первого удара, как 1 , и так далее.
вход
Вам будет дано целое число, N
представляющее, сколько голов Hydra изначально имеет, и список размеров, N
в котором указывается, в каком индексе (в примерах я буду использовать 0-индексированный формат) вы отрежете голову. Вы всегда можете предположить, что данные индексы действительны - помните, что список (то есть: головы) будет расти, когда вы отсекаете головы.
пример
Вход : N = 4
и[0,4,2,5]
Поколение 0 - Индекс атаки 0
0 0 0 0 => 1 1 0 0 0
^ ^ ^
Поколение 1 - Индекс атаки 4
1 1 0 0 0 => 1 1 0 0 2 2
^ ^ ^
Поколение 2 - Индекс атаки 2
1 1 0 0 2 2 => 1 1 3 3 0 2 2
^ ^ ^
Поколение 3 - Индекс атаки 5
1 1 3 3 0 2 2 => 1 1 3 3 0 4 4 2
^ ^ ^
Последнее поколение
1 1 3 3 0 4 4 2
Как видите, приведенные индексы относятся к списку предыдущего поколения.
Выход
Вам необходимо вывести последнее поколение.
Контрольные примеры
N = 1 and [0] => [1,1]
N = 2 and [0,0] => [2,2,1,0]
N = 2 and [0,1] => [1,2,2,0]
N = 2 and [1,0] => [2,2,1,1]
N = 2 and [1,1] => [0,2,2,1]
N = 4 and [0,4,2,5] => [1,1,3,3,0,4,4,2]
N = 6 and [0,0,0,0,0,0] => [6, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0]
N = 6 and [5,6,7,8,9,10] => [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 6]
N = 10 and [1,7,3,12,9,0,15,2,2,10] => [6, 6, 9, 9, 8, 1, 3, 3, 0, 0, 10, 10, 2, 5, 5, 0, 0, 4, 7, 7]
Это код-гольф, поэтому выигрывает самый короткий ответ в байтах!
N
(...) и список размеровN
(но я тоже пропустил эту часть, когда впервые прочитал вызов.) ПоэтомуN
просто бесполезен.N
из входных данных, так как они «неявно» задаются как размер массива. Тем не менее, я думал, что решения будут экономить байты, предоставляяN
вместо того, чтобы полагаться на нихarray.size()
или подобные.Ответы:
Python 2 , 59 байт
Попробуйте онлайн!
Очень умно -1 благодаря xnor .
источник
Python 2 , 60 байт
Попробуйте онлайн!
источник
Stax ,
1211 байтЗапустите и отладьте его на staxlang.xyz!
Благодаря рекурсивный за один байт экономии!
Распаковывается (13 байт) и объяснение:
Задача прямо говорит: «Вы должны вывести последнее поколение», поэтому я предполагаю, что этот консенсус здесь не держится. Если это так, то десятью байтами можно управлять, оставляя результат в пустом стеке:
источник
0]*
можно заменить наz)
. Редактировать: Очевидно, это недокументированное поведение, но pad-left принимает свои операнды в любом порядке. (npm lol)Haskell ,
6357 байтПопробуйте онлайн!
источник
take
иdrop
короче чемsplitAt
. Включениеg
в лямбда сохраняет еще один байт:foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..]
.g
бессмысленным, и это только ухудшилось.Oracle SQL, 325 байт
Тест в SQL * Plus.
PS. Работает на номера до 255.
источник
Zsh , 41 байт
Мы игнорируем N, как указано в правилах .
Попробуйте онлайн!
Довольно стандартно: создайте массив из 0 для начала, напечатайте его до конца.
a[i]=(a b)
Метод как изменения и вставки нового для меня, счастлив , что нашел применение для него.ИЛИ также 41 байт :
Этот менее стандартный. Мы используем несколько изящных приемов:
${a/#%/0}
: Это замена, но#
и%
скажите zsh, чтобы закрепить совпадение в начале и в конце. Поскольку он пуст, мы заменяем все пустые элементы на 0.a[#]=
: Это фактически объявляет пустой массив размера$#
в Zsh. Это какchar *a[argc]
в C. Если мы не сделаем этого, мы не получим конечные нули, которые нам нужны.Попробуйте онлайн!
источник
Scala , 104 байта
Попробуйте онлайн!
Кажется, самый длинный ответ до сих пор. :)
List.fill(2)(l.max+1)
можно заменить,List(l.max+1,l.max+1)
но длина остается неизменной.источник
JavaScript (ES6),
61 5951 байтСпасибо @Shaggy за указание на то, что
n
это всегда длина массива, экономя 8 байтов в обеих версияхОжидается массив в 0-индексированном формате. Игнорирует
n
.Попробуйте онлайн!
JavaScript (Node.js) ,
6456 байтИспользование
reduce()
иflat()
:Попробуйте онлайн!
источник
a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&b
работать, не принимаяn
?N
. Так что, да, это кажетсяn
бесполезным.Japt , 14 байт
Попытайся
источник
PHP , 101 байт
Попробуйте онлайн!
источник
Perl 5
-pal
, 48 байтПопробуйте онлайн!
Принимает массив как разделенный пробелами список из STDIN. Не вводит
n
.источник
Сетчатка 0.8.2 , 69 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. 1-индексироваться. Принимает вход как
...list,N
. Не требует, чтобы список был длиннымN
. Объяснение:Преобразуйте все входные данные в унарные, но с использованием
_
, чтобы не путать их с последующим использованием цифры1
. (Retina 1 сделает это автоматически для 2-байтового сохранения.)Замените
N
массивомN
нулей, но не изменяйте список.Обработать все элементы списка.
Найдите следующий элемент списка и эквивалентную позицию в массиве.
$1
= текущее поколение (как длина),$2
= запятые от предыдущих поколений,$3
= текущий индекс - 1,$4
= первые$3
заголовки.Замените заголовок в текущем индексе двумя копиями текущего поколения в десятичном формате.
источник
Pyth , 16 байт
Попробуйте онлайн!
Интересно, что оказывается, что я не могу использовать,
s
чтобы сгладить список, так как он на самом деле является сокращением+F
, которое выполняет+
два крайних левых элемента списка, пока все элементы не будут обработаны. Это означает, что первые несколько элементов могут быть просто суммированы, в зависимости от того, где произошла последняя замена.источник
Желе , 13 байт
Попробуйте онлайн!
Монадическая ссылка, которая берет 1-индексированный список головок, чтобы сократить в качестве аргумента, и возвращает окончательное поколение.
источник
C # (интерактивный компилятор Visual C #) ,
948985 байтСохранено 2 байта благодаря Эндрю Баумеру
Попробуйте онлайн!
источник
a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})
<05AB1E , 10 байтов
Попробуйте онлайн!
источник