Alice dan Bob suka memainkan permainan kartu, dengan setumpuk kartu bernomor dengan bilangan bulat non-negatif berturut-turut.
Alice memiliki cara yang sangat khusus untuk mengocok dek. Pertama, dia mengambil kartu paling atas dari geladak dan meletakkannya di bagian bawah geladak. Lalu dia mengeluarkan kartu berikutnya, dan mulai tumpukan dengan itu. Kemudian, lagi-lagi dia memutar kartu teratas ke bawah, dan meletakkan kartu teratas baru ke tumpukan. Dia mengulangi proses ini sampai dia mengosongkan dek, di mana titik tumpukan adalah dek baru.
deck | pile
-----------+-----------
3 1 4 0 2 |
1 4 0 2 3 |
4 0 2 3 | 1
0 2 3 4 | 1
2 3 4 | 0 1
3 4 2 | 0 1
4 2 | 3 0 1
2 4 | 3 0 1
4 | 2 3 0 1
| 4 2 3 0 1
4 2 3 0 1 |
Gambar 1: Alice melakukan shuffle-nya di dek 5-kartu "3, 1, 4, 0, 2". Bagian belakang kartu semuanya menghadap ke kiri.
Suatu hari, Bob mengumumkan dia akan berlibur selama seminggu. Alice, yang tidak memiliki siapa pun untuk bermain game, mendaftarkan temannya Eve. Sekarang, Eve adalah penipu yang tak tahu malu, jadi ketika dia melihat pengocokan aneh Alice, dia menyadari bahwa dia bisa menumpuk dek sebelumnya untuk keuntungannya!
Ketika Eve pulang setelah hari pertama, dia melakukan beberapa analisis pada permainan dan menemukan bahwa peluang terbaiknya adalah ketika kartu berada di urutan 0, 1, 2, 3, 4, 5, ... Dia tidak menangkap berapa banyak kartu yang ada di geladak, jadi dia menetas skema yang tidak jelas untuk menulis beberapa kode di lengannya yang, ketika dijalankan, mengambil ukuran geladak dan menampilkan urutan yang diperlukan Hawa untuk memasukkan kartunya, sehingga ketika Alice mengocok dek, dek terakhir ada di urutan 0, 1, 2, 3, ...
Hawa tidak peduli apa bahasa kode itu (dia tahu semuanya), atau apakah kode tersebut adalah fungsi yang mengambil argumen integer dan mengembalikan array, atau program penuh mengambil input melalui argumen baris perintah atau STDIN dan menulis hasilnya ke STDOUT. Namun, dia membutuhkan kode sesingkat mungkin, untuk memperkecil kemungkinan Alice melihatnya dan menangkapnya.
Tidak bermoral, bisakah kalian membantu Hawa?
Contoh input dan output:
in out
1 0
2 0 1
5 2 4 0 3 1
10 2 9 4 8 0 7 3 6 1 5
52 6 51 25 50 12 49 24 48 1 47 23 46 11 45 22 44 5 43 21 42 10 41 20 40 2 39 19
38 9 37 18 36 4 35 17 34 8 33 16 32 0 31 15 30 7 29 14 28 3 27 13 26
sumber
shuffle(shuffle(range(5))) == range(5)
...Jawaban:
GolfScript,
151413 byteCobalah online.
Contoh
Bagaimana itu bekerja
sumber
{}/
alih-alih operator peta untuk menyimpan char.](
karena dua karakter pertama secara efektif menempatkan array kosong di bawah input, menghemat Anda nanti[]\
.Julia, 83
Elemen terakhir dalam vektor yang dikembalikan adalah bagian atas dek.
sumber
Mathematica,
927746 byteMengharapkan input dalam variabel
n
:Ini hanya memutar acak mundur, dengan memindahkan kartu dan kemudian meletakkan kartu bagian bawah di atas.
EDIT: Tidak perlu melacak tumpukan output, cukup iterate melalui integer.
sumber
Python 2.7 - 57
Bagus dan sederhana, balikkan shuffle. Cukup dekat dengan bagaimana Golfscript melakukannya.
sumber
J (13 karakter) dan K (9)
Ternyata, ini adalah proses sederhana untuk membatalkan pengocokan, dan APL-suka memiliki kata keterangan lipat
/
untuk membantu mereka membuat ini sesingkat mungkin.J mengambil 13 char dengan
(_1|.,)/@i.@-
, sedangkan K hanya membutuhkan 9:|(1!,)/!:
. APL juga akan sama singkatnya.Inilah jejak langkah demi langkah dari versi J.
Anda mungkin melihat bahwa di J, kita membalikkan array bilangan bulat pertama, tapi di K kita lakukan setelah itu: ini adalah karena K lipat lebih seperti
foldl
, dibandingkan dengan Jfoldr
.sumber