Sebuah Faro mengocok adalah teknik yang sering digunakan oleh para penyihir untuk "shuffle" dek. Untuk melakukan Faro shuffle, pertama-tama Anda memotong dek menjadi 2 bagian yang sama maka Anda memotong bagian kedua. Sebagai contoh
[1 2 3 4 5 6 7 8]
Faro yang dikocok adalah
[1 5 2 6 3 7 4 8]
Ini dapat diulang beberapa kali. Cukup menarik, jika Anda mengulangi ini cukup banyak, Anda akan selalu berakhir kembali di array asli. Sebagai contoh:
[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]
Perhatikan bahwa 1 tetap di bawah dan 8 tetap di atas. Itu membuat ini menjadi shuffle luar . Ini adalah perbedaan penting.
Tantangan
Diberikan array bilangan bulat A , dan angka N , output array setelah N Faro mengocok. A mungkin mengandung elemen berulang atau negatif, tetapi akan selalu memiliki jumlah elemen genap. Anda dapat menganggap array tidak akan kosong. Anda juga dapat mengasumsikan bahwa N akan menjadi bilangan bulat non-negatif, meskipun mungkin 0. Anda dapat mengambil input ini dengan cara yang masuk akal. Jawaban terpendek dalam byte menang!
Tes 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]
Dan, ujian besar-besaran:
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]
Haruskah output:
[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]
sumber
Jawaban:
05AB1E , 5 byte
Kode:
Penjelasan, masukan:
N
,array
:Menggunakan pengkodean CP-1252 . Cobalah online! .
sumber
vim,
625954Wow. Ini mungkin hal yang paling hacki yang saya tulis untuk PPCG, dan itu mengatakan sesuatu.
Input diambil sebagai N pada baris pertama diikuti oleh elemen-elemen array, masing-masing pada barisnya sendiri.
Saya sebenarnya mungkin menemukan beberapa bug vim saat menulis jawaban ini:
merekam makro tidak dimungkinkan dalam makro lain (saat mengatur teks mereka secara manual, tidak dengan
q
) atau di dalam:*map
s.:let @a='<C-v><cr>'<cr>i<C-r>a
menghasilkan dua baris baru, bukan satu, untuk alasan misterius apa pun.Saya mungkin akan menyelidiki lebih lanjut nanti.
Terima kasih kepada Dr Green Eggs dan Ham DJ selama 3 byte!
sumber
:P
Anda juga dapat melepas 2 byte dengan melakukan"rck
alih - alihvgg"rc
, dan Anda dapat melepas 5 byte dengan melakukan alih -dw@"i@r<esc>
alihAA@R<C-v><esc><esc>0D@"
Python 2, 59 byte
Pendekatan yang berbeda, sedikit lebih panjang dari jawaban Python lainnya. Hanya berfungsi untuk sejumlah elemen positif.
misal untuk
1, [1,2,3,4,5,6,7,8]
, ambil array dan tambahkanlen(L)/2-1
salinannya sendiri dikurangi elemen pertama, misKemudian ambil setiap
len(L)/2
elemen.sumber
Python,
6857 byteTerima kasih kepada @ Sp3000 untuk bermain golf 11 byte!
Cobalah Ideone .
sumber
Haskell, 62 byte
Biarkan s = 2 · t menjadi ukuran daftar. The i elemen -th dari daftar baru diperoleh dengan mengambil unsur -th dari daftar lama, nol-diindeks, modulo s .
Bukti: jika i = 2 · k genap, maka
dan jika i = 2 · k +1 adalah ganjil, maka
Dengan demikian nilai yang digunakan untuk pengindeksan adalah 0, t , 1, t + 1, 2, t + 2,…
sumber
J - 12 byte
Adverb (!) Mengambil jumlah shuffles di sebelah kiri dan array untuk shuffle di sebelah kanan.
J parser memiliki aturan untuk menulis adverbia diam-diam , tetapi mereka memiliki prioritas yang sangat rendah: jika Anda ingin menggunakan kereta kata kerja sebagai argumen kiri, Anda dapat menghilangkan satu set tanda kurung yang diperlukan. Jadi di atas sebenarnya adalah kependekan dari
(/:#/:@$0,#)^:
, yang mengambil jumlah shuffles di sebelah kiri sebagai kata keterangan, dan kemudian menjadi fungsi monadik mengambil array untuk mengocok di sebelah kanan.Yang mengatakan, kami mengocok sebagai berikut.
#
adalah panjang array, begitu0,#
juga daftar dua elemen: 0 diikuti oleh sesuatu yang bukan nol. Kemudian#/:@$
mereplikasi itu ke dalam daftar selama input array, dan mengambil vektor pengurutannya .Vektor pengurutan daftar adalah informasi untuk cara mengurutkan daftar: invdex (berbasis-0) dari elemen terkecil, diikuti oleh indeks berikutnya-terkecil, dan seterusnya. Sebagai contoh, vektor semacam
0 1 0 1 ...
akan demikian0 2 4 ... 1 3 5 ...
.Jika J sekarang menyortir vektor semacam ini, itu akan Faro-shuffle; tapi itu akan sepele, karena kita akan
0 1 2 3 ...
kembali. Jadi kami menggunakan diad/:
untuk mengurutkan array input seolah-olah itu0 2 4 ... 1 3 5 ...
, yang Faro-mengocoknya.Contoh penggunaan di bawah ini. Coba sendiri di tryj.tk !
sumber
Pyth -
87 bytedisimpan 1 byte berkat @issacg
Cobalah online di sini .
sumber
Q
untuk menyimpan byte. Pasti ada yang salah dengan jawaban Pyth jika Jelly mengalahkan Pyth. :)u
dengan None dan melakukan fixed point?Jelly,
97 byte2 byte berkat Dennis!
Cobalah online!
Penjelasan
Versi 9 byte sebelumnya:
Cobalah online!
sumber
JavaScript (ES6),
6151 byteMengubah array input pada tempatnya dan mengembalikan salinan array asli. Jika ini tidak
&&a
dapat diterima, dapat diakhiri dengan mengembalikan array yang dimodifikasi. Hanya berfungsi untuk nilai keciln
karena keterbatasan aritmatika integer JavaScript.61versi rekursif 60 byte yang bekerja dengan lebih besarn
, berdasarkan rumus @ Lynn:sumber
MATL , 11 byte
Berkat @ Dennis untuk koreksi
Cobalah online!
Penjelasan
sumber
w
perlu?J,
221917 byte3 byte terima kasih kepada @Gareth .
2 byte berkat @algorithmshark .
Pemakaian
Dimana
>>
STDIN dan<<
STDOUT.Versi 22 byte sebelumnya:
Pemakaian
Di mana
>>
STDIN dan<<
STDOUT.sumber
{~2,@|:@i.@,-:@#^:
untuk 18 byte .[:,@|:]]\~_2%~#^:
,@|:@$~2,-:@#^:
bekerja selama 15 byteMathematica 44 byte
Dengan 4 byte disimpan berkat @miles.
Riffle @@ TakeDrop[#, Length@#/2] &~Nest~## &[list, nShuffles]
membagi daftar menjadi dua sublists yang sama dan mengocoknyaRiffle
.{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, 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 }
sumber
TakeDrop
kita dapat menemukan solusi menggunakan 40 byte sebagaiRiffle@@TakeDrop[#,Length@#/2]&~Nest~##&
sambil mengambil urutan##
untuk diuraikan sebagai argumen tambahanNest
.TakeDrop
. Dan lebih baik digunakan##
untuk memasukkan urutan.APL,
2321 karakterTanpa asumsi (Terima kasih kepada Dennis) dan 1 char lebih pendek:
Cobalah secara online .
sumber
java, 109 byte
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;}
Penjelasan: Ada pola bagaimana elemen bergerak ketika mereka dikocok secara jauh:
biarkan x menjadi indeks asli
biarkan y menjadi indeks baru
biarkan L menjadi panjang array
atau sebagai kode:
y=(2*x+x/(L/2))%L
Ini mengasumsikan bahwa indeks mulai dari 0. Inilah kode yang dijelaskan lebih lanjut:
lihat ideone untuk test case
sumber
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 byte - jawaban Anda saat ini adalah 119 btw, bukan 109, jadi -12 byte). Karena Anda memodifikasi array input, Anda tidak perlu mengembalikannya, jadi Anda bisa mengubahnya menjadi void untuk mengurangi byte. Oh, dan jika Anda mengonversi ke lambda Java 8 dengan kari, Anda bisa membuatnya lebih pendek: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 byte )Julia,
4542 byteCobalah online!
Bagaimana itu bekerja
Kami (kembali) mendefinisikan operator biner
\
untuk tugas ini. Biarkan a menjadi array dan n bilangan bulat non-negatif.Jika n positif, kami mengocok array. Ini dicapai dengan membentuk kembali menjadi matriks panjang (a) ÷ 2 baris dan dua kolom.
'
mentransposasikan matriks yang dihasilkan, membuat dua baris, lalu meratakan hasilnya dengan[:]
. Karena Julia menyimpan matriks dalam urutan kolom-utama, ini menyisipkan dua baris.Setelah itu, kami memanggil
\
secara rekursif dengan mengocok a dan n - 1 (~-n
) sebagai argumen, sehingga melakukan pengocokan tambahan. Setelah n mencapai 0 , kami mengembalikan nilai saat ini dari a .sumber
Pyke, 7 byte
Coba di sini!
sumber
Sebenarnya, 15 byte
Cobalah online!
Penjelasan:
sumber
Prolog, 116 byte
Pemakaian
sumber
Perl 5
-lan
, 52 byteCobalah online!
sumber
PHP, 98 byte
Cobalah online .
sumber