Inspiriert von Entnommen aus einer Frage bei Stack Overflow .
Die Herausforderung
Bei einer gegebenen Ganzzahl n>1
werden alle Arrays ausgegeben, die durch Austauschen von genau zwei Einträgen im Array erhalten werden können [1, 2, ..., n]
.
Die Arrays können in beliebiger Reihenfolge hergestellt werden.
Sie können konsequent [0, 1, ..., n-1]
(0-basiert) anstelle von [1, 2, ..., n]
(1-basiert) verwenden.
Zusätzliche Regeln
Ein- und Ausgabe sind wie gewohnt flexibel .
Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten.
Kürzester Code in Bytes gewinnt.
Testfälle
Eingabe 2
gibt Ausgabe (angenommen 1-basiert)
2 1
Eingabe 3
gibt Ausgabe (beachten Sie, dass die drei Arrays in beliebiger Reihenfolge sein können)
1 3 2
2 1 3
3 2 1
Input 4
gibt Output
1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1
Input 7
gibt Output
1 2 3 4 5 7 6
1 2 3 4 6 5 7
1 2 3 4 7 6 5
1 2 3 5 4 6 7
1 2 3 6 5 4 7
1 2 3 7 5 6 4
1 2 4 3 5 6 7
1 2 5 4 3 6 7
1 2 6 4 5 3 7
1 2 7 4 5 6 3
1 3 2 4 5 6 7
1 4 3 2 5 6 7
1 5 3 4 2 6 7
1 6 3 4 5 2 7
1 7 3 4 5 6 2
2 1 3 4 5 6 7
3 2 1 4 5 6 7
4 2 3 1 5 6 7
5 2 3 4 1 6 7
6 2 3 4 5 1 7
7 2 3 4 5 6 1
code-golf
number
combinatorics
integer
Luis Mendo
quelle
quelle
[0 ... n-1]
vs[1 ... n]
! Ich ärgere mich immer ein wenig, wenn ich einen1+
weil J-Null-Index anheften muss.Antworten:
Jelly ,
118 BytesProbieren Sie es online!
Wie es funktioniert
quelle
y
das? Es war mir immer ein Rätsel.[1,2],[4,3]y1,2,3
jede 1 in [1, 2, 3] durch 4 und jede 2 durch 3 .R , 54 Bytes
Probieren Sie es online!
Gibt eine Matrix zurück, in der jede Spalte eine Permutation ist.
combn(n,k)
erzeugt alle Kombinationen von Größek
aus der Listen
oder aus ,1:n
wennn
eine einzelne ganze Zahl ist. Optional kann auch eine FunktionFUN
auf die resultierenden Kombinationen angewendet werden. Also schreiben wir eine Funktion, die den Swap durchführt und die Swap-Liste zurückgibt. Die Ergebnisse werden dann alle zu einerarray
, in diesem Fall zweidimensionalen und damit zu einer Matrix zusammengefasst.quelle
Python 2 , 71 Bytes
Probieren Sie es online!
Verwendet diesen Tipp .
quelle
Haskell , 62 Bytes
Probieren Sie es online!
Ich erstelle einfach die Permutation, die gegeben ist,
x
undy
tausche sie für jede ausx,y
quelle
Python 2 , 72 Bytes
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 43 Byte
Probieren Sie es online!
Erläuterung:
Subsets[Range@#,{2}]
Generiert alle Teilmengen der{1,2,...,n}
Größe 2 und/.
tauscht dann für jede Teilmenge diese beiden Elemente in der Liste aus{1,2,...,n}
.Dieser Ansatz ist vielen anderen Einsendungen enttäuschend ähnlich, aber hier ist einer, der für Mathematica mit 3 zusätzlichen Bytes einzigartiger ist:
Probieren Sie es online!
quelle
ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&
. Ich mag, wie einfach es ist (oder wie direkt es das Problem codiert), aber leider ist die Syntax der Mustererkennung so ausführlich, dass dies 57 Bytes ergibt.Haskell, 62 Bytes
Probieren Sie es online!
quelle
Haskell , 71 Bytes
Probieren Sie es online!
Dies fügt die aktuelle Nummer an das Ende aller Permutationen von last an und berechnet dann alle Swaps, die die neue Nummer enthalten.
quelle
MATL , 12 Bytes
Probieren Sie es online!
quelle
:tY@wy=~!s2=Y)
. Dieselbe Vorgehensweise wie bei der Oktavenantwort von rahnema1, denke ichC 93 Bytes
Probieren Sie es online!
quelle
Oktave, 38 Bytes
Probieren Sie es online!
Erzeugt alle Permutationen von 1: n und wählt aus ihnen diejenigen aus, deren zwei Elemente sich von 1: n unterscheiden.
quelle
JavaScript (ES6), 81 Byte
Druckt 0-indizierte Arrays.
Demo
alert()
wirdconsole.log()
in diesem Snippet aus Gründen der Benutzerfreundlichkeit durch ersetzt.Code-Snippet anzeigen
quelle
Python 2 , 75 Bytes
Probieren Sie es online!
quelle
Sauber ,
9082 BytesDies kann in 80 Bytes erfolgen, wird jedoch zu einer direkten Übersetzung der Haskell-Antworten.
Probieren Sie es online!
quelle
05AB1E ,
159 BytesProbieren Sie es online!
Erläuterung
quelle
Schale , 9 Bytes
Probieren Sie es online!
Erläuterung
quelle
Ruby ,
5553 BytesProbieren Sie es online!
0-basierte Lösung
Der Trick dabei ist, dass die innere Schleife eine Iteration immer "überspringt": Wenn sie das erste Mal überhaupt nicht ausgeführt wird, dann nur einmal beim zweiten Durchgang und so weiter.
Ich war mit 55 Bytes zufrieden, bis ich sah, dass R bis auf 54 golfen werden konnte, also musste ich es auf 53 bringen.
quelle
Python 2 , 90 Bytes
Probieren Sie es online!
quelle
Pyth, 9 Bytes
Demonstration
Der einfachste Weg, zwei Werte zu tauschen, ist die Verwendung von
.r
Pyths Rotary Translation-Funktion..r<list>[A, B]
wird alle Vorkommen von tauschenA
undB
inlist
.Daher erzeugen wir durch Anwenden der Übersetzungsfunktion auf
UQ
die Liste von0
bisn-1
mit jeweils zwei Elementen mit unterschiedlichen Nummern in der Liste die gewünschte Ausgabe.Q
ist der Eingang,n
undU
ist die Bereichsfunktion.Der einfache Weg dies zu tun wäre:
.cUQ2
generiert alle 2 Elementkombinationen verschiedener Elemente im Bereich und.rLUQ
ordnet die.r
Funktion diesen und der Liste zuUQ
.Das wären jedoch 10 Bytes.
Anstatt
.cUQ2
die verschiedenen geordneten Paare zu bilden, können wir alle Paare mit bilden*=U
. Dies ist implizit äquivalent zu*=UQQ
. Es beginnt mit dem ÜberschreibenQ
mitUQ
, dann das kartesische Produkt der EinnahmeUQ
undUQ
. Dies gibt alle Zahlenpaare im Bereich an, die nicht notwendigerweise geordnet oder verschieden sind..rLQ
tauscht mit jeder Liste. Daran erinnern, dassQ
jetzt gleich die Liste von0
bis istn-1
, nichtn
.Da die Paare nicht bestellt wurden, gibt es Duplikate.
{
entfernt Duplikate. Da die Paare nicht unterschiedlich waren, ist die unveränderte Liste vorhanden. Diese Liste steht nach der Deduplizierung immer an erster Stelle, da{
die Reihenfolge des ersten Auftretens beibehalten wird und die unveränderte Liste durch Drehen um erstellt wird[0,0]
.t
Entfernt das erste Element und gibt die gewünschte Swap-Liste an.quelle
Pyth, 11 Bytes
Probieren Sie es online aus
Nicht so kurz wie bei isaacg, aber anders genug, um es zu posten.
Erläuterung
quelle
Java 8,
109105 BytesIch bin rostig. Ich habe seit Monaten keinen Code mehr. Ich habe @Steadybox 'C portiert. Antwort mehr. . Kann wahrscheinlich noch mehr golfen werden.
Probieren Sie es hier aus.
quelle
Ruby , 66 Bytes
Probieren Sie es online!
quelle
Ruby , 80 Bytes
-12 Bytes dank Unihedron.
Probieren Sie es online!
Ich hatte einen Ansatz im Sinn, der aus irgendeinem Grund am besten in Ruby übersetzt wurde. Ich kenne Ruby nicht einmal wirklich.
quelle
1..n
zu einer Ein-char - Variable und wiederverwenden (getrennte Aussagen mit Newline oder Semikolons), tun 2. ohne Klammern in den termary Aussagen:i==x ?y:i==y ?x:i
(Hinweis , wo ich die Räume haben das Potenzial , shebang zu trennen ) und 3.uniq[1,n]
stattuniq[1..-1]
.