Напад на гідру


15

Замість того, щоб бути вмілим воїном, здатним вбити гідрів (див. Тут і тут ), на цей раз ви - воїн, який не має попередніх знань, як вбити одну чи яку зброю використовувати проти створіння.

У цій проблемі щоразу, коли ви відріжете одну голову, дві будуть рости в одному місці. Оскільки у вас немає механізму одночасно відрізати багато головок, кількість голів буде лише зростати. У цьому випадку наша гідра може починатися з 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]

Це тому найкоротша відповідь у байтах виграє!


Пісочниця посилання
ihavenoidea

Потрібен тестовий випадок, коли початкова кількість голів перевищує кількість відрізаних голів. Я думаю, що я бачу принаймні одну актуальну відповідь, яка б провалила цю справу.
Xcali

@Xcali Кількість відрізаних головок насправді гарантовано дорівнює початковій кількості голів: Вам буде дано ціле число N(...) та розмір спискуN (Але я пропустив і цю частину, коли я вперше прочитав виклик.) Тому Nпросто марно.
Арнольд

3
Я думав про фактичне видалення Nз вхідних даних, оскільки він "неявно" задається як розмір масиву. Однак я думав, що рішення врятують байти, надаючи Nзамість них покладаючись на array.size()чи подібні.
ihavenoidea

1
Відповідне замовлення коміксу Stick (+ наступне).
Paŭlo Ebermann

Відповіді:




5

Стакс , 12 11 байт

î╓≡╧▄#¥oWä)A

Запустіть і налагодьте його на staxlang.xyz!

Дякуємо рекурсивно за один байт економії!

Розпаковано (13 байт) та пояснення:

z),{i^c\&:fFm
z)               Push initial array of zeroes to stack
  ,              Push array of attacks to stack
   {       F     For each attack, push it and then:
    i^c\           Push [x,x], where x is the generation number
        &          Set the head at the attack index to this new array
         :f        Flatten
            m    Print the last generation

У виклику чітко сказано, що "вам потрібно вивести останнє покоління", тому, на мою думку, цей консенсус не дотримується тут. Якщо це все-таки, можна керувати десятьма байтами , залишивши результат у інакше порожньому стеку:

z),Fi^c\&:f

1
0]*можна замінити на z). Редагувати: Мабуть, це незадокументоване поведінка, але ліва панель приймає свої операнди в будь-якому порядку. (npm lol)
рекурсивна

1
@recursive Недокументована поведінка - найкращий вид поведінки :)
Khuldraeseth na'Barya

5

Haskell , 63 57 байт

foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..]

Спробуйте в Інтернеті!


takeі dropкоротші, ніж splitAt. Включення gв лямбда зберігає ще один байт: foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..].
Ними

Ах приємно - я спробував і те, і інше, але я чомусь лише намагався зробити gточку зору, і це просто погіршилося.
Б. Мехта

4

Oracle SQL, 325 байт

select listagg(ascii(substr(l,level,1)),', ')within group(order by level)
from(select * from t
model dimension by(1 i)measures(l,r)
rules iterate(1e5)until(r[1]is null)
(l[1]=regexp_replace(l[1],'.',chr(:n-length(r[1])+1)||chr(:n-length(r[1])+1),1,ascii(substr(r[1],1,1))+1),r[1]=substr(r[1],2)))
connect by level<=length(l);

Тест у SQL * Plus.

SQL> set heading off
SQL>
SQL> create table t(l varchar2(4000), r varchar2(4000));

Table created.

SQL>
SQL> var n number;
SQL> exec :n := 10;

PL/SQL procedure successfully completed.

SQL>
SQL> insert into t
  2  values(rpad(chr(0),:n,chr(0)), chr(1)||chr(7)||chr(3)||chr(12)||chr(9)||chr(0)||chr(15)||chr(2)||chr(2)||chr(10));

1 row created.

SQL>
SQL> select listagg(ascii(substr(l,level,1)),', ')within group(order by level)
  2  from(select * from t
  3  model dimension by(1 i)measures(l,r)
  4  rules iterate(1e5)until(r[1]is null)
  5  (l[1]=regexp_replace(l[1],'.',chr(:n-length(r[1])+1)||chr(:n-length(r[1])+1),1,ascii(substr(r[1],1,1))+1),r[1]=substr(r[1],2)))
  6  connect by level<=length(l);

6, 6, 9, 9, 8, 1, 3, 3, 0, 0, 10, 10, 2, 5, 5, 0, 0, 4, 7, 7

PS. Працює для чисел до 255.


3

Zsh , 41 байт

Ми ігноруємо N, як зазначено в правилах .

for i;a+=(0)
for i;a[i]=($[++j] $j)
<<<$a

Спробуйте в Інтернеті!

Досить стандарт: Створіть масив із 0 для початку, роздрукуйте його до кінця. a[i]=(a b)Метод як зміни і вставки нового для мене, щасливий , що знайшов застосування для нього.


АБО, також 41 байт :

a[#]=
for i;a[i]=($[++j] $j)
<<<${a/#%/0}

Цей менш стандартний. Ми використовуємо кілька акуратних прийомів:

  • ${a/#%/0}: Це заміна, але #і %розповідають ЗШ на якір матч на початку і в кінці. Оскільки він порожній, ми замінюємо всі порожні елементи на 0.
  • a[#]=: Це ефективно оголошує порожній масив розміром $#у Zsh. Це як char *a[argc]у C. Якщо ми цього не зробимо, ми не отримаємо потрібні нулі.

Спробуйте в Інтернеті!


3

Скала , 104 байти

def^(l:Seq[Int],r:Seq[Int]):Seq[Int]=if(r.size>0)^(l.patch(r(0),Seq.fill(2)(l.max+1),1),r.drop(1))else l

Спробуйте в Інтернеті!

Здається, це найдовша відповідь досі. :)

List.fill(2)(l.max+1)можна замінити, List(l.max+1,l.max+1)але довжина залишається такою ж.


3

JavaScript (ES6),  61 59  51 байт

Завдяки @Shaggy за те, що вказав, що nце завжди довжина масиву, економлячи 8 байтів в обох версіях

Очікує масив у 0-індексованому форматі. Ігнорує n.

a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&b

Спробуйте в Інтернеті!


JavaScript (Node.js) ,  64  56 байт

Використання reduce()та flat():

a=>a.reduce((b,i,g)=>b.flat(1,b[i]=[++g,g]),a.map(_=>0))

Спробуйте в Інтернеті!


Працювало б a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&b, не беручи n?
Shaggy

@Shaggy На жаль Я пропустив цю частину: і список розмірівN . Отже, так, це здається, що це nНЕ марно.
Арнольд


2

PHP , 101 байт

function h($n,$a){$h=array_fill(0,$n,0);foreach($a as$b)array_splice($h,$b,0,$h[$b]=++$x);return $h;}

Спробуйте в Інтернеті!


Ласкаво просимо! Подумайте про додавання пояснення та посилання до онлайн-перекладача, наприклад, TIO . Відповіді, що стосуються лише коду, зазвичай автоматично позначаються як неякісні. Детальні відомості див. У існуючих відповідях.
mbomb007

Я додав посилання TIO
XMark


1

Сітківка 0,8,2 , 69 байт

\d+
$*_
r`_\G
,0
+`^((,*)_)(_)*(.*,,(?<-3>\d+,)*)\d+
$2$4$.1,$.1
^,+

Спробуйте в Інтернеті!Посилання включає тестові випадки. 1-індексований. Вводиться як " ...list,N. Не вимагає, щоб список був довжиною N. Пояснення:

\d+
$*_

Перетворіть усі входи в одинакові, але використовуючи _ , щоб вони не плуталися з подальшим використанням цифри 1. (Retina 1 зробить це автоматично для 2-байтного збереження.)

r`_\G
,0

Замініть N масив Nнулів, але список не змінюйте.

+`

Обробити всі елементи списку.

^((,*)_)(_)*(.*,,(?<-3>\d+,)*)\d+

Знайдіть наступний елемент списку та еквівалентну позицію в масиві. $1= поточне покоління (як довжина), $2= коми від попередніх поколінь, $3= поточний показник - 1,$4 = перші $3голови.

$2$4$.1,$.1

Замініть голову в поточному індексі на дві копії поточного покоління на десяткові.


1

Pyth , 16 байт

u.nXGH,=+Z1ZE*]0

Спробуйте в Інтернеті!

Цікаво, що, виявляється, я не можу використати sдля вирівнювання списку, оскільки це фактично стенограма +F, яка виконує +в крайній лівій частині двох елементів списку, поки всі елементи не будуть оброблені. Це означає, що перші кілька елементів можуть бути просто підсумовані, залежно від місця останньої заміни.

u.nXGH,=+Z1ZE*]0Q   Implicit: Q=input 1 (N), E=input 2 (array), Z=0
                    Trailing Q inferred
              ]0    [0]
             *  Q   Repeat Q times
u           E       Reduce E, with current value G and next value H, starting with the above:
       =+Z1           Increment Z in-place
      ,  Z Z          Pair the updated Z with itself
   XGH                In G, replace the element with index H with the above
 .n                   Flatten
                    Implicit print


1

C # (Visual C # Interactive Compiler) , 94 89 85 байт

a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c.Insert(d,c[d]=++a);return c;})

Збережено 2 байти завдяки Ендрю Баумеру

Спробуйте в Інтернеті!


ви можете зберегти 2 байти, повторно використовуючи a. a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})<
Ендрю Баумхер

Минуло 5 хвилин, дерп. ви можете протестувати тут
Ендрю Баумхер

@AndrewBaumher Спасибі
Втілення

1

05AB1E , 10 байт

-IvN>D‚yǝ˜

Спробуйте в Інтернеті!

   -             # subtract the input from itself (yields a list of 0s)
    Iv           # for each number y in the input
      N          # push the 0-based loop count
       >         # add 1 to get the generation number
        D        # duplicate
         ‚       # wrap the two copies in a list
          yǝ     # replace the element at index y with that list
            ˜    # flatten
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.