Anstatt ein geschickter Krieger zu sein, der Hydras töten kann (siehe hier und hier ), bist du diesmal ein Krieger, der keine Vorkenntnisse darüber hat, wie man eine oder welche Waffen gegen die Kreatur verwendet.
Bei diesem Problem wachsen immer dann, wenn Sie einen einzigen Kopf abschneiden, zwei an derselben Stelle. Da Sie nicht den Mechanismus haben, um viele Köpfe gleichzeitig abzuschneiden, wird die Anzahl der Köpfe nur wachsen. In diesem Fall kann unsere Hydra mit N
(N ⩾ 1) Köpfen beginnen. Nennen wir die erste Begegnung eine Generation und wir werden die Köpfe der ersten Generation als 0 darstellen , die Köpfe, die nach dem ersten Schlag erzeugt wurden, als 1 und so weiter.
Eingang
Sie erhalten eine Ganzzahl, N
die angibt , wie viele Köpfe die Hydra anfangs hat, und eine Liste der Größen, die N
enthält, in welchem Index (in den Beispielen verwende ich das 0-indizierte Format) Sie einen Kopf abschneiden. Sie können immer davon ausgehen, dass die angegebenen Indizes gültig sind - denken Sie daran, dass die Liste (dh die Köpfe) wächst, wenn Sie die Köpfe abschneiden.
Beispiel
Eingabe : N = 4
und[0,4,2,5]
Generation 0 - Angriffsindex 0
0 0 0 0 => 1 1 0 0 0
^ ^ ^
Generation 1 - Angriffsindex 4
1 1 0 0 0 => 1 1 0 0 2 2
^ ^ ^
Generation 2 - Angriffsindex 2
1 1 0 0 2 2 => 1 1 3 3 0 2 2
^ ^ ^
Generation 3 - Angriffsindex 5
1 1 3 3 0 2 2 => 1 1 3 3 0 4 4 2
^ ^ ^
Letzte Generation
1 1 3 3 0 4 4 2
Wie Sie sehen, beziehen sich die angegebenen Indizes auf die Liste der vorherigen Generation.
Ausgabe
Sie müssen die letzte Generation ausgeben.
Testfälle
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]
Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes!
N
(...) und eine Liste mit der GrößeN
(aber auch diesen Teil habe ich beim ersten Lesen übersehen die herausforderung.) ist daherN
einfach unbrauchbar.N
die Eingabe tatsächlich zu entfernen, da sie "implizit" als Array-Größe angegeben wird. Ich dachte jedoch, dass die Lösungen Bytes einsparen würden, indem sie geben,N
anstatt sich aufarray.size()
oder ähnliches zu verlassen.Antworten:
Python 2 , 59 Bytes
Probieren Sie es online!
Sehr clever -1 dank xnor .
quelle
Python 2 , 60 Bytes
Probieren Sie es online!
quelle
Stax ,
1211 BytesFühren Sie es aus und debuggen Sie es unter staxlang.xyz!
Dank rekursiv für ein Byte Ersparnis!
Entpackt (13 Bytes) und Erklärung:
Die Herausforderung besagt ausdrücklich, dass "Sie die letzte Generation ausgeben müssen". Ich vermute also, dass dieser Konsens hier nicht zutrifft. In diesem Fall können zehn Bytes verwaltet werden, indem das Ergebnis auf einem ansonsten leeren Stapel belassen wird:
quelle
0]*
kann durch ersetzt werdenz)
. Edit: Anscheinend ist dies undokumentiertes Verhalten, aber pad-left nimmt seine Operanden in beliebiger Reihenfolge. (npm lol)Haskell ,
63.57BytesProbieren Sie es online!
quelle
take
unddrop
sind kürzer alssplitAt
. Dreheng
in ein Lambda spart ein weiteres Byte:foldl(\y(x,n)->take n y++x:x:drop(n+1)y).(0<$)<*>zip[1..]
.g
sinnlos zu werden, und es wurde nur schlimmer.Oracle SQL, 325 Byte
Testen Sie in SQL * Plus.
PS. Funktioniert für Nummern bis zu 255.
quelle
Zsh , 41 Bytes
Wir ignorieren N, wie in den Regeln angegeben .
Probieren Sie es online!
Ziemlich normal: Erstellen Sie ein Array von 0s zum Starten und drucken Sie es zum Beenden. Die
a[i]=(a b)
Methode des Änderns und Einfügens ist für mich neu, froh, dass ich eine Verwendung dafür gefunden habe.ODER, auch 41 Bytes :
Dieser ist weniger Standard. Wir nutzen ein paar nette Tricks:
${a/#%/0}
: Dies ist Ersatz, aber#
und%
tell zsh das Spiel am Anfang und Ende zu Anker. Da es leer ist, ersetzen wir alle leeren Elemente durch 0.a[#]=
: Dies deklariert effektiv ein leeres Array der Größe$#
in Zsh. Es ist wiechar *a[argc]
in C. Wenn wir das nicht tun, werden wir nicht die nachgestellten Nullen bekommen, die wir brauchen.Probieren Sie es online!
quelle
Scala , 104 Bytes
Probieren Sie es online!
Scheint die längste Antwort zu sein. :)
List.fill(2)(l.max+1)
kann durch ersetzt werden,List(l.max+1,l.max+1)
aber die Länge bleibt gleich.quelle
JavaScript (ES6),
61 5951 ByteVielen Dank an @Shaggy, der darauf hingewiesen hat, dass dies
n
immer die Länge des Arrays ist und in beiden Versionen 8 Byte gespart werdenErwartet das Array im 0-indizierten Format. Ignoriert
n
.Probieren Sie es online!
JavaScript (Node.js) ,
6456 BytesVerwenden
reduce()
undflat()
:Probieren Sie es online!
quelle
a=>a.map(i=>b.splice(i,1,++g,g),b=a.map(_=>g=0))&&b
funktionieren, ohne zu nehmenn
?N
. Also, ja, es scheintn
nutzlos zu sein.Japt , 14 Bytes
Versuch es
quelle
PHP , 101 Bytes
Probieren Sie es online!
quelle
Perl 5
-pal
, 48 BytesProbieren Sie es online!
Nimmt Array als durch Leerzeichen getrennte Liste von STDIN. Gibt nicht ein
n
.quelle
Retina 0.8.2 , 69 Bytes
Probieren Sie es online! Link enthält Testfälle. 1-indiziert. Übernimmt die Eingabe als
...list,N
. Die Liste muss nicht lang seinN
. Erläuterung:Konvertieren Sie alle Eingaben in unary, aber using
_
, damit sie nicht mit späteren Verwendungen der Ziffer verwechselt werden1
. (Retina 1 würde dies automatisch für eine 2-Byte-Speicherung tun.)Ersetzen Sie
N
durch ein Array mitN
Nullen, aber ändern Sie die Liste nicht.Verarbeiten Sie alle Elemente der Liste.
Suchen Sie das nächste Element der Liste und die entsprechende Position im Array.
$1
= aktuelle Generation (als Länge),$2
= Kommas aus früheren Generationen,$3
= aktueller Index - 1,$4
= erste$3
Köpfe.Ersetzen Sie den Kopf am aktuellen Index durch zwei Kopien der aktuellen Generation in Dezimalzahl.
quelle
Pyth , 16 Bytes
Probieren Sie es online!
Interessanterweise kann ich
s
die Liste nicht reduzieren, da es sich um eine Abkürzung handelt+F
, die+
für die beiden Elemente ganz links der Liste ausgeführt wird, bis alle Elemente verarbeitet wurden. Dies bedeutet, dass die ersten paar Elemente möglicherweise einfach summiert werden, je nachdem, wo die letzte Ersetzung stattgefunden hat.quelle
Gelee , 13 Bytes
Probieren Sie es online!
Monadischer Link, der die 1-indizierte Liste der zu schneidenden Köpfe als Argument verwendet und die letzte Generation zurückgibt.
quelle
C # (Visual C # Interactive Compiler) ,
948985 Byte2 Bytes gespart dank Andrew Bauhmer
Probieren Sie es online!
quelle
a=>b=>b.Aggregate(new int[a-(a-=a)].ToList(),(c,d)=>{c[d]=++a;c.Insert(d,a);return c;})
<05AB1E , 10 Bytes
Probieren Sie es online!
quelle