Angenommen, wir möchten ein Array wie im Spiel 2048 verschieben : Wenn das Array zwei gleiche aufeinanderfolgende Elemente enthält, füge sie zu dem doppelten Wertelement zusammen. Shift muss ein neues Array zurückgeben, in dem jedes Paar aufeinanderfolgender gleicher Elemente durch ihre Summe ersetzt wird und sich Paare nicht überschneiden dürfen. Die Verschiebung wird nur einmal ausgeführt, sodass die resultierenden Werte nicht erneut zusammengeführt werden müssen. Beachten Sie, dass , wenn wir drei aufeinanderfolgenden gleichen Elemente haben, müssen wir rechtesten diejenigen summieren, so zB [2, 2, 2]
werden sollte [2, 4]
, nicht [4, 2]
.
Die Aufgabe besteht darin, die kürzeste Funktion zu schreiben, die ein Array aufnimmt und ein verschobenes Array zurückgibt.
Sie können davon ausgehen, dass alle ganzen Zahlen streng positiv sind.
Beispiele:
[] -> []
[2, 2, 4, 4] -> [4, 8]
[2, 2, 2, 4, 4, 8] -> [2, 4, 8, 8]
[2, 2, 2, 2] -> [4, 4]
[4, 4, 2, 8, 8, 2] -> [8, 2, 16, 2]
[1024, 1024, 512, 512, 256, 256] -> [2048, 1024, 512]
[3, 3, 3, 1, 1, 7, 5, 5, 5, 5] -> [3, 6, 2, 7, 10, 10]
Ich bin auch sehr an einer Lösung mit redu interessiert :)
quelle
Antworten:
Jelly ,
10 98 BytesTryItOnline oder führen Sie alle Testfälle aus
Wie?
quelle
Haskell,
475750 BytesVerwendet
reduce
(oderfold
wie es in Haskell heißt, hier eine Rechtsfaltefoldr
). Anwendungsbeispiel:map abs.foldr(#)[] $ [2,2,2,4,4,8]
->[2,4,8,8]
.Bearbeiten: +10 Bytes, damit es auch für unsortierte Arrays funktioniert. Zusammengeführte Zahlen werden als negative Werte eingefügt, um eine zweite Zusammenführung zu verhindern. Sie werden durch ein Finale korrigiert
map abs
.quelle
Brain-Flak ,
15896Probieren Sie es online!
Erläuterung:
1 Kehre die Liste um (verschiebe alles auf den anderen Stapel, aber das ist egal)
2 Führen Sie die Schritte 3 bis 6 aus, bis auf diesem Stapel nichts mehr vorhanden ist:
3 Dupliziere die beiden oberen Elemente (2 3 -> 2 3 2 3)
4 Lege eine 1 oben drauf, wenn die beiden oberen gleich sind, andernfalls eine 0 (aus dem Wiki)
5 Wenn die ersten beiden gleich waren (oben nicht Null), addieren Sie die nächsten beiden und drücken Sie das Ergebnis
6 Verschieben Sie das obere Element auf den anderen Stapel
7 Wechseln Sie zum anderen Stapel und drucken Sie implizit
quelle
PHP, 116 Bytes
oder
-4 Bytes, wenn die Ausgabe ein Array
print_r
anstelle von "json_encode" sein kann176 Bytes, um dies mit einem Regex zu lösen
quelle
for($i=count($a=$argv);--$i;)$b[]=($a[$i]==$a[$i-1])?2*$a[$i--]:$a[$i];print_r(array_reverse($b));
gleiche Idee, aber kürzer[]
brauche ich$r=[];
Danke für deine HilfeGNU sed,
41 3837Enthält +1 für -r
-3 Dank Digital Trauma
-1 Dank Seshoumara
Eingabe und Ausgabe sind unäre, durch Leerzeichen getrennte Zeichenfolgen ( basierend auf diesem Konsens ).
Probieren Sie es online!
quelle
y,!, ,
1 Byte speichern.Retina , 32
r
In Zeile 3 wird der reguläre Ausdruck von rechts nach links aktiviert. Dies bedeutet, dass die\1
Referenz vor der(1+)
Erfassungsgruppe stehen muss, auf die sie verweist.Probieren Sie es online aus.
quelle
Perl, 41 Bytes
Beinhaltet +1 für
-p
Geben Sie die Eingabesequenz für STDIN ein:
shift2048.pl
:quelle
Python, 61 Bytes
Der Boolesche Wert
b
überprüft, ob die letzten beiden Elemente minimiert werden sollen, indem überprüft wird, ob sie für Listen der Länge 1 oder 0 gleich sind. Dem letzten Element wird dann ein Multiplikator1
für Gleich oder2
für Ungleich angehängt . Es wird an das rekursive Ergebnis in der Liste angehängt, wobei am Ende so viele Elemente abgeschnitten wurden. Danke an Dennis für 1 Byte!quelle
[l[-1]<<b]
Speichert ein Byte.l[-2:-1]
ist[l[-2]]
Perl, 43 + 1 (
-p
) = 44 BytesTon Hospel hat eine Antwort von 41 Bytes gefunden , probieren Sie es aus!
-4 danke an @Ton Hospel!
Edit : hinzugefügt
\b
, da es ohne fehlgeschlagen wäre bei der Eingabe wie24 4
bei der Ausgabe28
.Laufen mit
-p
Flagge:Ich sehe eine andere Art und Weise nicht als mit
reverse
zweimal nach rechts-fach (wie gerades/(\d+) \1/$1*2/ge
würde links-fache, also2 2 2
würde4 2
statt2 4
). Also 14 Bytes verloren dankreverse
... Trotzdem denke ich, dass es einen anderen (besseren) Weg geben muss (es ist schließlich Perl!), Lass es mich wissen, wenn du es findest!quelle
reverse reverse
scheint ein bisschen langwierig. Ich bin kein Perl-Experte, aber gibt es eine Möglichkeit, eine Verknüpfung zu erstellenreverse
(wenn nichts anderes, [ab] usingeval
)?($_)
reverse
sieht aus wiereverse
kann nicht ohne Argument aufgerufen werden (auch die Beispiele zeigen , kann es sein, aber es ist nur ein Prototyp:reverse LIST
), so vergaß ich$_
das Argument Standard ist;)LIST
kann leer sein ...$_
als Standardargument verwendet, gibt das Dokument einen Prototyp ohne Parameter (wieprint
oderlenght
...) an. Oder vielleicht ist das nur ein falscher Eindruck, den ich habe.JavaScript (ES6), 68 Byte
quelle
[1024, 1024, 512, 512, 256, 256]
Wie wird aufgelöst[2048, 512, 1024]
und nicht[2048, 1024, 512]
...?Perl 5.10,
6150 Bytes (49+ 1 für Flag)Vielen Dank an Ton Hospel für das Speichern von 11 Bytes!
Regex-freie Lösung mit
-a
Flagge:Versuch es hier!
quelle
@a=($F[-1]-$b?$b:2*pop@F,@a)while$b=pop@F;say"@a"
(50 Byte)JavaScript (ES6),
686558576564 Byte1 Byte dank @ l4m2 eingespart
Für unsortierte Arrays behoben, da geklärt wurde, dass solche Eingaben zu erwarten sind.
quelle
a=>(a.reverse()+'').replace(/(.),\1/g,(c,i)=>i*2).split`,`.reverse()
?[1024, 1024, 512, 512, 256, 256]
(ich glaube, dieser Testfall wurde später hinzugefügt).f=(a,l=[],m)=>(x=a.pop())*!m-l?f(a,x).concat(l):x?f(a,2*x,1):[l]
?05AB1E , 26 Bytes
Probieren Sie es online!
Verallgemeinerte Schritte
quelle
Mathematica, 53 Bytes
Erläuterung
Teilen Sie die Eingabe in Unterlisten auf, die aus Läufen identischer Elemente bestehen. dh
{2, 2, 2, 4, 8, 8}
wird{{2, 2, 2}, {4}, {8, 8}}
.Partitionieren Sie jede der Unterlisten in Partitionslängen von höchstens 2. Dh
{{2, 2, 2}, {4}, {8, 8}}
wird{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
.Summe jeder Partition. dh
{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
wird{{4, 2}, {4}, {16}}
.Kehren Sie die Ergebnisse um, da der
Partition
Befehl von Mathematica von links nach rechts geht, die Partitionen jedoch in eine andere Richtung weisen sollen. dh{{4, 2}, {4}, {16}}
wird{{2, 4}, {4}, {16}}
.Reduzieren Sie das Ergebnis. dh
{{2, 4}, {4}, {16}}
wird{2, 4, 4, 16}
.quelle
Plus@@@
istTr/@
und ich denke, Sie können die Klammern vermeiden undJoin@@
wenn Sie##&@@
auf das Ergebnis von verwendenReverse
(habe es aber nicht getestet).Java 7, 133 Bytes
Die Eingabe ist eine ArrayList, die nur rückwärts durchläuft und bei Bedarf entfernt und verdoppelt.
quelle
Long
Referenzen in Zeile 3 mit==
. Überlegen Siea.get(i)-a.get(i-1)==0
.Perl, 37 Bytes
Beinhaltet +4 für
-0n
Mit der Eingabe als separate Zeile auf STDIN ausführen:
shift2048.pl:
quelle
Haskell, 56 Bytes
quelle
PHP,
86 100 9994 Bytesbenötigt PHP 7.0; Nimmt Werte aus Befehlszeilenargumenten.
Laufen Sie mit
-nr
oder versuchen Sie es online .quelle
for($r=[];$v=($p=array_pop)($a=&$_GET[a]);)array_unshift($r,end($a)-$v?$v:2*$p($a));print_r($r);
ist 1 Byte kürzerJulia 205 Bytes
Die aufzurufende Funktion ist
H
z.B
H([1,2,2,4,8,2,])
Dies ist keineswegs der kürzeste Weg, dies in Julia zu tun. Aber es ist so cool, dass ich es trotzdem teilen wollte.
t(a)
ist ein Werttyp, der den Wert (a) darstellt.s(a)
ist eine Instanz dieses Werttypsg
ist eine Funktion, die die Differenzwerte (unter Verwendung der Wertetypen) und die Nummern ihrer Parameter berechnet. Und das ist coolK
wickelt sich einfachg
so einExtra cooles Teil:
Dies definiert den
^
Operator, der auf Funktionen angewendet werden soll. Also dasK^s(2)(X)
ist das gleiche wieK(K(X))
soH
ist gerade AufrufK
aufK
ein paar Mal - oft genug sicherlich jeden verschachtelten Falles zum EinsturzDies kann viel, viel kürzer gemacht werden, aber dieser Weg ist einfach so lustig.
quelle
PowerShell v2 +, 81 Byte
Nimmt die Eingabe als explizites Array
$n
, kehrt sie um$n[$n.count..0]
, setzt-join
die Elemente zusammen mit einem Komma und fügt dann ein-replace
übereinstimmendes Ziffernpaar in das erste Element ein*2
, a und ist in Parens eingeschlossen. Pipes, die sich ergeben (was für die Eingabe@(2,2,4,4)
so aussieht(4*2),(2*2)
), wechseln zuiex
(kurz fürInvoke-Expression
und ähnlich wieeval
), wodurch die Multiplikation in tatsächliche Zahlen umgewandelt wird. Speichert das resultierende Array in$b
, kapselt es in Parens, um es in der Pipeline zu platzieren, und kehrt es dann$b
mit um[$b.count..0]
. Lässt die resultierenden Elemente in der Pipeline und die Ausgabe ist implizit.Testfälle
NB: In PowerShell ist das Konzept, ein leeres Array "zurückzugeben", bedeutungslos - es wird konvertiert,
$null
sobald es den Gültigkeitsbereich verlässt - und entspricht daher der Rückgabe von nichts, wie hier im ersten Beispiel beschrieben (Nach einigen boshaften Fehlern). Darüber hinaus ist die Ausgabe hier durch Leerzeichen getrennt, da dies das Standardtrennzeichen für Zeichenfolgen-Arrays ist.quelle
Javascript - 103 Bytes
quelle
[2,2,4,4]
Erträgen[2,2,4,4]
.Brain-Flak , 60 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Python 2, 94 Bytes
Probieren Sie es online aus
quelle
Julia,
7382 BytesVerwenden Sie die rechte Falte, um die Liste von hinten nach vorne zu erstellen (Sie können auch die linke Falte verwenden und die Liste am Anfang und Ende umkehren).
Wenn der Kopf der aktuellen Liste nicht mit dem nächsten Element übereinstimmt, das vorangestellt werden soll, stellen Sie ihn einfach voran.
Ansonsten entferne den Kopf der Liste (klingt grausam) und stelle das Element mal 2 voran.
Beispiel
quelle
Schläger 166 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
Japt , 12 Bytes
Probieren Sie es online!
Ausgepackt und wie es funktioniert
Ich habe eine Idee von Jonathan Allans Jelly-Lösung .
quelle
Mathematica, 51 Bytes
{Longest@a___,x_/;x>0,x_,b___}
Stimmt mit einer Liste überein, die zwei aufeinanderfolgende identische positive Zahlen enthält, und transformiert diese beiden Zahlen in-2x
.Longest
zwingt die Streichhölzer so spät wie möglich zu spielen.Der Prozess wird Schritt für Schritt veranschaulicht:
quelle
Vim, 28 Bytes
G@='?\v(\d+)\n\1<C-@>DJ@"<C-A>-@=<C-@>'<CR>
Ein Makro, das regex rückwärts nach übereinstimmenden fortlaufenden Nummern sucht und diese zusammenfügt.
Das Eingabearray muss eine Zahl pro Zeile sein. Dieses Format erspart mir Striche, was nett ist, aber der wahre Grund ist, überlappende Regex-Übereinstimmungen zu umgehen. In Anbetracht der Zeichenfolge
222
, wenn Sie/22
nur das erste Paar passen werde, nicht das überlappende zweite Paar. Die Überlappungsregeln sind unterschiedlich, wenn die beiden Paare in unterschiedlichen Zeilen beginnen. In dieser Herausforderung[2, 2, 2]
wird[2, 4]
, so das überlappende Paar passend ist kritisch.HINWEIS: Die Challenge verlangte nur einen einzigen Durchgang. Aus diesem Grund müssen Sie haben
:set nowrapscan
. Mit:set wrapscan
könnte ich eine Version erstellen, die den Job in mehreren Durchgängen abschließt, obwohl diese Lösung dies nicht immer tut.<C-@>
: Wenn Sie in einer Befehlszeile ein Literal eingeben,<CR>
ohne den Befehl auszuführen, müssen Sie es normalerweise mit einem Escapezeichen versehen<C-V>
. Aber du kannst tippen<C-@>
unescaped und es wird als behandelt werden<C-J>
/<NL>
, der wie sein wird ,<CR>
wenn Sie das Makro ausführen , aber nicht , wenn Sie eingeben. Versuchen Sie es mit Lesen:help NL-used-for-Nul
.@=
: Diesmal kann ich ein aufgezeichnetes Makro nicht einfach verwenden, da der Eingang möglicherweise keine übereinstimmenden Paare enthält. Wenn dies passiert, während ein Makro ausgeführt wird, schlägt die erfolglose Suche fehl. Geschieht dies jedoch während des (impliziten ersten) Aufzeichnungsdurchlaufs, werden die restlichen Befehle im normalen Modus ausgeführt, wodurch die Datei beschädigt wird. Der Nachteil von@=
ist, dass ich beim rekursiven Aufruf ein Byte verliere. manchmal kann man das@@
als rekursiven aufruf benutzen , aber das würde laufen@"
in diesem Fall von 4 Bytes früher ausgeführt.DJ@"<C-A>-
:DJ
löscht die Zeile und fügt die Nummer (kein Zeilenumbruch) in ein Register ein, damit ich sie als Makro für ein Zahlenargument ausführen kann<C-A>
. Ich muss-
danach, damit ich in solchen Fällen kein zweites Match bekomme[4, 2, 2]
.quelle
Perl6, 92 Bytes
quelle
Prolog (SWI) ,
9787 BytesProbieren Sie es online!
quelle