Während ich mit Zahlen herumkritzelte, fand ich eine interessante Permutation, die Sie aus einer Liste von Zahlen generieren können. Wenn Sie dieselbe Permutation genügend oft wiederholen, gelangen Sie immer zum ursprünglichen Array zurück. Verwenden wir die folgende Liste:
[1, 2, 3, 4, 5]
als Beispiel
Kehren Sie das Array um. Jetzt ist unser Array
[5, 4, 3, 2, 1]
Jedes Paar neu ordnen (tauschen). Unsere Liste enthält 2 Paare:,
[5, 4]
und[3, 2]
. Leider können wir das nicht1
zu einem Paar zusammenfassen, also lassen wir es einfach für sich. Nach dem Tauschen jedes Paares lautet das neue Array:[4, 5, 2, 3, 1]
Wiederholen Sie die Schritte 1 und 2, bis Sie zum ursprünglichen Array zurückkehren. Hier sind die nächsten 4 Schritte:
Step 2: Start: [4, 5, 2, 3, 1] Reversed: [1, 3, 2, 5, 4] Pairs Swapped: [3, 1, 5, 2, 4] Step 3: Start: [3, 1, 5, 2, 4] Reversed: [4, 2, 5, 1, 3] Pairs Swapped: [2, 4, 1, 5, 3] Step 4: Start: [2, 4, 1, 5, 3] Reversed: [3, 5, 1, 4, 2] Pairs Swapped: [5, 3, 4, 1, 2] Step 5: Start: [5, 3, 4, 1, 2] Reversed: [2, 1, 4, 3, 5] Pairs Swapped: [1, 2, 3, 4, 5] # No more steps needed because we are back to the original array
Wenn die Länge der Liste n ungerade ist, dauert es immer genau n Schritte, um zum ursprünglichen Array zurückzukehren. Wenn n gerade ist, dauert es immer 2 Schritte, um zum ursprünglichen Array zurückzukehren, es sei denn, n ist 2. In diesem Fall dauert es 1 Schritt (da Umkehren und Vertauschen dasselbe ist).
Ihre Aufgabe für heute (falls Sie sie akzeptieren möchten) ist es, diesen Satz von Schritten für Listen beliebiger Länge zu visualisieren. Sie müssen ein Programm oder eine Funktion schreiben, die eine einzelne positive Ganzzahl n als Eingabe verwendet, und diese Schritte für die Liste ausführen [1, n]
. Sie müssen jeden Zwischenschritt auf dem Weg ausgeben, dh jeden Schritt drucken oder alle als Liste von Schritten zurückgeben. Ich bin nicht sehr wählerisch in Bezug auf das Ausgabeformat, solange klar ist, dass Sie jeden Schritt generieren. Dies bedeutet (zum Beispiel) Folgendes:
Ausgabe jedes Schritts als Liste an STDOUT
Zurückgeben einer Liste von Listen
Zurückgeben einer Liste mit Zeichenfolgendarstellungen für jeden Schritt
Matrix zurückgeben / ausgeben
wäre akzeptabel.
Sie müssen auch das ursprüngliche Array ausgeben, ob dies am Ende oder am Anfang erfolgt, liegt bei Ihnen. (technisch sind beide richtig)
Sie müssen den Kantenfall von 2 in einem Schritt anstelle von 2 behandeln . Stellen Sie daher sicher, dass Ihre Lösung mit einer Eingabe von 2 funktioniert (und 1 ein weiterer potenzieller Kantenfall ist).
Wie üblich ist dies Codegolf , daher gelten Standardlücken, und versuchen Sie, Ihre Lösung in der Sprache Ihrer Wahl kürzer als jede andere zu machen (oder versuchen Sie sogar, eine andere Sprache zu schlagen, die in der Regel kürzer als Ihre ist, wenn Sie sich müde fühlen für eine Herausforderung).
Testen Sie IO
1:
[1]
2:
[1, 2]
3:
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
4:
[3, 4, 1, 2]
[1, 2, 3, 4]
5:
[4, 5, 2, 3, 1]
[3, 1, 5, 2, 4]
[2, 4, 1, 5, 3]
[5, 3, 4, 1, 2]
[1, 2, 3, 4, 5]
7:
[6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 6]
[4, 6, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 7, 5]
[7, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7]
9:
[8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 8]
[6, 8, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 9, 7]
[9, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Und zum guten Teil ist hier ein riesiger Testfall:
27:
[26, 27, 24, 25, 22, 23, 20, 21, 18, 19, 16, 17, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 11, 8, 13, 10, 15, 12, 17, 14, 19, 16, 21, 18, 23, 20, 25, 22, 27, 24, 26]
[24, 26, 22, 27, 20, 25, 18, 23, 16, 21, 14, 19, 12, 17, 10, 15, 8, 13, 6, 11, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 11, 4, 13, 6, 15, 8, 17, 10, 19, 12, 21, 14, 23, 16, 25, 18, 27, 20, 26, 22, 24]
[22, 24, 20, 26, 18, 27, 16, 25, 14, 23, 12, 21, 10, 19, 8, 17, 6, 15, 4, 13, 2, 11, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 11, 1, 13, 2, 15, 4, 17, 6, 19, 8, 21, 10, 23, 12, 25, 14, 27, 16, 26, 18, 24, 20, 22]
[20, 22, 18, 24, 16, 26, 14, 27, 12, 25, 10, 23, 8, 21, 6, 19, 4, 17, 2, 15, 1, 13, 3, 11, 5, 9, 7]
[9, 7, 11, 5, 13, 3, 15, 1, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 26, 14, 24, 16, 22, 18, 20]
[18, 20, 16, 22, 14, 24, 12, 26, 10, 27, 8, 25, 6, 23, 4, 21, 2, 19, 1, 17, 3, 15, 5, 13, 7, 11, 9]
[11, 9, 13, 7, 15, 5, 17, 3, 19, 1, 21, 2, 23, 4, 25, 6, 27, 8, 26, 10, 24, 12, 22, 14, 20, 16, 18]
[16, 18, 14, 20, 12, 22, 10, 24, 8, 26, 6, 27, 4, 25, 2, 23, 1, 21, 3, 19, 5, 17, 7, 15, 9, 13, 11]
[13, 11, 15, 9, 17, 7, 19, 5, 21, 3, 23, 1, 25, 2, 27, 4, 26, 6, 24, 8, 22, 10, 20, 12, 18, 14, 16]
[14, 16, 12, 18, 10, 20, 8, 22, 6, 24, 4, 26, 2, 27, 1, 25, 3, 23, 5, 21, 7, 19, 9, 17, 11, 15, 13]
[15, 13, 17, 11, 19, 9, 21, 7, 23, 5, 25, 3, 27, 1, 26, 2, 24, 4, 22, 6, 20, 8, 18, 10, 16, 12, 14]
[12, 14, 10, 16, 8, 18, 6, 20, 4, 22, 2, 24, 1, 26, 3, 27, 5, 25, 7, 23, 9, 21, 11, 19, 13, 17, 15]
[17, 15, 19, 13, 21, 11, 23, 9, 25, 7, 27, 5, 26, 3, 24, 1, 22, 2, 20, 4, 18, 6, 16, 8, 14, 10, 12]
[10, 12, 8, 14, 6, 16, 4, 18, 2, 20, 1, 22, 3, 24, 5, 26, 7, 27, 9, 25, 11, 23, 13, 21, 15, 19, 17]
[19, 17, 21, 15, 23, 13, 25, 11, 27, 9, 26, 7, 24, 5, 22, 3, 20, 1, 18, 2, 16, 4, 14, 6, 12, 8, 10]
[8, 10, 6, 12, 4, 14, 2, 16, 1, 18, 3, 20, 5, 22, 7, 24, 9, 26, 11, 27, 13, 25, 15, 23, 17, 21, 19]
[21, 19, 23, 17, 25, 15, 27, 13, 26, 11, 24, 9, 22, 7, 20, 5, 18, 3, 16, 1, 14, 2, 12, 4, 10, 6, 8]
[6, 8, 4, 10, 2, 12, 1, 14, 3, 16, 5, 18, 7, 20, 9, 22, 11, 24, 13, 26, 15, 27, 17, 25, 19, 23, 21]
[23, 21, 25, 19, 27, 17, 26, 15, 24, 13, 22, 11, 20, 9, 18, 7, 16, 5, 14, 3, 12, 1, 10, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 10, 3, 12, 5, 14, 7, 16, 9, 18, 11, 20, 13, 22, 15, 24, 17, 26, 19, 27, 21, 25, 23]
[25, 23, 27, 21, 26, 19, 24, 17, 22, 15, 20, 13, 18, 11, 16, 9, 14, 7, 12, 5, 10, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 10, 7, 12, 9, 14, 11, 16, 13, 18, 15, 20, 17, 22, 19, 24, 21, 26, 23, 27, 25]
[27, 25, 26, 23, 24, 21, 22, 19, 20, 17, 18, 15, 16, 13, 14, 11, 12, 9, 10, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
Viel Spaß beim Golfen!
quelle
1 2 3 4 5
nicht sein1 2 4 3 5
.array[0]
zu Beginn und am Ende des Prozesses nur 1 bis wirdn = 999
. Betrachtet man das Muster, so scheint es, dass für jedes ungerade n das erste Element1, n-1, 3, n - 3, 5, n - 5, 7...
bis aufsteigtn - 2, 3, n, 1
, was immer n Schritte erfordert. Ich sehe keinen Grund, warum sich dieses Muster mit größerem n ändern würde .1, n, 2, n-2, 4, n-4, 6, n-6, 8, n-8, ...
und es ist einfach durch Induktion zu zeigen, dass sich ein Element an gerader Position x nach einem Schritt zu nx bewegt und ein Element an einer ungeraden Position x bewegt sich zu n-x + 2 . Wenn also n = 2k + 1 ist , dann ist nach dem 2k- ten Schritt 1 bei 2k und beim nächsten Schritt bei n-2k = 1 .Antworten:
TI-Basic (Serie 83),
585754 Byte (104 Zeichen)Erläuterung
Nimmt Eingaben auf
Ans
(z. B. Schreiben5:prgmNAME
, um Listen der Größe fünf zu verwenden).Erstellt drei Hilfslisten der angegebenen Größe (die
ᶫB
bei jedem Schritt neu erstellt werden):ᶫB = ᶫC = {1,2,3,4,5,...}
undᶫD = {-1,-1,-2,-2,-3,...}
. Bei jedem Schritt wird sortiertᶫC
undᶫD
in absteigender Reihenfolge die gleiche Permutation auf angewendetᶫA
. In diesem FallᶫC
kehrt sich dies umᶫA
, und in diesem Fall werdenᶫD
benachbarte Paare vertauscht , da TI-Basic eine wirklich blöde Implementierung fürSortD(
die Auswahlsortierung verwendet, bei der so viele identische Elemente wie möglich neu angeordnet werden. WannᶫA
ist gleichᶫB
wieder aufhören wir.Nein, im Ernst, der integrierte Sortieralgorithmus ist meine zweitgrößte Beschwerde beim TI-Basic-Interpreter. (Meine größte Beschwerde ist, dass viele verschachtelte Schleifen den Interpreter verlangsamen, da die Schleifendaten in einem Stapel gespeichert sind, der Stapel jedoch vom falschen Ende gewachsen ist, sodass der Taschenrechner den gesamten Stapel jedes Mal verschieben muss, wenn ein Element verschoben wird oder geknallt.) Aber diesmal ist es praktisch.
-1 Byte:
Pause
Speichert den Wert, auf den gedruckt wird. Dieser WertAns
ist kürzer als der ReferenzwertᶫA
.-3 Bytes: Eingabe übernehmen in
Ans
quelle
Gelee , 10 Bytes
Probieren Sie es online!
Erläuterung
Hinweis
Wenn die ursprüngliche Bereich Bedürfnisse am Ende sein, append ,
ṙ1
um den Code für 12 Bytes.quelle
05AB1E ,
1311 BytesProbieren Sie es online!
Erläuterung
quelle
JavaScript (ES6),
8985Bearbeite 4 Bytes gespeichert dank @JustinMariner
Ausgehend von der Tatsache, dass sich alle Elemente an der richtigen Stelle befinden.
Weniger golfen
Prüfung
quelle
for(l=[];n;l[n-1]=n--);
, versuchen Sie es online! .Mathematica, 142 Bytes
quelle
JavaScript (ES6), 79 Byte
Gibt für jeden Schritt eine Liste aus.
Beachten Sie, dass wir das Array nicht initialisieren müssen, um den Ball ins Rollen zu bringen. Wenn nicht initialisiert (
x
undefiniert), können wir die Indizes (Parameteri
) des Arrays verwenden , um den ersten Schritt auszuführen:Testfälle:
Code-Snippet anzeigen
quelle
R
1099594797462 BytesWenn die Tatsache, dass der Code Warnungen über die eigentliche Lösung wirft (keine Warnungen bei
n
1, 3 Warnungen bein
gerade undn
Warnungen bein
ungerade), kein Problem darstellt, funktioniert das Folgende dank vector ähnlich wie bei der vorherigen Lösung Recycling:Probieren Sie es online!
Nochmals vielen Dank an @ Giuseppe für zusätzliche 12 Bytes!
Bisherige Lösung ohne Warnung bei 94 Byte:
Probieren Sie es online!
Ursprüngliche Lösung bei 109 Bytes :
Probieren Sie es online!
quelle
print
Gibt das Argument zurück, damit wir es hier nutzen können. Ich glaube nicht, dass ich jemalsencode
zuvor gesehen hatte. das ist eine ordentliche Art der Indizierung!2
inembed
mitmin(n,2)
?n
statt{}
für die while-Schleife nur setzen, dan
nichts tut. :)0:n+2*1:0
ist das gleiche wie1+0:n+c(1,-1)
für -4 Bytes.any(print(...) != s)
entsprichtany(print(...)-s)
für -1 Byte. Aaand, wenn wir dasm[1]==1
erst am Ende des Algorithmus beweisen können , dann können wir die fallen lassenany
, so dass wir bekommenwhile(print(...)-1)
und wir können entfernens
, so dass wir 62 Bytes bekommen,n=scan();m=1:n;w=0:n+2*1:0;while(print(m<-rev(m)[w[w<=n]])-1)n
Japt ,
20181512 BytesProbieren Sie es aus (
-R
Flagge nur zu Visualisierungszwecken)Dank ETHproductions 1 Byte gespart.
quelle
w ò mw
sein kannò2n)w
Schale , 9 Bytes
Probieren Sie es online!
quelle
Ruby ,
64 57 5250 BytesProbieren Sie es online!
Wie es funktioniert:
Erstellen Sie zuerst den Bereich und wiederholen Sie dann die Permutation x-mal: Verwenden Sie einen negativen Index, kippen Sie jedoch das letzte Bit, sodass wir die Sequenz -2, -1, -4, -3 erhalten. Wenn x gerade ist, endet dies Wenn nicht, fügen wir das verbleibende Element am Ende hinzu. Letzter Schritt: Wiederholte Arrays herausfiltern (also decken wir alle Fälle ab: x = 1, x = 2, ungerade und gerade Zahlen)
quelle
Haskell,
7574 BytesProbieren Sie es online!
g
Bei den paarweisen Swaps handelt es sich umh
einen einzelnen Schritt (Umkehren + Neuanordnen), der!
wiederholth
angewendet wird (und die Zwischenergebnisse sammelt), bis die Reihenfolge wiederhergestellt ist. Hinweis:!
Nimmt den zusätzlichen, aber nicht verwendeten zusätzlichen Parameter0
, um ihn zu einem Infix-Operator zu machen. Die Hauptfunktionp
startet es.Edit: Danke an @Angs für ein Byte.
quelle
0!x
stattf x
ein Byte zu speichern - Online ausprobieren!Java 8,
215214 BytesIch habe versucht, es mit tatsächlichen Arrays anstelle einer Liste zu spielen, aber sowohl das Umkehren als auch das Vertauschen nehmen zu viele Bytes ein finde es heraus.
Dies kann auf jeden Fall etwas mehr Golf gespielt werden.
Erläuterung:
Probieren Sie es hier aus.
quelle
Java (OpenJDK 8) ,
257245243226206205 BytesProbieren Sie es online!
quelle
n->{java.util.Arrays x=null;int i=0,k,f,a[]=new int[n],t[]=new int[n];for(;i<n;a[i]=t[i]=++i);do{for(f=0;f<n/2;k=t[f],t[f]=t[n+~f],t[n+~f++]=k);for(k=1;k<n;t[k]=t[--k],t[k]=f,k+=3)f=t[k];System.out.println(x.toString(t));}while(!x.equals(a,t));}
( 245 bytes ) Zusammenfassung der Änderungenjava.util.Arrays x=null;
:;n-f-1
zun+~f
; Klammern der Schlaufe entfernt; Geändert 2xk-1
zu--k
(und auch geändertk+=2
,k+=3
um dies zu neutralisieren.,f
und Wiederverwenden können Sie zwei weitere Bytes einspareni
.for(i=0;i<n/2;k=t[i],t[i]=t[n+~i],t[n+~i++]=k);
zufor(i=0;i<n/2;t[i]=t[n+~i],t[n+~i++]=k)k=t[i];
MATL , 17 Bytes
Probieren Sie es online!
Erläuterung
quelle
Stax , 17 Bytes
Führen Sie es aus und debuggen Sie es
Erläuterung
Erstaunt funktioniert es so schnell wie es funktioniert, getestet bis zu 399, bevor ich meinen Browser nicht mehr tempen wollte.
quelle
JavaScript (ES6), 122 Byte
r.push(a)
könnte verwendet werden, anstattr.push(b)
die ursprüngliche Permutation in den Vordergrund zu stellen.quelle
Haskell , 97 Bytes
Das fühlt sich ein bisschen lang an :(
Probieren Sie es online!
Erklärung / Ungolfed
quelle
Gestapelt , 42 Bytes
Probieren Sie es online!
Führt die angegebene Transformation mit dem
periodsteps
eingebauten Befehl aus. Diese integrierte Funktion gibt jedoch alle Elemente zurück, einschließlich des Eingabebereichs als erstes und letztes Element. Wir köpfen daher die Liste und geben alle Elemente außer dem ersten zurück.quelle
AWK , 123 Bytes
Nicht sehr eng, aber das ist das Beste, was ich mir einfallen lassen konnte.
Probieren Sie es online!
quelle
Python 2 ,
16515913881 BytesProbieren Sie es online!
-20 Bytes dank @ChasBrown . (Seufz, ich habe eine ganze Herausforderung in Bezug auf die erweiterte Slicing-Syntax gestellt.)
Whoa! GolfStorm (-57 Bytes)! Vielen Dank an Ian Gödel, tsh und Jonathan Frech.
quelle
list(reversed(a))
versuchena[::-1]
.' '*[2-(x<3),x][x%2]
[b,0][b==a]
->b*(a!=b)
.JavaScript, 136 Bytes
quelle