Faro Shuffle to technika często używana przez magów do „Shuffle” talię. Aby wykonać losowanie Faro, najpierw pociąć talię na 2 równe połowy, a następnie przełożyć dwie połowy. Na przykład
[1 2 3 4 5 6 7 8]
Faro jest potasowany
[1 5 2 6 3 7 4 8]
Można to powtórzyć dowolną liczbę razy. Co ciekawe, jeśli powtórzysz tyle razy, zawsze znajdziesz się w oryginalnej tablicy. Na przykład:
[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]
Zauważ, że 1 pozostaje na dole, a 8 na górze. To sprawia, że jest to tasowanie zewnętrzne . To ważne rozróżnienie.
Wyzwanie
Biorąc pod uwagę tablicę liczb całkowitych A i liczbę N , wypisz tablicę po tasowaniu N Faro. A może zawierać powtarzające się lub ujemne elementy, ale zawsze będzie miała parzystą liczbę elementów. Możesz założyć, że tablica nie będzie pusta. Możesz również założyć, że N będzie nieujemną liczbą całkowitą, chociaż może wynosić 0. Możesz wprowadzić te dane wejściowe w dowolny rozsądny sposób. Najkrótsza odpowiedź w bajtach wygrywa!
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]
I ogromny przypadek testowy:
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]
Powinien generować:
[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]
źródło
Odpowiedzi:
05AB1E , 5 bajtów
Kod:
Objaśnienie, dane wejściowe:
N
,array
:Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
vim,
625954Łał. Jest to prawdopodobnie najbardziej hacka rzecz, którą napisałem dla PPCG, i to coś mówi.
Dane wejściowe są przyjmowane jako N w pierwszym wierszu, po których następują elementy tablicy, każdy w osobnym wierszu.
Prawdopodobnie znalazłem kilka błędów vima podczas pisania tej odpowiedzi:
nagrywanie makr nie jest możliwe w obrębie innych makr (przy ręcznym ustawianiu tekstu, nie za pomocą
q
) lub w obrębie:*map
s.:let @a='<C-v><cr>'<cr>i<C-r>a
wypisuje dwie nowe linie, a nie jedną z jakiegokolwiek tajemniczego powodu.Mogę to zbadać później.
Dzięki Dr Green Eggs i Ham DJ za 3 bajty!
źródło
:P
Możesz także zdjąć 2 bajty, wykonując"rck
zamiastvgg"rc
, i możesz zdjąć kolejne 5, wykonującdw@"i@r<esc>
zamiastAA@R<C-v><esc><esc>0D@"
Python 2, 59 bajtów
Inne podejście, nieco dłuższe niż inne odpowiedzi w języku Python. Działa tylko w przypadku dodatniej parzystej liczby elementów.
np.
1, [1,2,3,4,5,6,7,8]
weź tablicę i dołącz jejlen(L)/2-1
kopie minus pierwszy element, npNastępnie weź każdy
len(L)/2
element.źródło
Python,
6857 bajtówDzięki @ Sp3000 za grę w golfa z 11 bajtów!
Przetestuj na Ideone .
źródło
Haskell, 62 bajty
Niech s = 2 · t będzie wielkością listy. I -ty element nowej listy uzyskuje się poprzez poświęcenie -ty element starej listy, zero-indeksowane, modulo s .
Dowód: jeśli i = 2 · k jest parzyste, to
a jeśli i = 2 · k + 1 jest nieparzyste, to
Zatem wartości stosowane do indeksowania to 0, t , 1, t + 1, 2, t + 2,…
źródło
J - 12 bajtów
Przysłówek (!) Przyjmujący liczbę przetasowań po lewej stronie i tablicę do przetasowania po prawej stronie.
Parser J ma zasady pisania przysłówków cichych , ale mają one bardzo niski priorytet: jeśli chcesz użyć ciągu czasowników jako lewego argumentu, możesz pominąć niezbędny zestaw nawiasów. Tak więc powyższe jest w rzeczywistości skrótem
(/:#/:@$0,#)^:
, który przyjmuje liczbę przetasowań po lewej stronie jako przysłówek, a następnie staje się funkcją monadyczną, która przetasowuje tablicę po prawej stronie.To powiedziawszy, tasujemy w następujący sposób.
#
jest długością tablicy, więc0,#
jest listą dwóch elementów: 0, po której następuje coś niezerowego. Następnie#/:@$
powiela to na listę tak długo, jak tablica wejściowa i pobiera wektor sortowania .Wektor sortowania listy jest informacją o sposobie sortowania listy: invdex (oparty na 0) najmniejszego elementu, po którym następuje indeks następnej najmniejszej itd. Na przykład wektor sortowania
0 1 0 1 ...
będzie więc0 2 4 ... 1 3 5 ...
.Gdyby J miał teraz posortować ten wektor sortowania, Faro go przetasował; ale byłoby to trywialne, ponieważ wrócilibyśmy
0 1 2 3 ...
. Dlatego używamy narzędzia Diadic/:
do sortowania tablicy wejściowej tak, jakby była0 2 4 ... 1 3 5 ...
, which Faro-shuffles it.Przykładowe użycie poniżej. Wypróbuj sam na tryj.tk !
źródło
Pyth -
87 bytessaved 1 byte thanks to @issacg
Try it online here.
źródło
Q
to save a byte. There must be something wrong with the Pyth answer if Jelly beats Pyth. :)u
with None and do fixed point?Jelly,
97 bytes2 bytes thanks to Dennis!
Try it online!
Explanation
Previous 9-byte version:
Try it online!
źródło
JavaScript (ES6),
6151 bytesModifies the input array in place and returns a copy of the original array. If this is unacceptable,
&&a
can be suffixed to return the modified array. Only works for small values ofn
due to the limitations of JavaScript's integer arithmetic.6160 byte recursive version that works with largern
, based on @Lynn's formula:źródło
MATL, 11 bytes
Thanks to @Dennis for a correction
Try it online!
Explanation
źródło
w
necessary?J,
221917 bytes3 bytes thanks to @Gareth.
2 bytes thanks to @algorithmshark.
Usage
Where
>>
is STDIN and<<
is STDOUT.Previous 22-byte version:
Usage
Where
>>
is STDIN and<<
is STDOUT.źródło
{~2,@|:@i.@,-:@#^:
for 18 bytes.[:,@|:]]\~_2%~#^:
,@|:@$~2,-:@#^:
works for 15 bytesMathematica 44 bytes
With 4 bytes saved thanks to @miles.
Riffle @@ TakeDrop[#, Length@#/2] &~Nest~## &[list, nShuffles]
splits the list into two equal sublists and shuffles (Riffle
s) them.{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}
źródło
TakeDrop
we can find a solution using 40 bytes asRiffle@@TakeDrop[#,Length@#/2]&~Nest~##&
while also taking the sequence##
to be parsed as additional arguments toNest
.TakeDrop
. And it is better to use##
to insert the sequence.APL,
2321 charsWithout the assumption (Thanks to Dennis) and 1 char shorter:
Try it on online.
źródło
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;}
Explanation: There is a pattern to how the elements move when they are faro shuffled:
let x be the original index
let y be the new index
let L be the length of the array
or as code:
y=(2*x+x/(L/2))%L
This assumes that indicies start at 0. Here's the code further explained:
see ideone for test cases
źródło
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 - your current answer is 119 btw, not 109, so -12 bytes). Since you modify the input array, there is no need to return it, so you can change it to a void to reduce bytes. Oh, and if you convert to a Java 8 lambda with currying you could make it even shorter: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 bytesTry it online!
How it works
We (re)define the binary operator
\
for this task. Let a be an array and n a non-negative integer.If n is positive, we shuffle the array. This is achieved by reshaping it into a matrix of length(a) ÷ 2 rows and two columns.
'
transposes the resulting matrix, creating of two rows, then flattening the result with[:]
. Since Julia stores matrices in column-major order, this interleaves the two rows.Afterwards, we call
\
recursively with the shuffled a and n - 1 (~-n
) as arguments, thus performing additional shuffles. Once n reaches 0, we return the current value of a.źródło
Pyke, 7 bytes
Try it here!
źródło
Actually, 15 bytes
Try it online!
Explanation:
źródło
Prolog, 116 bytes
Usage
źródło
Perl 5
-lan
, 52 bytesTry it online!
źródło
PHP, 98 bytes
Try it online.
źródło