Wenn Sie eine Liste mit positiven ganzen Zahlen eingegeben haben, wobei einige durch ersetzt wurden 0
, geben Sie die Liste mit den fehlenden Zahlen aus, die in " 0
Ersetzt" geändert wurden.
Merkmale der Eingabeliste:
Die Liste hat immer eine Länge von mindestens 2.
Definieren wir die Eingabeliste als
a
und die "Originalliste" (dh die Liste vor dem Ersetzen von Zahlen durch0
s) alsb
. Für allen
,a[n]
entwederb[n]
oder0
.Für alle
n
,b[n]
entwederb[n-1] + 1
oderb[n-1] - 1
. Das heißt, die Zahlen inb
ändern sich1
bei jedem Index gegenüber dem vorherigen immer um. Das erste Element ist natürlich von dieser Regel ausgenommen.Für jeden Lauf von Nullen in
a
( , die mit aufeinander folgenden Elemente ersetzt sind0
), wobeix
die den Index des Beginns des Laufes undy
das den Zwecka[x-1]
zua[y+1]
immer entweder allein zuzunehmen oder ausschließlich abnimmt. Daher gibt es nur eine Möglichkeit, die Nullen auszufüllen.- Dies bedeutet auch, dass weder das erste noch das letzte Element des Arrays Nullen sein dürfen.
Einfacher ausgedrückt: Um eine Reihe von Nullen auszufüllen, ersetzen Sie sie einfach durch einen Bereich von der vorherigen bis zur darauf folgenden Zahl. Zum Beispiel eine Eingabe von
1 2 0 0 0 6 7
muss ausgeben
1 2 3 4 5 6 7
Da es sich um Code-Golf , wird der kürzeste Code in Bytes gewinnen.
Testfälle:
In Out
-----------------------------------------------------
1 0 0 0 5 6 0 4 0 0 1 | 1 2 3 4 5 6 5 4 3 2 1
7 6 0 0 3 0 0 0 7 0 5 | 7 6 5 4 3 4 5 6 7 6 5
1 0 3 0 5 0 3 0 5 0 7 | 1 2 3 4 5 4 3 4 5 6 7
14 0 0 0 0 0 0 0 0 23 | 14 15 16 17 18 19 20 21 22 23
quelle
0
kann unser Programm einen anderen Wert annehmen wienull
?0
.Antworten:
JavaScript (ES6),
72 66 64 5453 Byte12 Bytes gespart dank @Neil!
1 Byte dank @IsmaelMiguel gespeichert
Ziemlich gut für JavaScript.
Probieren Sie es online aus (alle Browser funktionieren)
Erläuterung
quelle
a.find((q,r)=>r>i&&q)>b?++b:--b
ist dasselbe wieb+=a.find((q,r)=>r>i&&q)>b||-1
MATL , 11
12BytesFunktioniert mit der aktuellen Version (13.0.0) der Sprache / des Compilers.
Probieren Sie es online!
quelle
Haskell,
686158 BytesAnwendungsbeispiel:
g.filter(>0) $ [7,6,0,0,3,0,0,0,7,0,5]
->[7,6,5,4,3,4,5,6,7,6,5]
.So funktioniert es: Nullen aus der Eingabe entfernen und dann aufrufen
g
. Seia
das erste undb
dann das zweite Element der verbleibenden Liste. Verketten die Listen vona
nach obenb-1
und vona
unten zub+1
(einer von ihnen wird leer sein) und einen rekursiven Aufruf mita
gesunken.Edit: @Zgarb hat 3 Bytes gespeichert. Vielen Dank!
quelle
Mathematica, 59 Bytes
Testfall
quelle
Perl,
4745443937 BytesBeinhaltet +1 für
-p
Erwartet die Liste auf stdin. Beispiel: echo 1 0 3 0 1 | perl -p file.pl
quelle
Jelly,
1211 BytesProbieren Sie es online!
Alternative Version, 8 Bytes (nicht konkurrierend)
Leider wurde Jelly's
pop
in der neuesten Version vor dieser Herausforderung nicht als iterabel bezeichnet. Dies wurde behoben und das Folgende funktioniert in der aktuellen Version.Probieren Sie es online!
Wie es funktioniert
In der alternativen Version
ḢWW;
wird unnötig. Da das erste Element jedoch vor dem Poppen in iterierbar umgewandelt wird, wird es tatsächlich nicht geändert. Das FinaleḊ
entfernt das Duplikat des ersten Elements.quelle
Retina,
393431 Bytes3 Bytes gespart dank @Martin.
Übernimmt die Eingabe und gibt die Ausgabe in unary.
Der Code füllt iterativ jede leere Stelle (0) mit
previous_number - 1 + 2 * if_next_nonzero_number_bigger
.previous_number - 1
ist$1
undif_next_nonzero_number_bigger
ist$3
.Bei dezimaler E / A ist der Code 51 Byte lang, wie Sie im Online-Interpreter mit allen Testfällen sehen können .
quelle
1
im Lookahead weglassen .GNU Sed (mit
exec
Erweiterung durch bash), 61Die Punktzahl enthält +1 für die
-r
Option zum Beruhigen.0
s und ersetze sie..
{1..4}
für die lokalen Endpunkte zu erstellen . Das Schöne an den Bash-Klammer-Erweiterungen ist, dass die generierte Sequenz immer in die richtige Richtung verläuft, unabhängig davon, ob der Anfang oder das Ende größer ist.e
Option für dens
Befehl, um bash aufzurufen und diese Klammererweiterung auszuwerten0
s gefunden werden, springen Sie zum Anfang zurück.Ideone.
quelle
Python 2,
195111 Bytes (danke Alex !)Eingabe: muss ein
[list]
von Ints seinAusgabe:
[list]
von Intsquelle
Perl,
8582 Bytesbeinhaltet +1 für
-p
Erwartet die Liste auf stdin. Beispiel:
echo 1 0 3 0 1 | perl -p file.pl
.Dies verwendet einen verschachtelten regulären Ausdruck. Etwas lesbar:
quelle
Python 2,
9288 Bytes(Zwischenvariable entfernt)
quelle
Pyth, 17 Bytes
So funktioniert es:
Mit anderen Worten: Alle Nullen werden aus der Eingabe entfernt, und zwischen jedem Element wird ein exklusiver Bereich eingefügt. Dieser Bereich ist für Elemente mit nur einem Abstand Null.
quelle
05AB1E , 3 Bytes (nicht konkurrierend)
Dies wurde nach der Herausforderung hinzugefügt. Code:
Erläuterung:
Probieren Sie es online! oder Überprüfen Sie alle Testfälle!
quelle
Vim: 231 Schlüsselbefehle
Beachten Sie, dass jedes ^ vor einem Zeichen bedeutet, dass Sie die Kontrolle behalten sollten, während Sie dieses Zeichen eingeben
Schritte, damit Sie dies auch ausführen können!
:s/\^V/<Ctrl-V><Ctrl-V>/g
und drücken Sie die Eingabetaste (die beiden s sollten ein blaues ^ V ergeben):s/\^R/<Ctrl-V><Ctrl-R>/g
und drücken Sie die Eingabetaste (Sie sollten jetzt blau ^ Rs sehen):s/\^X/<Ctrl-V><Ctrl-X>/g
und drücken Sie die Eingabetaste (Sie sollten jetzt ein blaues ^ X sehen):s/\^O/<Ctrl-V><Ctrl-O>/g
und drücken Sie die Eingabetaste:s/\^A/<Ctrl-V><Ctrl-A>/g
und drücken Sie die Eingabetaste:s/\^\[/<Ctrl-V><Ctrl-[>/g
und drücken Sie die Eingabetaste (dieser Befehl ist etwas anders, weil ich das [entkommen musste)0"yy$
. Der Befehl ist jetzt im y-Register gespeichert@y
Wenn jemand eine bessere Möglichkeit zum Teilen des Befehls kennt, lassen Sie es mich bitte wissen. Ich weiß, das ist langwierig, aber es ist das Beste, was ich mir vorstellen kann.
Input-Output
Die Eingabezeichenfolge sollte in jeder Zeile der Datei einzeln stehen. 1 0 0 4 3 0 0 0 7
Die Ausgabe überschreibt einfach die Eingabezeichenfolge 1 2 3 4 3 4 5 6 7
Erläuterung
Algorithmus
Verwendete Makros
@e - Auf Ende prüfen. An die letzte Nummer wird ein e angehängt. Wenn die Zahl unter dem Cursor ein e am Ende hat, löschen Sie das e und stoppen Sie die Ausführung. Andernfalls starten Sie einen Interpolationszyklus mit @b.
@b - Interpolationszyklus starten. Speichern Sie die Zahl unter dem Cursor für eine Subtraktionsoperation (@s) und suchen Sie dann den nächsten Ausdruck ungleich Null (@f)
@s - Speichert den in @d zu verwendenden Subtraktionsbefehl. Es ist einfach,
(val)^X
wo(val)
die Nummer zu Beginn des Interpolationsschritts ist. Dies wird mit dem Befehl @b festgelegt.@f - Finde den nächsten Ausdruck ungleich Null. Schreiben Sie den aktuellen Wert in das unbenannte Register, schreiben Sie
@f @d
in die nächste Zeile und führen Sie dann @z aus. Dies wiederholt diesen Befehl, wenn die Zahl Null ist, und führt @d aus, wenn dies nicht der Fall ist.@z - Bedingte Ausführung, wenn das unbenannte Register 0 ist. Dieser Befehl erwartet zwei Befehle in einer neuen Zeile im Format
command1 command2
. Wenn das unbenannte Register 0 ist,command1
wird ausgeführt, ansonstencommand2
wird ausgeführt. Beachten Sie, dass keiner der Befehle Leerzeichen enthalten kann.@t - Temporäres Befehlsregister. Speichert verschiedene Befehle für kurze Zeit, bevor sie ausgeführt werden. Wird hauptsächlich in if-Anweisungen verwendet.
@d - Interpolationsrichtung bestimmen. Subtrahiert die erste Zahl in der Sequenz von der Zahl unter dem Cursor (mit @s). Wenn das Ergebnis negativ ist, muss die Interpolation dekrementiert werden, damit ^ X in @a gespeichert wird. Andernfalls sollten wir erhöhen, damit ^ A in @a gespeichert wird. Sobald dies gespeichert ist, gehen Sie zurück zum Anfang dieses Interpolationszyklus und führen Sie @i aus, um tatsächlich zu interpolieren
@a - Speichert entweder
^A
oder^X
zum Inkrementieren oder Dekrementieren während des Interpolationsschritts. Dies wird mit dem Befehl @d festgelegt.@i - Interpolieren. Kopieren Sie die Nummer an der aktuellen Position nach @x und wechseln Sie zur nächsten Nummer. Wenn diese Zahl Null ist, ersetzen Sie sie durch @x und führen Sie @a aus, um sie ordnungsgemäß nach oben oder unten zu ändern. Wiederholen Sie dann diesen Befehl. Wenn die Zahl keine Null ist, haben wir das Ende dieses Interpolationszyklus erreicht. Ein neues sollte mit dieser Nummer als Anfang gestartet werden. Führen Sie also @e aus, um nach dem Ende zu suchen, und führen Sie es erneut aus.
@x - Temporäres Speicherregister. Wird im Interpolationsbefehl verwendet (@i)
Tastenanschläge aufteilen
quelle
Python 3.5, 159 Bytes
eine rekursive Lösung
Ungolfed
In der Golf-Lösung ersetze ich Bedingungen, indem ich die Tatsache nutze, dass
h*True=h
undh*False=[]
Ergebnis
quelle
Perl 6 , 54 Bytes
quelle
MATLAB,
393837 BytesAnonyme Funktion, die linear zwischen den Punkten in interpoliert
a
.find(a)
ist ein Array von Indizes von Nicht-Null-Elementen ina
unda(a>0)
sind die positiven Werte. 1 Byte gespart dank des Vorschlags eines Freundes von>
anstatt~=
.quelle