Bei einem Array nicht negativer Ganzzahlen besteht Ihre Aufgabe darin, nur bestimmte Elemente davon beizubehalten, wie im Folgenden beschrieben.
Angenommen, das Array ist
[1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Zuerst sollten Sie das erste Element des Arrays
n
. Behalten Sie die erstenn
Elemente und werfen Sie das nächste weg (werfen Sie dasn+1
th weg). Das neue Array ist[1, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Dann greifen Sie zu dem Element, das dem entfernten folgt, und tun genau dasselbe. Wenn wir den Prozess erneut anwenden, erhalten wir
[1, 2, 11, 5, 2, 0, 13, 10, 1]
Sie wiederholen den Vorgang, bis Sie außerhalb der Grenzen des Arrays ankommen bzw. keine Elemente mehr im Array vorhanden sind. Wir hören auf, weil
11
höher als die Länge des Arrays ist.Nun sollten Sie das Ergebnis ausgeben.
Die Eingabe / Ausgabe kann in jeder Standardform erfolgen. Das Array wird niemals leer sein und nur nicht negative ganze Zahlen enthalten. Alle Standardlücken sind verboten.
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes!
Testfälle
Eingabe -> Ausgabe [1, 2, 3, 4, 5] -> [1, 3, 4] [6, 1, 0, 5, 6] -> [6, 1, 0, 5, 6] [1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1] -> [1, 2, 11, 5, 2, 0, 13, 10, 1] [2, 2, 2, 2, 2] -> [2, 2] [1, 2, 3, 1, 2, 3, 1, 2, 3] -> [1, 2] [3, 1, 2, 4, 0] -> [] *
* Der letzte Testfall beinhaltet 0
, also habe ich beschlossen, den Prozess so zu posten, dass er klarer ist:
[3, 1, 2, 4, 0] --> [3, 1, 2, 0] --> [1, 2, 0] --> [1, 0] --> [0] --> [] )
( Inspiriert von dieser Herausforderung von Erik dem Outgolfer )
2
im ersten Schritt statt entfernt3
?[1, 2, 3, 1, 2, 3, 1, 2, 3]
n
" wechseln, fangen Sie immer am Anfang des Arrays an, um dien
Elemente beizubehalten. Nicht (wie ich auf den ersten Blick dachte)n
Elemente dort aufbewahren, wo das erste Element ist, dasn
Sie bewerten?Antworten:
Pyth, 18 Bytes
Probieren Sie es hier aus.
quelle
JavaScript (ES6), 45 Byte
Testfälle
Code-Snippet anzeigen
quelle
Haskell , 50 Bytes
g.pure.(0:)
ist eine anonyme Funktion, die eine Liste vonInt
s aufnimmt und zurückgibt(g.pure.(0:))[1,2,3,4,5]
.Probieren Sie es online!
Wie es funktioniert
g
ein Tupelargument, das eine geteilte Liste darstellt.a
ist die Liste der Anfangselemente, die im vorherigen Schritt_
gespeichert wurde,b
ist das zu verwerfende Element , ist das nächste als Länge zu verwendende Element undc
sind die verbleibenden Elemente.b
, wird eine neue Aufteilung durchgeführt und es wird eineg
Rekursion durchgeführt. Ansonsten stoppt es mita
dem Ergebnis.g.pure.(0:)
startet alles, indem sieg
mit dem Tupel aufruft([],0:l)
, wol
sich die Eingabe befindet und0
von sofort verworfen wirdg
.pure
Hier wird dieApplicative
Instanz für (binäre) Tupel verwendet, und mit dem Ergebnistyp wird([Int],[Int])
das Argument bequem als zweites Element in ein Tupel mit[]
als erstem Element eingefügt.quelle
Python 3 , 59 Bytes
Probieren Sie es online!
quelle
Haskell , 51 Bytes
Probieren Sie es online! Beispiel Nutzung:
f [1,2,3,4,5]
.quelle
Java 8, 68 Bytes
Dieses Lambda akzeptiert eine veränderbare
List<Integer>
(unterstütztremove(int)
zBArrayList
). Ausgang ist mutierter Eingang. Zuweisen zuConsumer<List<Integer>>
.Probieren Sie es online
Der Kontrollfluss für dieses Problem ist sehr ärgerlich. Bei jeder Iteration müssen wir ein Element entfernen und das Element an der nächsten Position abrufen. Beide Operationen erfordern eine Bereichsprüfung (und beide können die Programmbeendigung auslösen). Eine Strategie besteht darin, beide Operationen in einer einzigen Schleifeniteration auszuführen, wobei die Indexaktualisierung durch eine eigene Bereichsprüfung geschützt wird. Eine andere Strategie, die sich als kürzer herausgestellt hat, besteht darin, bei jeder Schleifeniteration zwischen den Operationen zu wechseln. Dies ist die Aufgabe dieser Lösung.
quelle
APL (Dyalog Classic) , 32 Byte
Erläuterung
Probieren Sie es online!
quelle
Perl 5 , 38 + 1 (-a) = 39 Bytes
Probieren Sie es online!
quelle
Haskell, 99 Bytes (88 ohne Einrückung)
quelle
VI,
31-25Bytes<C-?>
entsprichtControl + ?
, und<Esc>
zuEscape
offensichtlich. Diese zählen jeweils 1 Byte (siehe Meta ).Eingang
Die Eingabedatei sollte 1 Ganzzahl pro Zeile + 1 Leerzeile am Ende enthalten. Beispiel:
Wir können jede Zeile der Eingabedatei als Array-Element
1 :: 2 :: 3 :: 4 :: 5 :: []
anzeigen, z. B. in einigen Sprachen (z. B. caml).Starten
Sie können vi mit dem folgenden Befehl starten und die Lösung Strich für Strich eingeben:
Sie können auch diesen Einzeiler verwenden:
Dies sollte eine Datei
output
mit dem richtigen Ergebnis aus einer Eingabedatei erzeugeninput
.Erklärungen
Um die Lösung vorzustellen, stelle ich zunächst eine 19-Byte-Lösung vor, die nur für Arrays ohne 0 funktioniert. Diese Lösung verwendet ein rekursives Makro, das in der endgültigen Lösung nur geringfügig geändert wurde:
Erklärung einer Teillösung
Der Trick dabei ist, das
"0
Register zum Speichern der aktuellen Ganzzahl (und des Zeilenumbruchs, sehr wichtig) zu verwenden. Daher@0
erlaubt der Befehl ,n
Zeilen zu springen (n
den Wert von aufzurufen"0
). Wenn der Sprung die Anzahl der Zeilen in der Datei überschreitet, schlägt das Makro fehl, und das Programm stoppt (je nach Bedarf außerhalb der Array-Grenzen).Diese Lösung funktioniert aber nicht, wenn die Eingabe enthält
0
. Tatsächlich springt , wenn der"0
Registerwert gleich ist0
,@0
eine Zeile (aufgrund des Zeilenumbruchs), nicht so,0
wie wir es wollten. Der nächste Befehl (dd
) löscht also nicht die 0. Ganzzahl, sondern die 1. (nicht korrekt).Eine gültige Lösung für dieses
0
Problem besteht darin, die Ganzzahl vor dem Ziehen immer zu erhöhen und unmittelbar danach zu dekrementieren. Somit@0
springt der Befehl übern+1
Zeilen (n
ist die aktuelle Ganzzahl, die inkrementiert wurde). Esk
ist dann ein Befehl erforderlich, um in die Zeilen
(vorherige Zeile) zu wechseln. Mit diesem Trick wird eine leere Zeile am Ende der Eingabedatei benötigt, um zu vermeiden, dass das Array verlassen wird (wodurch das Programm beendet wird), da wir jetzt immern+1
Zeilen springen , bevor wir zur vorherigen Zeile springen.Erläuterung der endgültigen Lösung
Wenn Sie den Makro-Inhalt vor der Registrierung in die Datei schreiben, können Sie einige Bytes sparen:
qa...q
und Rückgängigmachen aller Änderungen nach der Registrierung:let @a="..."
)Bearbeitungen
# 1
quelle
Pyth, 32 Bytes
Probieren Sie es online aus
quelle
#VlQ.(Q@QN;Q
erledigt den Job in 12 Bytes, und ich bin mir ziemlich sicher, dass es noch mehr Golf spielen kannW<Zl=Q+<Q@QZ>Qh@QZ=Z@QZ)Q
(25). Der Ansatz von pizzakingme ist jedoch viel besser.#VlQ .(Q@QN)%;Q
. Feedback von Pyth-Golfern wäre willkommen, ich lerne auch noch!C # (.NET Core) , 74 Byte
Probieren Sie es online!
Dies nimmt eine Liste von Ints auf und ändert sie. Ich habe einige Java-Antworten gesehen, die Importe umgehen, indem sie den vollständig qualifizierten Namen in der Lambda-Argumentdefinition verwenden. Wenn dies nicht erlaubt ist, kann ich diese Antwort entfernen.
quelle
System.Collections.Generic.List<int>
stattusing System.Collections.Generic
und fügen hinzu , dass in der Byte - Zählung. Aber ich denke, es ist nicht anders als ein Array zu verwenden.using
wenn du willst. Solange sich das Lambda selbst nicht auf die Anweisung stützt, müsste es nicht in die Byteanzahl einbezogen werden. Persönlich verwende ich im Testcode immer vollqualifizierte Namen, damit klar und einfach nachvollziehbar ist, welche Importe das Lambda verwendet.R ,
6453 BytesRekursive Funktion. Hat man einen Pflichteintrag,
a
kann die Liste übersprungen werden.i
ist der Index für die Anzahl der zu überspringenden Elemente (standardmäßig1
) undd
der Index für das nächste Element, nachdem der erforderliche Wert entfernt wurde. Dies ist auch der Index für das zu entfernende Element. Gibtnumeric(0)
einen leeren Vektor für eine leere Ausgabe zurück.Probieren Sie es online!
Ungolfed:
quelle