Ein Faro-Shuffle ist eine Technik, die häufig von Magiern verwendet wird, um ein Deck zu "mischen". Um einen Faro-Shuffle auszuführen, schneiden Sie zuerst das Deck in zwei gleiche Hälften und verschachteln dann die beiden Hälften. Beispielsweise
[1 2 3 4 5 6 7 8]
Faro wird gemischt
[1 5 2 6 3 7 4 8]
Dies kann beliebig oft wiederholt werden. Interessanterweise kehren Sie immer zum ursprünglichen Array zurück, wenn Sie dies genügend oft wiederholen. Beispielsweise:
[1 2 3 4 5 6 7 8]
[1 5 2 6 3 7 4 8]
[1 3 5 7 2 4 6 8]
[1 2 3 4 5 6 7 8]
Beachten Sie, dass 1 unten und 8 oben bleibt. Das macht dies zu einem äußeren Durcheinander . Dies ist eine wichtige Unterscheidung.
Die Herausforderung
Wenn ein Array von Ganzzahlen A und eine Zahl N gegeben sind , wird das Array nach N Faro-Shuffles ausgegeben . A kann wiederholte oder negative Elemente enthalten, hat jedoch immer eine gerade Anzahl von Elementen. Sie können davon ausgehen, dass das Array nicht leer ist. Sie können auch davon ausgehen, dass N eine nicht negative Ganzzahl ist, obwohl es 0 sein kann. Sie können diese Eingaben auf jede vernünftige Weise verwenden. Die kürzeste Antwort in Bytes gewinnt!
Test IO:
#N, A, Output
1, [1, 2, 3, 4, 5, 6, 7, 8] [1, 5, 2, 6, 3, 7, 4, 8]
2, [1, 2, 3, 4, 5, 6, 7, 8] [1, 3, 5, 7, 2, 4, 6, 8]
7, [-23, -37, 52, 0, -6, -7, -8, 89] [-23, -6, -37, -7, 52, -8, 0, 89]
0, [4, 8, 15, 16, 23, 42] [4, 8, 15, 16, 23, 42]
11, [10, 11, 8, 15, 13, 13, 19, 3, 7, 3, 15, 19] [10, 19, 11, 3, 8, 7, 15, 3, 13, 15, 13, 19]
Und ein massiver Testfall:
23, [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, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
Sollte ausgeben:
[1, 30, 59, 88, 18, 47, 76, 6, 35, 64, 93, 23, 52, 81, 11, 40, 69, 98, 28, 57, 86, 16, 45, 74, 4, 33, 62, 91, 21, 50, 79, 9, 38, 67, 96, 26, 55, 84, 14, 43, 72, 2, 31, 60, 89, 19, 48, 77, 7, 36, 65, 94, 24, 53, 82, 12, 41, 70, 99, 29, 58, 87, 17, 46, 75, 5, 34, 63, 92, 22, 51, 80, 10, 39, 68, 97, 27, 56, 85, 15, 44, 73, 3, 32, 61, 90, 20, 49, 78, 8, 37, 66, 95, 25, 54, 83, 13, 42, 71, 100]
quelle
Antworten:
05AB1E , 5 Bytes
Code:
Erklärung, Eingabe:
N
,array
:Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
vim,
625954Wow. Dies ist wahrscheinlich das hackigste, was ich für PPCG geschrieben habe, und das sagt etwas aus.
Die Eingabe wird in der ersten Zeile als N genommen, gefolgt von den Elementen des Arrays, wobei jedes in einer eigenen Zeile steht.
Ich habe beim Schreiben dieser Antwort möglicherweise mehrere VIM-Bugs gefunden:
Das Aufzeichnen von Makros ist nicht innerhalb anderer Makros (wenn der Text manuell festgelegt wird, nicht mit
q
) oder innerhalb von Makros möglich:*map
s .:let @a='<C-v><cr>'<cr>i<C-r>a
gibt zwei Zeilenumbrüche aus, nicht einen, aus irgendeinem arkanen Grund.Ich könnte diese später weiter untersuchen.
Danke an Dr. Green Eggs und Ham DJ für 3 Bytes!
quelle
:P
Sie können auch 2 Bytes"rck
vgg"rc
dw@"i@r<esc>
AA@R<C-v><esc><esc>0D@"
Python 2, 59 Bytes
Ein anderer Ansatz, etwas länger als die anderen Python-Antworten. Funktioniert nur für positive gerade Elementzahlen.
zB für
1, [1,2,3,4,5,6,7,8]
, nimm das Array und hängelen(L)/2-1
Kopien von sich selbst minus dem ersten Element an, zBDann nimm jedes
len(L)/2
Element.quelle
Python,
6857 BytesVielen Dank an @ Sp3000 für das Golfen mit 11 Bytes!
Teste es auf Ideone .
quelle
Haskell, 62 Bytes
Sei s = 2 · t die Größe der Liste. Das i- te Element der neuen Liste wird erhalten, indem das -te Element der alten Liste mit Nullindex und Modulo s genommen wird .
Beweis: wenn i = 2 · k gerade ist, dann
und wenn i = 2 · k + 1 ungerade ist, dann
Die zur Indizierung verwendeten Werte sind also 0, t , 1, t + 1, 2, t + 2, ...
quelle
J - 12 Bytes
Adverb (!) Nimmt links die Anzahl der Shuffles und rechts das zu mischende Array.
Der J-Parser hat Regeln für das Schreiben stillschweigender Adverbien , aber sie haben eine sehr geringe Priorität: Wenn Sie eine Reihe von Verben als linkes Argument verwenden möchten, können Sie einen ansonsten erforderlichen Satz von Klammern weglassen. Das Obige ist also eigentlich eine Abkürzung für
(/:#/:@$0,#)^:
, bei der die Anzahl der Shuffles links als Adverb verwendet wird und die dann zu einer monadischen Funktion wird, bei der das Array rechts gemischt wird.Das heißt, wir mischen wie folgt.
#
ist die Länge des Arrays, also0,#
eine Liste mit zwei Elementen: 0, gefolgt von etwas ungleich Null. Dann#/:@$
repliziert , die in eine Liste , solange die Eingangsanordnung, und nimmt seine Sortiervektor .Der Sortiervektor einer Liste ist die Information zum Sortieren der Liste: der (0-basierte) Index des kleinsten Elements, gefolgt vom Index des nächstkleineren usw. Zum Beispiel der Sortiervektor von
0 1 0 1 ...
also0 2 4 ... 1 3 5 ...
.Wenn J nun diesen Sortiervektor sortieren würde, würde er von Faro gemischt; aber das wäre trivial, da wir
0 1 2 3 ...
zurückkommen würden. Also benutzen wir dyadic/:
, um das Eingabearray so zu sortieren, als ob es wäre0 2 4 ... 1 3 5 ...
, was Faro es mischt.Anwendungsbeispiel unten. Probieren Sie es selbst bei tryj.tk !
quelle
Pyth -
87 Bytes1 Byte dank @issacg gespeichert
Probieren Sie es hier online aus .
quelle
Q
, um ein Byte zu speichern. Es muss etwas falsch mit der Pyth-Antwort sein, wenn Jelly Pyth schlägt. :)u
bei none einhängen und festpunkt machen?Gelee,
97 Bytes2 Bytes dank Dennis!
Probieren Sie es online!
Erläuterung
Vorherige 9-Byte-Version:
Probieren Sie es online!
quelle
JavaScript (ES6),
6151 ByteÄndert das vorhandene Eingabearray und gibt eine Kopie des ursprünglichen Arrays zurück. Wenn dies nicht akzeptabel ist,
&&a
kann ein Suffix angehängt werden, um das geänderte Array zurückzugeben. Funktioniertn
aufgrund der Einschränkungen der Ganzzahlarithmetik von JavaScript nur für kleine Werte von .6160-Byte-Rekursivversion, die mit einer größeren Version funktioniertn
, basierend auf der @ Lynn-Formel:quelle
MATL , 11 Bytes
Danke an @Dennis für die Korrektur
Probieren Sie es online!
Erläuterung
quelle
w
notwendig?J,
22,19,17 Bytes3 Bytes dank @Gareth .
2 Bytes dank @algorithmshark .
Verwendung
Wo
>>
ist STDIN und<<
ist STDOUT.Vorherige 22-Byte-Version:
Verwendung
Wo
>>
ist STDIN und<<
ist STDOUT.quelle
{~2,@|:@i.@,-:@#^:
für 18 Bytes verwendet werden .[:,@|:]]\~_2%~#^:
,@|:@$~2,-:@#^:
funktioniert für 15 BytesMathematica 44 Bytes
Mit 4 Bytes dank @miles gespeichert.
Riffle @@ TakeDrop[#, Length@#/2] &~Nest~## &[list, nShuffles]
teilt die Liste in zwei gleiche Unterlisten auf und mischtRiffle
sie.{1, 5, 2, 6, 3, 7, 4, 8}
{1, 30, 59, 88, 18, 47, 76, 6, 35, 64, 93, 23, 52, 81, 11, 40, 69, 98, 28, 57, 86, 16, 45, 74, 4 , 33, 62, 91, 21, 50, 79, 9, 38, 67, 96, 26, 55, 84, 14, 43, 72, 2, 31, 60, 89, 19, 48, 77, 7, 36 , 65, 94, 24, 53, 82, 12, 41, 70, 99, 29, 58, 87, 17, 46, 75, 5, 34, 63, 92, 22, 51, 80, 10, 39, 68 , 97, 27, 56, 85, 15, 44, 73, 3, 32, 61, 90, 20, 49, 78, 8, 37, 66, 95, 25, 54, 83, 13, 42, 71, 100 }
quelle
TakeDrop
können wir eine Lösung finden, die 40 Bytes verwendet undRiffle@@TakeDrop[#,Length@#/2]&~Nest~##&
gleichzeitig die##
zu analysierende Sequenz als zusätzliche Argumente verwendetNest
.TakeDrop
. Und es ist besser,##
die Sequenz einzufügen.APL,
2321 ZeichenOhne die Annahme (Danke an Dennis) und 1 Zeichen kürzer:
Probieren Sie es online an .
quelle
Java, 109 Bytes
int[]f(int[]a,int n){for(int x,q=a.length,d[];0<n--;a=d){d=new int[q];for(x=0;x<q;x++)d[(2*x+2*x/q)%q]=a[x];}return a;}
Erläuterung: Es gibt ein Muster dafür, wie sich die Elemente bewegen, wenn sie gemischt werden:
Sei x der ursprüngliche Index
sei y der neue Index
L sei die Länge des Arrays
oder als Code:
y=(2*x+x/(L/2))%L
Dies setzt voraus, dass die Zeichen bei 0 beginnen. Hier ist der Code, der weiter erklärt wird:
siehe ideone für testfälle
quelle
void f(int[]a,int n){for(int x,q=a.length,d[];0<n--;a=d)for(d=new int[q],x=0;x<q;)d[(2*x+2*x/q)%q]=a[x++];}
( 107 Bytes - Ihre aktuelle Antwort ist 119 BTW, nicht 109, also -12 Bytes). Da Sie das Eingabearray ändern, müssen Sie es nicht zurückgeben. Sie können es daher in einen leeren Wert ändern, um die Anzahl der Bytes zu verringern. Oh, und wenn Sie mit Curry auf ein Java 8 Lambda konvertieren, können Sie es noch kürzer machen:a->n->{for(int x,q=a.length,d[];0<n--;a=d){d=new int[q];for(x=0;x<q;x++)d[(2*x+2*x/q)%q]=a[x];}}
( 96 Bytes )Julia,
4542 BytesProbieren Sie es online!
Wie es funktioniert
Wir definieren den binären Operator
\
für diese Aufgabe (neu) . Sei a ein Array und n eine nicht negative ganze Zahl.Wenn n positiv ist, mischen wir das Array. Dies wird erreicht, indem es in eine Matrix der Länge (a) ÷ 2 Zeilen und zwei Spalten umgeformt wird.
'
transponiert die resultierende Matrix, erstellt zwei Zeilen und reduziert das Ergebnis mit[:]
. Da Julia Matrizen in Spalten-Hauptreihenfolge speichert, verschachtelt dies die beiden Zeilen.Danach rufen wir
\
rekursiv mit den gemischten Buchstaben a und n - 1 (~-n
) als Argumente auf und führen so zusätzliche Mischvorgänge durch. Sobald n 0 erreicht , geben wir den aktuellen Wert von zurück a zurück .quelle
Pyke, 7 Bytes
Probieren Sie es hier aus!
quelle
Eigentlich 15 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Prolog, 116 Bytes
Verwendung
quelle
Perl 5
-lan
, 52 BytesProbieren Sie es online!
quelle
PHP, 98 Bytes
Probieren Sie es online aus .
quelle