Zamiast być zręcznym wojownikiem zdolnym do zabijania Hydr (patrz tutaj i tutaj ), tym razem jesteś wojownikiem, który nie ma wcześniejszej wiedzy o tym, jak zabić jedną lub jaką broń użyć przeciwko stworzeniu.
W tym problemie, ilekroć odetniesz pojedynczą głowę, dwie będą rosły w tym samym miejscu. Ponieważ nie masz mechanizmu odcinania wielu głowic jednocześnie, liczba głowic będzie tylko rosła. W takim przypadku nasza Hydra może zacząć od N
(N ⩾ 1) głów. Nazwijmy pierwsze spotkanie pokoleniem, a my reprezentujemy głowy pierwszej generacji jako 0 , głowy utworzone po pierwszym uderzeniu jako 1 i tak dalej.
Wejście
Otrzymasz liczbę całkowitą N
reprezentującą, ile głów Hydra początkowo ma, oraz listę rozmiarów N
zawierającą, w którym indeksie (w przykładach użyję formatu 0-indeksowanego) odetniesz głowę. Zawsze możesz założyć, że podane indeksy są prawidłowe - pamiętaj, że lista (tj. Główki) będzie rosła w miarę odcinania głów.
Przykład
Wejście :N = 4
i[0,4,2,5]
Generacja 0 - Indeks ataku 0
0 0 0 0 => 1 1 0 0 0
^ ^ ^
Generacja 1 - Indeks ataku 4
1 1 0 0 0 => 1 1 0 0 2 2
^ ^ ^
Generacja 2 - Indeks ataku 2
1 1 0 0 2 2 => 1 1 3 3 0 2 2
^ ^ ^
Generacja 3 - Indeks ataku 5
1 1 3 3 0 2 2 => 1 1 3 3 0 4 4 2
^ ^ ^
Ostatnie pokolenie
1 1 3 3 0 4 4 2
Jak widać, podane indeksy są powiązane z listą poprzedniej generacji.
Wynik
Jesteś zobowiązany do wyjścia ostatniej generacji.
Przypadki testowe
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]
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach!
N
(...) i listę rozmiarówN
(Ale tęskniłem również za tą częścią, gdy czytałem po raz pierwszy wyzwanie.) DlategoN
jest po prostu bezużyteczne.N
danych wejściowych, ponieważ są one „domyślnie” podane jako rozmiar tablicy. Myślałem jednak, że rozwiązania pozwolą zaoszczędzić bajty, podającN
zamiast polegać na nicharray.size()
lub podobnie.Odpowiedzi:
Python 2 , 59 bajtów
Wypróbuj online!
Bardzo sprytne -1 dzięki xnor .
źródło
Python 2 , 60 bajtów
Wypróbuj online!
źródło
Stax ,
1211 bajtówUruchom i debuguj na staxlang.xyz!
Dzięki rekursywnemu za jeden bajt oszczędności!
Rozpakowane (13 bajtów) i objaśnienie:
Wyzwanie jednoznacznie mówi „jesteś zobowiązany do wydania ostatniego pokolenia”, więc zgaduję, że ten konsensus nie ma tu miejsca. Jeśli tak się stanie, można zarządzać dziesięcioma bajtami, pozostawiając wynik na innym pustym stosie:
źródło
0]*
można zastąpićz)
. Edycja: Najwyraźniej jest to zachowanie nieudokumentowane, ale lewy pad bierze operandy w dowolnej kolejności. (npm lol)Haskell ,
6357 bajtówWypróbuj online!
źródło
take
idrop
są krótsze niżsplitAt
. Przechodzącg
do lambda zapisuje kolejny bajt:foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..]
.g
sensu, a sytuacja się pogorszyła.Oracle SQL, 325 bajtów
Testuj w SQL * Plus.
PS. Działa dla liczb do 255.
źródło
Zsh , 41 bajtów
Ignorujemy N, zgodnie z zasadami .
Wypróbuj online!
Całkiem standardowy: utwórz tablicę zer, aby rozpocząć, wydrukuj ją, aby zakończyć.
a[i]=(a b)
Metoda zarówno zmieniających się i wkładając jest dla mnie nowe, szczęśliwe Znalazłem ją wykorzystać.LUB również 41 bajtów :
Ten jest mniej standardowy. Korzystamy z kilku schludnych sztuczek:
${a/#%/0}
: To jest zamiana, ale#
i%
tell zsh do kotwicy mecz na początku i na końcu. Ponieważ jest pusty, wszystkie puste elementy zamieniamy na 0.a[#]=
: To skutecznie deklaruje pustą tablicę rozmiarów$#
w Zsh. To jest jakchar *a[argc]
w C. Jeśli tego nie zrobimy, nie otrzymamy końcowych zer, których potrzebujemy.Wypróbuj online!
źródło
Scala , 104 bajty
Wypróbuj online!
Wydaje się, że jest to najdłuższa jak dotąd odpowiedź. :)
List.fill(2)(l.max+1)
można zastąpić,List(l.max+1,l.max+1)
ale długość pozostaje taka sama.źródło
JavaScript (ES6),
61 5951 bajtówDzięki @Shaggy za zwrócenie na to uwagi
n
zawsze ma długość tablicy, oszczędzając 8 bajtów w obu wersjachOczekuje tablicy w formacie 0-indeksowanym. Ignoruje
n
.Wypróbuj online!
JavaScript (Node.js) ,
6456 bajtówKorzystanie
reduce()
iflat()
:Wypróbuj online!
źródło
a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&b
działałby bez przyjmowanian
?N
. Tak, wydaje się, żen
JEST bezużyteczny.Japt , 14 bajtów
Spróbuj
źródło
PHP , 101 bajtów
Wypróbuj online!
źródło
Perl 5
-pal
, 48 bajtówWypróbuj online!
Pobiera tablicę jako listę oddzieloną spacjami od STDIN. Nie wejście
n
.źródło
Retina 0.8.2 , 69 bajtów
Wypróbuj online! Link zawiera przypadki testowe. 1-indeksowany. Pobiera dane wejściowe jako
...list,N
. Nie wymaga, aby lista była długaN
. Wyjaśnienie:Konwertuj wszystkie dane wejściowe na jednoargumentowe, ale za pomocą
_
, aby nie pomylić ich z późniejszym użyciem cyfry1
. (Retina 1 zrobiłaby to automatycznie w celu zaoszczędzenia 2 bajtów).Zamień
N
tablicęN
zer, ale nie zmieniaj listy.Przetwórz wszystkie elementy listy.
Znajdź następny element listy i równoważną pozycję w tablicy.
$1
= bieżąca generacja (jako długość),$2
= przecinki z poprzednich generacji,$3
= aktualny indeks - 1,$4
= pierwsze$3
głowice.Zamień głowicę przy bieżącym indeksie na dwie kopie bieżącej generacji w systemie dziesiętnym.
źródło
Pyth , 16 bajtów
Wypróbuj online!
Co ciekawe, okazuje się, że nie mogę użyć
s
do spłaszczenia listy, ponieważ tak naprawdę jest ona skrótem+F
, która wykonuje+
dwa skrajnie lewe elementy listy, dopóki wszystkie elementy nie zostaną przetworzone. Oznacza to, że kilka pierwszych elementów można po prostu zsumować, w zależności od tego, gdzie nastąpiła ostatnia zamiana.źródło
Galaretka , 13 bajtów
Wypróbuj online!
Monadyczny link, który przyjmuje jako argument argument 1-indeksowaną listę głów i zwraca ostatnią generację.
źródło
C # (interaktywny kompilator Visual C #) ,
948985 bajtówZaoszczędzono 2 bajty dzięki Andrew Bauhmerowi
Wypróbuj online!
źródło
a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})
<05AB1E , 10 bajtów
Wypróbuj online!
źródło