Einführung
Angenommen, Sie möchten die Endmaxima einer Liste von Zahlen berechnen, dh das Maximum jedes nicht leeren Suffixes. Eine Möglichkeit besteht darin, wiederholt eine Nummer auszuwählen und durch eine höhere Nummer zu ersetzen, bis dies nicht mehr möglich ist. In dieser Herausforderung besteht Ihre Aufgabe darin, einen Schritt dieses Algorithmus auszuführen.
Die Aufgabe
Ihre Eingabe ist eine Liste von Ganzzahlen L , die leer sein können. Ihre Ausgabe soll die Liste L sein, in der genau eine Zahl L i durch eine andere L j ersetzt wurde , wobei L i <L j und i <j .
Mit anderen Worten, Sie müssen eine Zahl durch eine höhere Zahl ersetzen, die danach auftritt.
Sie können i und j unter allen gültigen Paaren frei wählen , und die Wahl kann nicht deterministisch sein.
Wenn solche i und j nicht existieren (dh L nicht ansteigend ist), soll Ihre Ausgabe L unverändert sein.
Beispiel
Betrachten Sie die Eingabe L = [3, 1, 4, -1, 2] . Die möglichen Operationen sind 3 durch 4 zu ersetzen, 1 durch 4 zu ersetzen, 1 durch 2 zu ersetzen oder -1 durch 2 zu ersetzen . Somit sind die möglichen Ausgaben:
[ 3 , 1 , 4 , -1 , 2 ]
------------------------------
[( 4), 1 ,( 4), -1 , 2 ]
[ 3 ,( 4),( 4), -1 , 2 ]
[ 3 ,( 2), 4 , -1 ,( 2)]
[ 3 , 1 , 4 ,( 2),( 2)]
Wenn Sie die Operation genügend oft wiederholen, ist das Endergebnis [4,4,4,2,2] , was genau die Liste der Schwanzmaxima von L ist .
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Im letzteren Fall können Sie die Eingabe ändern, anstatt ein neues Array zurückzugeben, sofern Ihre Sprache dies zulässt. Eingabe- und Ausgabeformate sind innerhalb angemessener Grenzen flexibel.
Die niedrigste Byteanzahl gewinnt.
Testfälle
Alle möglichen Ausgaben werden angezeigt.
[] -> []
[1] -> [1]
[1,2] -> [2,2]
[2,1] -> [2,1]
[4,4,4,4] -> [4,4,4,4]
[-1,-3,-10] -> [-1,-3,-10]
[1,3,10] -> [3,3,10] [10,3,10] [1,10,10]
[1,1,2,1] -> [2,1,2,1] [1,2,2,1]
[998,64,2,-94,-789] -> [998,64,2,-94,-789]
[998,2,64,-94,-789] -> [998,64,64,-94,-789]
[3,1,4,-1,2] -> [4,1,4,-1,2] [3,4,4,-1,2] [3,2,4,-1,2] [3,1,4,2,2]
[-1,4,0,4,7,2,3] -> [4,4,0,4,7,2,3] [0,4,0,4,7,2,3] [-1,4,4,4,7,2,3] [7,4,0,4,7,2,3] [-1,7,0,4,7,2,3] [-1,4,7,4,7,2,3] [-1,4,0,7,7,2,3] [2,4,0,4,7,2,3] [-1,4,2,4,7,2,3] [3,4,0,4,7,2,3] [-1,4,3,4,7,2,3] [-1,4,0,4,7,3,3]
[3542,-12311,7662,1672,6081] -> [7662,-12311,7662,1672,6081] [3542,7662,7662,1672,6081] [3542,1672,7662,1672,6081] [6081,-12311,7662,1672,6081] [3542,6081,7662,1672,6081] [3542,-12311,7662,6081,6081]
x=>x.map(c=>c<x[++i]&!d?x[d=i]:c,d=i=0)
?x=>x.map(c=>c<x[++i]>d?x[d=i]:c,d=i=0)
(38 Byte) funktionieren sollten.Mathematica, 37 Bytes
Reine Funktion, die eine Liste reeller Zahlen aufnimmt und eine Liste reeller Zahlen zurückgibt. Sucht nach dem ersten Paar aufeinanderfolgender Einträge in der "falschen" Reihenfolge und ersetzt das erste Paar durch das zweite. Nettes Standardverhalten von
/.
bedeutet, dass die Eingabe bei Bedarf unverändert zurückgegeben wird.Amüsante Randnotiz: Wenn wir ersetzen
b<c
mit!OrderedQ[{c,b}]
, dann wird die Funktion auf Strings funktioniert (und wirklich jeden Datentyp , sobald die entsprechende Bestellung wird beschrieben). Zum Beispiel#/.{a___,b_,c_,d___}/;!OrderedQ[{c,b}]:>{a,c,c,d}&
bei der{"programming", "puzzles", "code", "golf"}
Rückgabe von Eingaben{"puzzles", "puzzles", "code", "golf"}
.quelle
Sort[FromCharacterCode /@ Range[32, 127]]
. Es wird seltsam, wenn Sie Zeichenfolgen mit mehreren Wörtern haben, weil dann Leerzeichen und andere Dinge ignoriert werden.JavaScript (ES6),
433938 ByteAusgabe durch Ändern des Arrays an Ort und Stelle. Bearbeiten: 4 Bytes dank @ETHproductions gespeichert. 1 Byte dank @ user81655 gespeichert.
quelle
a=>a[i=0,a.findIndex(e=>e<a[++i])]=a[i]
für 39 tun .a=>a.map((_,b)=>Math.max(...a.slice(b)))
findIndex
mitsome
(38 Bytes) zu ersetzen :a=>a[i=0,a.some(e=>e<a[++i])*i-1]=a[i]
Haskell , 36 Bytes
Probieren Sie es online!
Durchsuchen Sie die Liste nach aufeinanderfolgenden Elementen
a,b
mita<b
und ändern Sie sie inb,b
.Verbessert von 37 Bytes:
quelle
f(a:r@(b:_))=max(b:r)(a:f r)
funktioniert und ist zwei Bytes kürzer.f r >= r
.Jelly ,
1311 BytesErsetzt die am weitesten rechts stehende aller möglichen Zahlen.
Probieren Sie es online!
Wie es funktioniert
quelle
MATL , 15 Bytes
Probieren Sie es online!
Ich bin kein großer Fan dieser Lösung. Es scheint mir schrecklich ineffizient. Besonders die
whY>d*
und0h+
Abschnitte.quelle
Python 2,
13913493 BytesSchrecklich lang, aber es ist ein erster Versuch.
-5 Bytes dank TemporalWolf
-41 (!!) Bytes dank Value Ink
quelle
[1,2]
gibt[2,1]
statt[2,2]
print
und\t
anstelle des zusätzlichen Platzes für die innere Schleife eine Lasche verwenden. Sie können auch die 0 eingeben,exit()
um eine weitere zu erhalten. Sollte dich auf 132 bringen.if a[i]<a[j]:a[i]=a[j];print a;exit()
ist noch kürzer. Zum Teufel, es ist besser zu tunfor j in a[i+1:]:\n\tif a[i]<j:a[i]=j;print a;exit()
MATL , 13 Bytes
Probieren Sie es online!
Erläuterung
Die folgenden zwei Bedingungen sind äquivalent:
Der Code verwendet die Bedingung 2, die einfacher ist. Es berechnet aufeinanderfolgende Inkremente und findet das letzte positive, falls vorhanden. Für die beiden beteiligten Einträge schreibt es den Wert des zweiten Eintrags in den ersten.
Dieser Trick wird verwendet, um den Fall zu behandeln, dass keine Substitution durchgeführt werden kann. Beachten Sie auch, dass die MATL-Indizierung
1
-basiert ist.Verwenden wir
[3,1,4,-1,2]
als Beispiel die Eingabe .quelle
Haskell ,
3433 BytesDies basiert auf der Antwort von xnor , der mir vorschlug, sie selbst zu posten.
BEARBEITEN: xnor hat ein zu speicherndes Byte gefunden.
Probieren Sie es online!
Grundsätzlich habe ich festgestellt, dass die Verzweigung der Methode von xnor immer dazu führt, dass derjenige der Verzweigungsausdrücke ausgewählt wird, der am größten ist, da Haskell die lexikografische Reihenfolge für Listen verwendet. (Der Fall
a==b
funktioniert dann auch weilf r>=r
, was durch Induktion separat nachgewiesen werden kann.)Anders gesagt , wann immer
b:r > a:f r
, dannb:r
ist eine richtige Antwort, und ansonsten können wir darauf zurückgreifena:f r
.Anstatt also
a<b
im Voraus zu prüfen , berechne ich einfach beide Ausdrücke und nehme das Maximum. Dies könnte zu einer exponentiellen Explosion führen, obwohl Haskells Faulheit dies vermeidet, es sei denna
undb
sind gleich.quelle
max(b:r)$a:f r
ein Byte speichert.Python 3, 79 Bytes
Mutiert das ursprüngliche Array (Liste), das ihm zugewiesen wurde. Ich bin unglücklich, dass dies kein Lambda ist, und ich bin mir sicher, dass es bessere Optimierungen gibt. Ich werde hoffentlich später darauf eingehen.
Kurze Erklärung
Es dauert das Maximum des Arrays nach dem aktuellen Element (beginnend mit der Null). Es vergleicht dies dann mit dem Element selbst: Wenn der Maximalwert größer ist, ersetzen Sie das aktuelle Element durch das Element und stoppen Sie, andernfalls erhöhen Sie den Wert um eins, und versuchen Sie es erneut.
quelle
Ruby,
6661 BytesProbieren Sie es online!
quelle
C 47 Bytes
Rekursive Implementierung, die einen Zeiger auf das erste Element eines Arrays und die Länge des Arrays als Eingabe verwendet. Ändert das Array an Ort und Stelle.
quelle
SWI-Prolog, 70 Bytes
Die erste Klausel ersetzt das erste Element der Liste durch den Maximalwert des restlichen Teils der Liste, jedoch nur, wenn dieser Maximalwert größer ist. Die zweite Klausel ruft rekursiv das Prädikat für das Ende der Liste auf. Wenn keine dieser Klauseln erfolgreich ist, gibt die dritte Klausel einfach die Eingabe zurück.
Dies ist nur eine der möglichen Lösungen. Es ist trivial, sie alle mit sehr ähnlichem Code zu finden, aber in dem Fall, in dem keine Änderung möglich ist, sind viel mehr Bytes erforderlich.
Beispiel:
quelle
R, 71 Bytes
quelle
C 80 Bytes
Rufen Sie an mit:
quelle
Python 2, 89 Bytes
Probieren Sie es online aus -1 Byte dank @TemporalWolf
-25 Byte dank @ValueInk
-7 Byte dank @Cole
Funktion, die das Eingabearray mutiert
Wenn es nicht nötig wäre, nach der ersten Iteration anzuhalten, wäre es etwas hübscher
quelle
[1, 3, 5, 7]
; es kehrt zurück[3, 3, 5, 7]
.A[i]<y and
=>y>A[i]and
speichert 1r=[y for y in A[i+1:]if y>A[i]]\n if r:A[i]=r[0];break
in Betracht , Ihre Punktzahl auf 96 zu senken!input()
.Python 2, 60 Bytes
Probieren Sie es online!
Erläuterung: Überprüft rekursiv, ob ein bestimmtes Element kleiner als das
max
Element in der restlichen Liste ist. In diesem Fall wird die Liste mit demmax
Ersetzen des ersten Elements zurückgegeben.quelle
TI-Basic, 72 Bytes
Erläuterung:
quelle
sh, 118 Bytes
Ganzzahlen werden als Argumente an das Skript übergeben.
Nervenzusammenbruch:
quelle
PHP, 88 Bytes
Nervenzusammenbruch
quelle
Haskell, 48 Bytes
Anwendungsbeispiel:
f [1,1,2,1]
->[2,1,2,1]
. Probieren Sie es online! .Wenn die Eingabeliste mindestens ein Element enthält, binden Sie es
b
an das erste Element undl
an den Rest der Liste. Wennl
nicht leer undb
kleiner als das Maximum vonl
, geben Sie das Maximum gefolgt von zurückl
, andernfalls geben Sieb
gefolgt von einem rekursiven Aufruf von zurückf l
. Wenn die Eingabeliste leer ist, geben Sie sie zurück.quelle
Schläger 202 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
C 67 Bytes
Single Run, 67 Bytes Live
Einzelschritt, 78 Byte Live
Schwanz Maxima, 96 Bytes Live
quelle
Python 3 ,
103102 BytesProbieren Sie es online!
quelle