Inspiriert von dieser Frage:
Erstellen Sie eine Funktion (oder ein vollständiges Programm), die eine Liste mit Zahlen empfängt und die neu geordnete Liste ausgibt, sodass geradzahlige Zahlen zuerst angezeigt werden und ungeradzahlige Zahlen folgen. Die Werte der Zahlen selbst haben keinen Einfluss auf die Reihenfolge - nur die Indizes. Alle Indizes basieren auf Null.
Beispielsweise:
Eingang: [0, 1, 2, 3, 4]
Ausgabe: [0, 2, 4, 1, 3]
Ein anderes Beispiel:
Eingang: [110, 22, 3330, 4444, 55555, 6]
Ausgabe: [110, 3330, 55555, 22, 4444, 6]
Verwenden Sie die natürlichste Darstellung für Listen in Ihrer Sprache. Es gibt keine Einschränkungen hinsichtlich der Komplexität (z. B. ist das Zuweisen einer temporären Liste in Ordnung - dies muss nicht direkt erfolgen).
PS Es sollte für die leere Liste funktionieren (leere Eingabe => leere Ausgabe).
quelle
Antworten:
Japt , 1 Byte
Probieren Sie es online!
quelle
Python, 23 Bytes
Probieren Sie es online aus
quelle
lambda
? Warum nichtmu
odernu
? : Plambda
durchλ
und reduzieren Byteanzahl von 5! : PPyth, 5
Probieren Sie es online aus oder führen Sie eine Testsuite aus
Erläuterung
quelle
CJam, 7 Bytes
Verschiebt einen Block (der einer unbenannten Funktion am nächsten kommt), der das oberste Stapelelement nach Bedarf transformiert.
Teste es hier.
Erläuterung
In der Erklärung wird davon ausgegangen, dass die Oberseite des Stapels das Array ist
[0 1 2 3 4]
. Die tatsächlichen Werte haben keinen Einfluss auf die Berechnung.quelle
Labyrinth ,
2825242322 BytesDas hat wahnsinnig Spaß gemacht! :) Das ist mit Abstand das am dichtesten komprimierte Labyrinth-Programm, das ich bisher geschrieben habe. Ich hatte so viele Versionen mit 20 und 21 Bytes , die fast gearbeitet, ich bin immer noch Zweifel an diesen optimal ist ...
Dies nimmt Eingaben als Liste positiver Ganzzahlen (mit einem beliebigen Trennzeichen) und gibt das Ergebnis als durch Zeilenvorschub getrennte Ganzzahlen an STDOUT aus.
Die Jagd nach 20/21 Bytes: Ich habe alle Programme des Formulars überprüft
Wo
X
ist ein vernünftiger Charakter durch rohe Gewalt, aber keine gültigen Lösungen gefunden. Das bedeutet natürlich nicht, dass es keine kürzere Lösung gibt, aber es ist nicht möglich, 20-Byte-Programme zu erzwingen, ohne eine angemessene Menge von Annahmen für ihre Struktur zu treffen.Erläuterung
(Die Erklärung ist etwas veraltet, aber ich bin immer noch nicht davon überzeugt, dass die Lösung optimal ist. Daher warte ich mit der Aktualisierung.)
Normalerweise sollen Labyrinth-Programme wie Labyrinthe aussehen. Während sich der Befehlszeiger in einem Korridor befindet, folgt er diesem Korridor. Wenn die IP auf eine beliebige Kreuzung trifft, wird die Richtung basierend auf dem oberen Wert des Labyrinth-Hauptstapels bestimmt (Labyrinth hat zwei Stapel mit einer unendlichen Anzahl von Nullen am unteren Rand). Das bedeutet normalerweise, dass jede nicht-triviale Schleife ziemlich teuer ist, denn wenn Sie überall Zellen ohne Wand haben, ist alles eine Kreuzung, und in den meisten Fällen hat die Oberseite des Stapels nicht den richtigen Wert für die IP den Weg einschlagen, den Sie einschlagen möchten. Sie vergrößern also die Schleifen so, dass sie ein Ganzes in der Mitte mit jeweils nur einem genau definierten Ein- und Ausgangspunkt haben.
Aber diesmal hatte ich wirklich Glück und alles passte so gut zusammen, dass ich alles zu einem großen Klumpen zerdrücken konnte. :)
Der Kontrollfluss beginnt
_
nach Süden. Der_
drückt eine Null auf den Hauptstapel. Das mag wie ein No-Op erscheinen, erhöht aber die (nicht implizite) Stapeltiefe,1
die wir später benötigen.?
liest eine ganze Zahl aus STDIN. Wenn keine ganzen Zahlen mehr gelesen werden müssen, wird die Null verschoben. In diesem Fall bewegt sich die IP weiter nach Süden und@
beendet das Programm sofort (da die Eingabeliste leer ist). Ansonsten dreht sich die IP nach Osten.Wir betreten jetzt eine sehr enge Schleife mit zwei Austrittspunkten:
!
Gibt die Ganzzahl zurück zu STDOUT und belässt nur eine Null auf dem Stapel. Die IP bewegt sich weiter nach Osten und?
liest die nächste Ganzzahl. Wenn das nicht Null ist, biegen wir rechts ab und bewegen uns nach Süden.?
liest einen anderen (den nächsten geraden Index). Wenn das nicht Null ist, biegen wir rechts ab und ziehen nach Westen.Dann wird
\
ein Zeilenvorschub gedruckt, ohne den Stapel zu ändern, und wir biegen erneut rechts ab und bewegen uns nach Norden.!
Gibt die nächste gerade Index-Ganzzahl aus. Da es jetzt mindestens eine (positive) Ganzzahl mit ungeradem Index auf dem Stapel gibt, drehen wir weiter nach rechts und die Schleife wiederholt sich.Sobald einer dieser
?
Punkte das Ende der Liste erreicht, drücken sie eine Null und bewegen sich direkt auf den entsprechenden;
Punkt, der diese Null verwirft.Für den Fall, dass es nur ein einziges Element in der Liste gab, sind wir fertig (weil wir das sofort gedruckt haben), sodass die IP den ganzen Weg nach Osten
@
wandert und das Programm erneut beendet wird (Drucken eines Trailings) Zeilenvorschub unterwegs).Andernfalls müssen wir auch die ungeraden Indexzahlen ausgeben. In diesem Fall verschmelzen die beiden Pfade (von den beiden Ausgangspunkten der ersten Schleife) in der Mitte
"
und biegen in beiden Fällen nach Osten ab._
Drückt eine Null, um zu vermeiden, dass Sie nach links in das Feld gehen@
, und;
verwirft diese Null. Nun betreten wir eine neue Schleife:Die IP-Adresse wird in der unteren linken Zelle eingegeben. Sie bewegt sich nach Norden und umläuft die Schleife im Uhrzeigersinn. Das
}
verschiebt die Oberseite des Hauptstapels auf den Hilfsstapel. Solange sich noch ein Element auf dem Stack befindet, macht die IP weiter. Sobald alles auf den Zusatzstapel verschoben wurde (und in diesem Prozess umgekehrt wurde), bewegt sich die IP weiter nach Osten und tritt in die letzte Schleife ein:\
Druckt einen Zeilenvorschub erneut und{
verschiebt ein Element vom Hilfsstapel zurück zum Hauptstapel. Wenn das noch ein Element der Liste war, ist es positiv, und die IP dreht sich nach Süden, wo das Element mit gedruckt wird!
. Dann#
drückt die Stack - Tiefe (und das ist jetzt , wo die anfängliche_
wichtig ist, weil dies#
eine positive Stapeltiefe gewährleistet), so dass der IP noch nach rechts abbiegt, durch die\
und{
wieder.Nachdem wir alles gedruckt haben,
{
zieht die IP eine Null vom unteren Rand des Zusatzstapels nach Osten und@
beendet das Programm.quelle
MATLAB, 24
ähnlich wie bei der Python.
Danke @LuisMendo für das Speichern von 2 Bytes!
quelle
@(x)x([1:2:end 2:2:end])
Haskell , 37 Bytes
Probieren Sie es online!
Das
foldr
baut rekursiv die gerade Liste und die ungerade Liste auf. Das Voranstellen eines Elements in der Liste wird aktualisiert, indem es der ungeraden Liste vorangestellt und als neue gerade Liste und die vorherige gerade Liste als neue ungerade Liste bezeichnet wird. Dann ist das Paar[l,r]
anwesendl++r
.Dank an Ørjan Johansen für das Speichern von 5 Bytes mithilfe von Listen mit zwei Elementen anstelle von Tupeln.
42 Bytes:
Fügt der Liste Indizes hinzu
l
und filtert entweder die geraden oder die ungeraden.Noch ein anderes Format für 44. Die Funktion
g
akzeptiert jedes gerade indizierte Element. Die ungeraden Indizes werden ermittelt, indem zuerst ein Element abgelegt und dann angewendet wirdg
. Wennl
garantiert nicht leer wäre, könnten wir sicher nurtail
für 41 tunquelle
l#(a:b:c)=a:(l++[b])#c;l#x=x++l;f=([]#)
mitf
der Hauptfunktion.concat
anstelle von Tupeln und verwendenuncurry(++)
.PowerShell v3 +,
75674947 BytesProbieren Sie es online!
Erwartet eine Eingabe per Splatting, wie auf dem TIO-Link gezeigt.
Erstellt eine Matrix
$l
als Array von Arrays und leitet die Eingabe dann$args
in eine Schleife weiter|%{}
. Jedes Mal, wenn wir die Schleife durchlaufen, fügen wir einem der beiden untergeordneten Arrays von ein Element hinzu,$l
indem wir die$f
Variable mithilfe der Booleschen Logik kippen . Das erste Mal durch,$f
ist$null
,!
von denen$true
oder1
beim Indizieren in ein Array. Dies bedeutet, dass das erste Element in das zweite Array von gestellt$l
wird. Deshalb$l[1]
wird es zuerst ausgegeben.Requisiten an TessellatingHeckler für die Golfunterstützung und diese Variante.
-2 Bytes dank mazzy.
Vorbehalte
Genau genommen ist dies technisch ungültig, da PowerShell kein Konzept für "Listen" als pseudo-unveränderliche Objekte hat, sondern nur für Arrays oder Hash-Tabellen (auch als Wörterbücher bezeichnet). Daher behandle ich die Zeile der Frage " Verwenden Sie die natürlichste Darstellung für Listen in Ihrer Sprache " als Fragen zu Arrays, da dies die nächstgelegene Zeile in PowerShell ist. Darüber hinaus ist die Ausgabe ein Element pro Zeile, da dies die standardmäßige PowerShell-Methode zum Schreiben eines Arrays ist. Dies bedeutet eine Eingabe von
(0,1,2,3,4)
Willensausgaben0\r\n2\r\n4\r\n1\r\n3\r\n
.quelle
$args
+ stattdessen splatting$input
und,@()*2
stattdessen@(),@()
F #,
797756Basierend auf einer der Haskell-Antworten
Wir indizieren zuerst die Liste und partitionieren sie dann mit den folgenden Kriterien: erstes Element (der Index) und 1 = 0.
Das ergibt ein Paar von Paarlisten ; Die erste Liste enthält alle indizierten Ereignisse und die andere die indizierten Gewinnchancen.
Danach setzen wir die beiden Listen mit dem Operator append wieder zusammen und verwerfen schließlich den Index.
Bearbeiten: Verpasste eine offensichtliche, es gibt keine Notwendigkeit, das Argument "xs" (Gewohnheiten) zu benennen, so kann auf einen Namen mit einem Buchstaben reduziert werden
Ich habe auch ein Potential von 76 Bytes, das im Grunde das gleiche ist, aber als Funktionszusammensetzung definiert ist. Das Problem ist, dass es nicht als Wert kompiliert wird, sondern effektiv mit allen angegebenen Listenargumenten funktioniert, sodass Sie sich nicht sicher sind, ob es in Ordnung ist oder nicht:
Hinweis: List.indexed ist nur ab F # 4.0 verfügbar, obwohl es noch nicht in MSDN dokumentiert ist
quelle
fun
, nicht wahr ?-> \xs { xs.pairs.classify( *.key%%2, :as( *.value ) ).map( *.value.Slip ) }
Angenommen,|>
in F # entspricht in etwa dem Rechts-Feed-Operator==>
in Perl 6. Ichfst>>(&&&)1>>(=)0
JavaScript (ES6), 52 Byte
Es macht es auch in einem Durchgang
Code-Snippet anzeigen
quelle
F=
von Anfang an weglassen ; Sie können ein Byte folgendermaßen speichern:(i*=2)>=(z=x.length)?i-z+--z%2:i
Julia, 23 Bytes
quelle
J, 8 Bytes
Dies ist ein monadisches Verb (ein Argument), das wie folgt verwendet wird:
Erläuterung
quelle
/:0:`1:\
die ebenfalls 8 Bytes.Gelee , 4 Bytes
Probieren Sie es online!
Basierend auf Martins CJam-Antwort
quelle
Mathematica, 40 Bytes
{}[[2;;;;2]]
wird einen Fehler auslösen.quelle
Burlesque, 12 Bytes
Verwendung wie in:
Erläuterung:
Sobald das neue Update veröffentlicht ist, können Sie dies mit dem neuen integrierten Unmerge - Tool tun (das das Gegenteil des integrierten Merge
**
- Tools bewirkt ):quelle
Perl,
3533 Bytes31 Bytes + 2 Bytes für
-ap
. Liest eine durch Leerzeichen getrennte Zeichenfolge aus STDIN:Wenn die Eingabe leer ist, wird ein einzelnes Leerzeichen gedruckt, was meiner Meinung nach einer leeren Liste entspricht. Wenn nicht, kann zu einem Preis von 4 Bytes behoben werden mit:
(Benötigt Perl 5.10+, druckt eine abschließende Newline)
oder zu einem Preis von 5 Bytes mit:
(kein abschließendes Leerzeichen)
Wie es funktioniert
Bei dieser Lösung wird das
-a
Flag verwendet, das die Eingabe in Leerzeichen aufteilt und die Ergebnisse in das Feld einfügt@F
Array schreibt.Die wahre Magie geschieht in
push
:Die
$|
Variable wird normalerweise verwendet, um das Löschen der Ausgabe zu erzwingen, hat jedoch eine andere interessante Eigenschaft: Wenn sie wiederholt dekrementiert wird, wechselt ihr Wert zwischen 0 und 1.Ausgehend von der Tatsache, dass die über die symbolische Dereferenzierung angegebenen Bezeichner nicht eingeschränkt sind , werden abwechselnd Array-Elemente auf die Arrays
@0
und@1
verschoben, sodass@0
alle Elemente@1
mit geradem Index und die Gewinnchancen angezeigt werden. Dann verketten wir einfach die stringierten Arrays, um unsere Ausgabe zu erhalten.quelle
C 70
Nichts Besonderes, nur eine Index-Mapping-Funktion.
Weniger golfen
quelle
Pyth, 8 Bytes
Relativ einfach
quelle
Vitsy, 22 Bytes
Vitsy war wirklich nicht dafür gemacht ...
quelle
Perl 6 , 25 Bytes
Dies ist der kürzeste Lambda, den ich finden konnte.
quelle
Minkolang 0,12 , 15 Bytes
Probieren Sie es hier aus.
Erläuterung
quelle
R, 49 Bytes
Nenne es q (bla). Oder wenn x bereits die neu anzuordnende Liste enthält, dann
ist nur 35 Bytes.
quelle
F #, 64
Inspiriert von Sehnsuchts Antwort (aber nicht genug Repräsentanten, um einen Kommentar abzugeben).
Ordnet jeden Wert einem Tupel zu, wobei der zweite Eintrag das Modulo des Listenindex ist, sortiert nach Modulo und ordnet dann den ursprünglichen Wert zu.
quelle
Prolog, 103 Bytes
Beispiel
quelle
Bash- und GNU-Coreutils, 68 Bytes
Wir gehen davon aus, dass die Liste durch Zeilenumbrüche getrennt und an die Standardeingabe übergeben wird.
Leider werden alle Eingaben über den Index 1999 hinaus ignoriert, sodass die Spezifikation nicht ganz erfüllt wird.
Es blockiert auch eine fest codierte temporäre Datei ('x'), die bei paralleler Ausführung problematisch sein kann, und entfernt sie anschließend nicht. Das tut mir leid!
quelle
PHP,
78-69BytesPHP kann Blöcke aufteilen, aber keine Arrays verschachteln. das macht das ein bisschen sperrig:
Rufen Sie an oder probieren Sie es online .
erster Ansatz (Programme für 78 Bytes):
druckt ein führendes Komma;
[!$i]
vor dem ersten einfügen$argv
, um es zu entfernen.Zwei weitere 78-Byte-Lösungen (geben Sie ein führendes und ein nachfolgendes Komma aus):
Laufen Sie mit
php -nr '<code>' <arguments>
oder probieren Sie sie online ausquelle
Japt , 3 Bytes
Versuch es
Versuch es
quelle
Clojure / ClojureScript, 52 Byte
Geschrieben in einem ClojureScript REPL, sollte auch Clojure gültig sein.
quelle
K, 10 Bytes
Basierend auf der 5-Byte-Pyth-Antwort.
quelle
Hassium , 191 Bytes
Dieser war ziemlich lang :(
Er liest das Array von args, also starte ihn mit
hassium file.has 0 1 2 3 4
Und sehen , mit Testfall erweitert hier
quelle