Latar Belakang
Yang disebut "Protokol Urinal", menggambarkan urutan pengambilan urinal individu di kamar mandi pria, telah dibahas di banyak tempat. Satu versi diberikan dalam posting blog xkcd ini . Pertanyaan ini menyangkut sedikit variasi:
Pengaturan : n urinal dalam satu baris.
Protokol : setiap orang baru memilih salah satu urinal yang paling jauh dari yang sudah digunakan.
Perhatikan bahwa ini tidak membatasi penggunaan urinal oleh orang pertama.
Pembaruan : Urutan jumlah cara berbeda di mana n orang dapat memilih dan urinal dimulai dengan 1, 2, 4, 8, 20 ... Perhatikan bahwa ini tidak sama dengan OEIS A095236 , yang menggambarkan pembatasan yang sedikit lebih ketat daripada di ini pertanyaan.
Tugas
Diberikan bilangan bulat n antara 0 dan 10, menghasilkan (dalam urutan apa pun) semua kemungkinan pemesanan tempat n orang dapat menempati n urinal. Setiap pemesanan harus dicetak sebagai pengaturan akhir: urutan digit yang mewakili orang-orang (1-9 untuk 9 orang pertama, 0 untuk kesepuluh), mulai dari urinal paling kiri, dengan pemisah non-alfanumerik opsional antara (tetapi tidak sebelum) atau setelah) digit. Sebagai contoh, output berikut keduanya valid:
>> 3
132
213
312
231
>> 4
1|3|4|2
1|4|3|2
3|1|4|2
4|1|3|2
2|3|1|4
2|4|1|3
2|3|4|1
2|4|3|1
Anda dapat menulis program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi. Hasil harus dicetak ke STDOUT (atau alternatif terdekat).
Mencetak gol
Kode terpendek menang. Syarat & ketentuan standar berlaku.
sumber
span
panjang 1, di mana adaspan
panjang 2 tersedia. Tiba-tiba aku berhasil membingungkan diriku sendiri. Akan muncul bahwa OP secara sengaja diturunkan dari tautan, dan dengan demikian tautan tersebut harus diikuti?Jawaban:
Pyth,
5351Ini adalah pendekatan berulang. Mengingat kemungkinan sebagian terisi dalam set lokasi yang dipesan, kami menemukan semua lokasi lebih lanjut yang optimal, kemudian menghasilkan daftar lokasi yang sesuai, dan ulangi.
Hasilnya dihasilkan dalam bentuk
[<first person's location>, <second person's location> ...]
, lalu ini diubah menjadi format yang diinginkan.MhSm^-dG2H
mendefinisikan fungsi pembantu yang menemukan jarak minimum dari kios yang diberikan ke kios yang diduduki (kuadrat). Yang mengherankan, separator gratis.Contoh dijalankan.
Penjelasan:
Pertama, fungsi helper
g
, yang menemukan jarak kuadrat minimum antara G dan nilai apa pun dalam H.Selanjutnya, kami menemukan maksimum di atas lokasi urinoir dari jarak kuadrat minimum antara urinal itu dan urinal yang diduduki:
(
Q
adalah input.)d
dalam hal ini adalah daftar urinal yang diduduki, sementarab
iterate atas lokasi urinoir.Berikutnya, kami menemukan semua lokasi urinoir yang jarak kuadrat minimumnya dari urinal yang diduduki terdekat sama dengan nilai maksimum yang ditemukan di atas.
Selanjutnya, kami akan membuat daftar lokasi urinoir yang dibuat dengan menambahkan lokasi urinoir yang ditemukan di atas
d
. Kami akan melakukan ini untuk setiap daftar lokasi urinoir sebelumnya, sehingga memperpanjang daftar dari panjangN
keN+1
.G
adalah daftar daftar resmi lokasi urinal yang diduduki dengan panjang tertentu.Selanjutnya, kami akan menerapkan ungkapan di atas berulang kali, untuk menghasilkan daftar lengkap daftar lokasi urinal yang diduduki.
u
, fungsi pengurangan, melakukan persis ini, sebanyak elemen yang ada dalam argumen kedua.Konversi dari representasi di atas, yang berjalan
[<1st location>, <2nd location>, ... ]
, ke bentuk output yang diinginkan[<person in slot 1>, <person in slot 2>, ... ]
,. Kemudian, bentuk output bergabung ke dalam string output dan dicetak. Pencetakan tersirat.sumber
kajsdlkas^23asdjkla1lasdkj~JZasSSA
- hampir setengah ukuran.Pyth,
757167Solusi kombinatorial rekursif.
Ini adalah terjemahan yang cukup langsung dari solusi Python ini:
sumber
C,
929878 byteYang ini monster, kawan. Maaf.
Mendefinisikan 3 fungsi,
f(int*,int)
,P(int*,int,int,int,int)
, danL(int)
. PanggilL(n)
, dan output ke STDOUT.Output untuk
n=5
:Pembaruan: Saya menghapus pemisah dan memperbaiki kode. Kode lama tidak hanya gagal untuk n = 7 +, tetapi gagal menghasilkan apa pun untuk n = 10 (oops!). Saya sudah lebih menyeluruh menguji banyak ini. Sekarang mendukung input hingga n = 13 (meskipun
"%d"
harus diubah"%x"
sehingga mencetak dalam heksadesimal). Ukuran input tergantung padasizeof(long)
dan diasumsikan8
dalam praktiknya.Berikut ini beberapa penjelasan tentang cara kerjanya, dan mengapa ada pembatasan aneh seperti itu:
Ini banyak digunakan, jadi kami mendefinisikannya untuk menyimpan beberapa byte:
typedef unsigned long U; typedef unsigned char C;
Ini adalah
f
:f
mengambil array bilangan bulat ukurann
, dann
itu sendiri. Satu-satunya bit pintar di sini adalah bahwa ia mengembalikan sebuahunsigned long
, yang diubah menjadichar[8]
oleh fungsi pemanggilan. Setiap karakter dalam array dengan demikian diatur ke0xFF
atau ke indeks yang menunjuk ke urinal yang valid untuk orang berikutnya. Karenan<10
, kami tidak pernah membutuhkan lebih dari 5 byte untuk menampung setiap urinoir valid yang dapat digunakan orang berikutnya.Ini adalah
P
:P
mengambil arrayu
ukuran din
mana tepatnya satu elemen diatur ke1
, dan sisanya0
. Ia kemudian menemukan dan mencetak setiap permutasi yang mungkin terjadi secara rekursif.Disini adalah
L
:L
cukup panggilP
n
kali dengan posisi awal yang berbeda setiap kali.Bagi yang berminat, ini (kurang golf)
f
akan menghasilkan urutan di A095236 .sumber
14352
orang # 1 memilih urinoir paling kiri. Orang # 2 memilih yang paling kanan, yang kemudian memaksa # 3 ke tengah. Ini bukan jumlah urinoir yang diambil berikutnya yang harus dikeluarkan.Python 2, 208
Pendekatan rekursif.
sumber
JavaScript (ES6) 153
160 169Edit Menggunakan Math.min untuk menemukan (tentu saja) jarak maksimal: kode efisien dan 16 byte disimpan.
Pencarian rekursif, dapat bekerja dengan n> 10, cukup hapus% 10 (dan bersiaplah untuk menunggu saat konsol membuka gulungan semua outputnya).
Saya menggunakan array tunggal untuk menyimpan slot yang digunakan (angka positif) atau jarak saat ini dari slot terdekat (angka negatif jadi
<
dan>
ditukar dalam kode).Tidak disatukan
Uji di Firefox / konsol FireBug
sumber
Mathematica,
123104sumber
n~f~s~Join~{#}
akan menjadiJoin[f[n,s],{#}]
.MATLAB, 164
sumber
Perl, 174
Tidak terlalu pendek, tapi menyenangkan. Saya tidak menghitung
use feature 'say';
total byte.De-golf:
sumber
C, 248 byte
Kode ini menggunakan algoritme rekursif untuk menghasilkan hasil yang diinginkan.
Diperluas:
sumber
Bash,
744674 byteIni masih terlalu lama :). Saya menggunakan string untuk mewakili deretan urinal dan algoritma flooding untuk menemukan urinal yang paling jauh di setiap fase rekursi. Kode ungolfed hampir jelas. Jumlah urinal dibaca dari keyboard.
Kode (golf):
Menggunakan:
Dan ungolfed kelanjutannya:
sumber