Herausforderung
Wenn Sie eine Liste von Ganzzahlen erhalten haben, geben Sie die Liste dieser Ganzzahlen zurück, nachdem Sie wiederholt alle Paare benachbarter gleicher Elemente entfernt haben.
Beachten Sie, dass bei einem Lauf mit ungerader Länge und gleichen Zahlen einer von ihnen übrig bleibt und nicht Teil eines Paares ist.
Beispiel:
[0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0]
Zuerst sollten Sie , und entfernen 0, 0
, um Folgendes zu erhalten:4, 4
1, 1
[0, 1, 2, 2, 0]
Nun sollten Sie entfernen 2, 2
:
[0, 1, 0]
Und das ist das Endergebnis.
Testfälle
[] -> [] [1] -> [1] [1, 1] -> [] [1, 2] -> [1, 2] [11, 11, 11] -> [11] [1, 22, 1] -> [1, 22, 1] [-31, 46, -31, 46] -> [-31, 46, -31, 46] [1, 0, 0, 1] -> [] [5, 3, 10, 10, 5] -> [5, 3, 5] [5, 3, 3, 3, 5] -> [5, 3, 5] [0, -2, 4, 4, -2, 0] -> [] [0, 2, -14, -14, 2, 0, -1] -> [-1] [0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0] -> [0, 1, 0] [3, 5, 4, 4, 8, 26, 26, 8, 5] -> [3] [-89, 89, -87, -8, 8, 88] -> [-89, 89, -87, -8, 8, 88]
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in jeder Sprache!
code-golf
array-manipulation
musicman523
quelle
quelle
[14, 14, 14]
um[14]
1,2
,11,12
usw.)-89,89,-87,-8,-88
? Sowohl meine (nicht hochgeladene) Japt-Lösung als auch Frys Retina-Lösung schlagen dort fehl und werden ausgegeben--87,8
.Antworten:
Gelee , 10 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Ẏ
anstelle von verwendenF
, werden Sie auch Listen in Ihrer Liste unterstützen.œ^
von Integer zu Array gewechselt. Da 1D-Arrays nicht zu 2D-Arrays heraufgestuft werden, funktioniert es nur für ein Array von Zahlen.ŒgWẎ$œ^/$€ẎµÐL
... oh, warte, das ist zu naiv. : PNetzhaut ,
1715 BytesProbieren Sie es online!
2 Bytes gespart dank Neil und Martin!
Ersetzt jedes Zahlenpaar durch nichts. Dieser Vorgang wird solange wiederholt, bis keine Änderungen mehr vorgenommen wurden.
quelle
-89 89 -87 -88 -88
, welche Ausgänge--87
._
Negative benenne , wie es in einigen Sprachen üblich ist._89 89 _87 _8 _88
Ausgeben scheitern wird_89 89 _87 8
. Entschuldigung: \m
, um das\b
s in^
und umzuwandeln$
.Mathematica 29 Bytes
Dies entfernt wiederholt Paare gleicher benachbarter Elemente,
a_,a_
bis keine mehr vorhanden sind.quelle
Python 2 , 57 Bytes
Probieren Sie es online!
Erstellt iterativ die Ausgabeliste, indem das nächste Element angehängt wird und das Ende abgeschnitten wird, wenn das angehängte Element dem vorherigen Element entspricht. Die Überprüfung des vorletzten Elements
r[-2:-1]!=[x]
ist umständlich, da die Liste möglicherweise nur eine Länge von 1 hat.quelle
Gelee , 15 Bytes
Probieren Sie es online!
Erläuterung
-1 Byte dank Meilen und behoben :)
quelle
ValueError: not enough values to unpack (expected 2, got 0)
für den Testfall[1,2,2,1]
. Beachten Sie auch, dass sich die leere Ausgabe von unterscheidet[]
und von2
unterscheidet[2]
.Œr;ṪḂ$$€ŒṙµÐL
. Um den Fehler zu vermeiden, ersetzen Sie ihnŒṙ
durch,x/€F
da die Lauflängendekodierung einen Fehler auslöst, wenn eine leere Liste angegeben wird. Wenn Sie die Ausgabe als Liste anzeigen möchten,ŒṘ
wird sie beim Heften angezeigt .ÇŒṘ
in der Fußzeile anzuzeigen , den letzten Link aufzurufen (Ç
) und eine Python-Darstellung auszudrucken (ŒṘ
). . Der Fehler ist jedoch möglicherweise nicht akzeptabel.JavaScript (ES6),
5453 Bytes1 Byte dank @ThePirateBay gespeichert
Naive rekursive Lösung, kann verbesserungsfähig sein.
quelle
i=0
miti=-2
undi-1
miti
welcher -1 Byte insgesamt.i+1
? (Ich habe das schon++
mal mit dem Verschieben versucht und konnte es nicht herausfinden, obwohl ich nur eine Minute Zeit hatte)Python 2 , 73 Bytes
Da ich nicht genug Reputation habe, um einen Kommentar abzugeben, habe ich @officialaimms Antwort so geändert, dass r! = [] Anstelle von len (r) verwendet wird, um ein Byte zu speichern. Sehr clevere Lösung für Sie, @officialaimm!
Probieren Sie es online!
Es ist wieder viel zu spät ... warum bin ich überhaupt noch wach?
quelle
Python,
6058 BytesProbieren Sie es online!
quelle
[a[0]]
isa[:1]
MATL , 7 Bytes
In einigen Testfällen, in denen das Ergebnis leer ist, wird das Programm mit einem Fehler beendet, es wird jedoch in jedem Fall die richtige (leere) Ausgabe erzeugt.
Probieren Sie es online!Oder überprüfen Sie die Testfälle mit nicht leerer Ausgabe .
Erläuterung
Betrachten Sie die Eingabe
Jede Iteration entfernt Paare von aufeinanderfolgenden Paaren. Die erste Iteration reduziert das Array auf
Die zwei Werte
2
, die jetzt benachbart sind, waren im anfänglichen Array nicht benachbart. Aus diesem Grund ist eine zweite Iteration erforderlich, die Folgendes ergibt:Weitere Iterationen lassen dies unverändert. Die Anzahl der erforderlichen Iterationen wird durch die Eingabegröße begrenzt.
Ein leeres Zwischenergebnis führt dazu, dass die Lauflängendecodierungsfunktion (
Y"
) in der aktuellen Version der Sprache fehlerhaft ist. Die Ausgabe ist jedoch nach Bedarf leer.quelle
x86-Maschinencode (32-Bit-geschützter Modus), 36 Byte
Die obigen Bytes des Maschinencodes definieren eine Funktion, die ein Array als Eingabe annimmt, benachbarte Duplikate direkt komprimiert und ohne Rückgabe eines Ergebnisses zum Aufrufer zurückkehrt. Es folgt der
__fastcall
Aufrufkonvention und übergibt die beiden Parameter inECX
undEDX
Register sind.Der erste Parameter (
ECX
) ist ein Zeiger auf das erste Element im Array mit 32-Bit-Ganzzahlen (wenn das Array leer ist, kann es auf eine beliebige Stelle im Speicher verweisen). Der zweite Parameter (EDX
) ist ein Zeiger auf eine 32-Bit-Ganzzahl, die die Länge des Arrays enthält.Die Funktion ändert bei Bedarf die Elemente des Arrays an Ort und Stelle und aktualisiert auch die Länge, um die neue Länge des komprimierten Arrays anzugeben. Dies ist eine ungewöhnliche Methode, um Eingaben vorzunehmen und Ausgaben zurückzugeben, aber in der Assemblersprache haben Sie wirklich keine andere Wahl. Wie in C werden Arrays in der Sprache tatsächlich als Zeiger auf das erste Element und eine Länge dargestellt . Das einzige, was hier ein bisschen seltsam ist, ist die Länge nach Bezug zu nehmen . Wenn wir das nicht machen würden, gäbe es keine Möglichkeit, das Array zu verkürzen. Der Code würde gut funktionieren, aber die Ausgabe würde Müll enthalten, da der Aufrufer nicht wissen würde, wo er das Drucken von Elementen aus dem komprimierten Array stoppen soll.
Ungolfed Assembler-Mnemonik:
Die Implementierung war von meiner C ++ 11-Antwort inspiriert , wurde jedoch in der Assembly akribisch umgeschrieben und hinsichtlich der Größe optimiert. Assembly ist eine viel bessere Golfsprache. :-)
Hinweis: Da dieser Code die Zeichenfolge Anweisungen verwendet, ist nicht davon ausgehen , dass die Richtungs - Markierung klar ist (
DF
== 0). Dies ist in den meisten Betriebsumgebungen eine vernünftige Annahme, da das ABI normalerweise erfordert, dass DF klar ist. Wenn dies nicht garantiert werden kann, muss ein 1-Byte-CLD
Befehl (0xFC
) am Anfang des Codes eingefügt werden.Es wird auch, wie erwähnt, ein 32-Bit-geschützter Modus angenommen - insbesondere ein "flaches" Speichermodell, bei dem das zusätzliche Segment (
ES
) mit dem Datensegment ( ) identisch istDS
.quelle
Batch, 133 Bytes
Ich setze s auf,
.
weil Batch verwirrt wird, wenn es nur Duplikate gibt. Ich muss auch verwenden,shift/1
damit ich%0%s:~1%
die Argumentliste auf das neue Array und die neue Schleife setzen kann.quelle
Gelee , 12 Bytes
Ein monadischer Link, der Nummernlisten aufnimmt und zurückgibt.
Probieren Sie es online! oder sehen Sie sich eine Testsuite an
Wie?
quelle
ṁLḂ$$€
entsprichtḣLḂ$$€
dem, durchṫḊ¿€3$
das SieṫḊ¿€3
hier ein Dyad / Nilad-Paar bilden können.Ḋ
wird zurückgegeben,[]
während wenn len (x) == 0Ḋ
ist0
, beide sind falsche Werte. Die Eingabe fürḊ
ist natürlich der aktuelle Wert undṫ
hat den aktuellen Wert als linkes Argument und3
als rechtes. Wenn len (x) == 4 ist, ist es dasselbe wieṫ3ṫ3
oderṫ5
lässt Sie mit[]
.x
in Ihrer Beschreibung dort wirklich der aktuelle Wert? Probieren Sie dies für Größe aus.Japt , 34 Bytes
Entfernt rekursiv Paare gleicher Zahlen, bis keine mehr vorhanden sind.
Probieren Sie es online!mit dem
-Q
Flag, um das Ausgabearray zu formatieren.Führen Sie alle Testfälle mit meinem WIP-CodePen aus.
quelle
05AB1E , 15 Bytes
Probieren Sie es online!
Erläuterung
quelle
05AB1E , 13 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Haskell , 33 Bytes
Probieren Sie es online!
quelle
Python 2 ,
74 7066 Bytesr
stattlen(r)
reicht es aus, die Leere der Liste / des Stapels zu überprüfen.[i]==r[-1:]
Python 2 , 66 Bytes
Probieren Sie es online!
quelle
len(r)
nur darin besteht, zu überprüfen, ob die Liste leer ist oder nicht, sollten Sie in der Lage sein, sie durch nur zu ersetzenr
, denke ich?Clojure, 100 Bytes
Ich bin mir nicht sicher, ob dies der kürzeste ist.
quelle
Bash, 82 Bytes
Es gibt wahrscheinlich einen Ausweg aus all diesen Dingen
cat
, aber ich weiß es nicht.quelle
Schale , 10 Bytes
Probieren Sie es online!
Erläuterung
quelle
PHP, 81 Bytes
Funktion, rufen Sie per Referenz an oder versuchen Sie es online .
schlägt bei leerer Eingabe fehl; einlegen
$i&&
oder$a&&
vorher--$i
fixieren.quelle
V , 10 Bytes
Probieren Sie es online!
Komprimierte Regex:
:%s/\(.\+\)\n\1\n*
. Der optionale Zeilenumbruch ist so, dass er auch am Ende der Datei funktioniert. Wenn ich davon ausgehe, dass es nach dem Ende eine neue Zeile gibt, wären es 8 Bytes ... aber das scheint eine Strecke zu seinquelle
dc ,
8478 BytesProbieren Sie es online!
Auspacken ein wenig aus der Reihenfolge in einem Versuch der Klarheit:
[0syzdsz1<Olydsx0<Alx1+lz>M]dsMxf
Das HauptmakroM
setzt den Zählery
auf 0 zurück, ruft die Anzahl der Elemente auf dem Stapel ab, speichert diese im Registerz
und führt dann ein Makro aus,O
wenn sich mindestens zwei Elemente auf dem Stapel befinden. Sobald derO
Vorgang abgeschlossen ist, wird der Zähler geladeny
und in das Register kopiert,x
bevor überprüft wird, ob ery
ungleich Null ist (was Stapel bedeutet).
enthält Daten). In diesem Fall wird ein Makro ausgeführtA
. Abschließend wird überprüft, ob die ursprüngliche Stapelgröße größer als die aktuelle Stapelgröße ist, und in diesem Fall eine erneute Ausführung durchgeführt. Sobald es fertig ist, druckt es den Stapel mitf
.[dStrdStr!=Pz1<O]sO
MakroO
speichert die obersten zwei Elemente auf dem Stapel vorübergehend im Stapelt
. Es vergleicht dann die beiden obersten Elemente und führt ein Makro aus,P
wenn sie nicht gleich sind. Schließlich wird geprüft, ob sich mindestens zwei Elemente auf dem Stapel befinden, und in diesem Fall wird es von selbst ausgeführt.[LtLtS.ly1+sy]sP
MakroP
nimmt die beiden Gegenstände vom Stapelt
, schiebt den oberen zurück auf den Hauptstapel und schiebt den folgenden auf den Stapel.
. Dann wird der Zähler erhöhty
.[L.ly1-dsy0<A]sA
MakroA
nimmt Stapel.
und verwandelt es zurück in den primären Stapel. Dabei wird der Zähler dekrementiert,y
bis nichts mehr zu drücken ist.Bearbeitet zur Erklärung und um 6 Bytes zu sparen, da ich die Größe des Stapels unnötig gespeichert habe.
quelle
C ++ 11, 161 Bytes
Der obige Code definiert eine Funktion,
f
die einenstd::vector<int>
Verweis aufnimmt , ihn an Ort und Stelle ändert, um benachbarte Duplikate gemäß der Spezifikation zu reduzieren, und dann zurückgibt.Probieren Sie es online!
Bevor ich die Byteanzahl überprüfte, dachte ich, dass dies ziemlich schlanker Code war. Über 150 Bytes ist jedoch nicht so gut! Entweder bin ich nicht sehr gut im Golfen oder C ++ ist keine sehr gute Golfsprache…
Ungolfed:
quelle
std::adjacent_find
! Ich frage mich , ob Sie diese Funktion selbst umgesetzt , wenn sie kürzer sein würde, da Sie entfernen können#include <algorithm>
auchstd::unique
an, um das zu tun, was ich brauchte. Aber es braucht viel Code, um die gesamte Logik zu realisieren, und als ich darüber hinwegkamstd::adjacent_find
, war es ziemlich offensichtlich, dass dies ein Gewinner in Bezug auf die Codegröße war.PHP, 74 Bytes
Funktion c ruft durch Referenz auf, um das Array zu verkleinern. Probieren Sie es online aus .
Interessanterweise funktioniert dies in Php5.6, aber nicht in 7.
quelle
R ,
5754 BytesProbieren Sie es online!
Verwendet eine Lauflängencodierung, um Paare zu entfernen.
quelle
J , 38 Bytes
Probieren Sie es online!
quelle
GNU sed , 19 + 1 = 20 Bytes
+1 Byte für
-r
Flag.Probieren Sie es online!
quelle
Pyth, 10 Bytes
Ein bisschen zu spät zur Party.
Test Suite.
quelle