The prinsip mengesampingkan menyatakan bahwa
Jika N item dimasukkan ke dalam kotak M , dengan N > M , maka setidaknya satu kotak harus berisi lebih dari satu item.
Bagi banyak orang, prinsip ini memiliki status khusus dibandingkan dengan pernyataan matematika lainnya. Sebagai EW Dijkstra menulis ,
Dikelilingi oleh beberapa mistik. Bukti menggunakannya sering dianggap sebagai sesuatu yang istimewa, sesuatu yang sangat cerdik.
Tantangan
Tujuan dari tantangan ini adalah untuk menggambarkan prinsip pigeonhole menggunakan representasi seni ASCII. Secara khusus:
- Ambil sebagai input
N
(jumlah item) danM
(jumlah kotak), denganN
non-negatif danM
positif.N
mungkin lebih kecil dariM
(bahkan jika prinsipnya tidak berlaku dalam kasus itu). - Pilih secara acak salah satu penugasan item yang mungkin untuk kotak. Setiap penugasan harus memiliki probabilitas yang tidak nol untuk dipilih.
Menghasilkan representasi seni ASCII dari penugasan sebagai berikut:
- Ada
M
garis, masing-masing sesuai dengan kotak. - Setiap baris dimulai dengan karakter non-spasi, seperti
|
. - Mengikuti karakter itu adalah karakter non-spasi putih lainnya, seperti
#
, diulang sebanyak yang ada item dalam kotak itu.
- Ada
Pertimbangkan misalnya N = 8
, M = 5
. Jika Assigment yang dipilih item untuk kotak adalah 4
, 1
, 0
, 3
, 0
, representasi adalah
|####
|#
|
|###
|
Proses yang berbeda (menghasilkan tugas yang berbeda) dari program yang sama dapat memberikan
|#
|##
|#
|#
|###
Ada beberapa fleksibilitas mengenai representasi; Lihat di bawah.
Aturan khusus
Kode harus secara teoritis menjalankan untuk setiap nilai-nilai dari N
dan M
. Dalam praktiknya mungkin dibatasi oleh ukuran memori atau batasan tipe data.
Karena mengamati output tidak cukup untuk menentukan apakah semua tugas memiliki probabilitas non-nol , setiap pengiriman harus menjelaskan bagaimana kode mencapai itu, jika tidak jelas.
Variasi representasi berikut diizinkan:
- Pasangan karakter yang berbeda dan bukan spasi dapat dipilih. Mereka harus konsisten di seluruh eksekusi program.
- Rotasi representasi 90 derajat dapat diterima. Sekali lagi, pilihan harus konsisten.
- Trailing atau memimpin spasi putih diizinkan.
Sebagai contoh dengan format representasi yang berbeda, untuk N = 15
, M = 6
hasil dari dua eksekusi program bisa
VVVVVV
@@@@@@
@@ @@@
@ @@
@
atau
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
Demikian juga, N = 5
, M = 7
bisa memberikan, menggunakan variasi lain dari representasi,
*
* * * *
UUUUUUU
atau
*** **
UUUUUUU
atau
*
* *
* *
UUUUUUU
Perhatikan bagaimana prinsip ini tidak berlaku dalam kasus ini, karena N
< M
.
Aturan umum
Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun . Celah standar dilarang.
Masukan dapat diambil dengan cara apa pun yang wajar ; dan dengan format apa pun, seperti array dua angka atau dua string yang berbeda.
Cara dan format keluaran juga fleksibel. Sebagai contoh, output dapat berupa daftar string atau string dengan baris baru; dikembalikan sebagai argumen keluaran fungsi atau ditampilkan dalam STDOUT. Dalam kasus terakhir tidak perlu khawatir tentang pembungkus garis yang disebabkan oleh lebar tampilan yang terbatas.
Kode terpendek dalam byte menang.
Jawaban:
Jelly ,
98 byteIni adalah tautan diadik yang menganggap M sebagai kiri dan N sebagai argumen yang benar. Output adalah array bilangan bulat, di mana 0 mewakili merpati dan 1 mewakili lubang.
Cobalah online!
Bagaimana itu bekerja
sumber
Mathematica, 68 byte
Fungsi tanpa nama yang mengambil dua argumen integer, jumlah kotak, diikuti oleh jumlah item.
Pertama-tama menghitung semua kemungkinan partisi
N+M
menjadiM
bagian-bagian yang benar - benar positif, dan mengurangi1
dari setiap partisi sesudahnya. Ini memberi kita semua kemungkinan partisiN
menjadiM
bagian non-negatif (yangIntegerPartitions
tidak akan menghasilkan sebaliknya). Kemudian pilih partisi acak dan kocok. Ini menjamin semua kemungkinan partisi yang dipesan dengan nol diizinkan. Akhirnya, mengkonversi setiap bin partisi ke line output dengan menaikkan 10 pangkat yang sesuai (seperti yang setiap baris menjadi1000...
dengank
nol). Contoh output mungkin terlihat seperti:sumber
PadRight
tidak akan mendukungM
nol jikaN
<M
.PadRight
ketidakmampuan daftar akan membuatnya lebih lama.PadRight
akanIntegerPartitions[#,{#2},0~Range~#]
.Python 2,
7786 byteMenghasilkan angka dalam [0, n], mencetak banyak item dan menguranginya dari n. Hal ini sering terjadi.
Ini membuatnya sangat tidak mungkin apa pun berhasil sampai ke kotak terakhir, tetapi pertanyaannya hanya meminta agar setiap output menjadi mungkin , tidak sama mungkin .
sumber
Batch, 164 byte
Saya pikir 7
%
tanda berturut-turut mungkin menjadi yang terbaik pribadi baru! Catatan: ini menghasilkan output ganjil jika itu pernah menetapkan lebih dari 9 item ke kotak yang sama; jika itu masalah, maka untuk 180 byte:Ya,
%
totalnya 28 detik di baris kedua.sumber
C, 102 byte
Mengambil input pada stdin, misalnya:
Tidak akan menghasilkan setiap output dengan probabilitas yang sama, tetapi mampu menghasilkan semua kombinasi yang mungkin.
Kerusakan:
Bergantung pada penanganan GCC terhadap perilaku tidak terdefinisi
%0s
- biasanya%0
akan mem-zero-pad integer atau float, tetapi itu hanya bisa pad (tidak pernah terpotong), sehingga tidak mungkin mencetak yang kosong. Tetapi perilaku untuk string tidak didefinisikan, dan GCC memutuskan untuk membuatnya menjadi nol-pad dengan cara yang sama, jadi ini nol-bantalan string kosong untuk dapat menulis nol atau lebih0
s.sumber
a(b,c){...}
alih-alihmain
danscanf
.Python 2,
102999790 bytem-1
kali, pilih jumlah acakx
antara0
dann
, inklusif dan kurangi dari n. Kemudian cetak a1
dan'0'*x
.Akhirnya, cetak
1
dan sisanya0
. Sama sekali tidak peluang yang sama, tetapi semua konfigurasi dimungkinkan.(Kode yang digunakan kembali dari jawaban Python yang rusak.)
sumber
Haskell,
11494 byteSedikit pendekatan brute force: Menghasilkan daftar angka acak yang tak terbatas, mengambil n nomor awal daftar, merangkumnya, dan memeriksa apakah sama dengan m. Jika tidak, lepaskan elemen pertama dari daftar dan ulangi.
Cobalah online!
Catatan: 73 byte tanpa impor
EDIT: Menyimpan beberapa byte dengan trik 10 ^ ( Coba versi baru online! )
sumber
REXX, 74 byte
Output (8 5):
Output (8 5):
sumber
C,
175138 byteTerima kasih kepada @Dave untuk menghemat 37 byte!
Cobalah online!
sumber
calloc
akan memberi Anda 0-diinisialisasi memori (tidak perlu mengatur semua 0s sendiri),strchr
dapat menemukan akhir string, koma dapat operasi rantai, menghindari kebutuhan{}
, danx[0] == *x
. Juga hati-hati; Anda tidakmalloc
memiliki cukup memori jika semua item ada di kotak yang sama.AHK, 66 byte
Saya mengikuti prinsip yang sama dengan orlp yang menggunakan angka acak dari 0 hingga N dan kemudian mengurangkannya dari N. Sayangnya, saya tidak bisa menyimpan byte dengan menggunakan 10 ^ r karena cara fungsi Kirim bekerja. Alas dan hampir. Berikut adalah beberapa output untuk n = 8, m = 5:
sumber
CJam,
303121 byteInput adalah dua angka
n m
pada stack. Penggunaan1
untuk karakter kolom dan0
untuk karakter yang diulang.Penjelasan:
sumber
Röda , 79 byte
Cobalah online!
Ini menciptakan array angka nol dan menambahkannya di tempat acak.
sumber
PHP, 100 byte
Kerusakan :
Output untuk
m=7
dann=5
:Eksekusi pertama:
Eksekusi kedua:
Cobalah online!
sumber
[,$m,$n]=$argv;
dari PHP 7.1 untuk menyimpan beberapa karakter. Anda dapat mengganti\n
dengan jeda baris yang sebenarnya untuk menghemat 1 byte. Anda dapat menggunakanfor(;$m-->0;)$a[rand(0,$n-1)].=a;
untuk menyimpan istirahat, a$m
dan titik koma.[,$m,$n]=$argv;$a=array_fill(0,$n,z);for(;$m-->0;)$a[rand()%$n].=a;echo join("\n",$a);
85 byte[,$m,$n]=$argv;for(;$m--;)${rand()%$n}.=a;for(;$n--;)echo"z${$n}\n";
67 byte.[,$m,$n]=$argv;
pada kode-golf lain tetapi tidak dapat membuatnya bekerja baik di lingkungan dev saya atau di eval.inJavaScript, 105 byte
Cobalah online!
Karena metode penugasan baris, ini akan cenderung menempatkan lebih banyak ke bagian bawah, meskipun ada kemungkinan kecil bahwa bagian atas akan mendapatkan beberapa.
sumber
Ruby, 52 byte
Membuat fungsi anonim yang mengambil dua bilangan bulat sebagai argumen dan mengembalikan array dari Strings:
sumber
Python 2, 81 byte
Mengembalikan daftar string.
sumber
Javascript (ES7), 75 byte
Saya pikir saya pandai karena memiliki kekuatan 10 gagasan hanya untuk menyadari bahwa sebagian besar jawaban sudah menggunakan itu.
sumber
AWK, 78 byte
Membawa 2 argumen, pertama jumlah item, lalu jumlah kotak. Mulai dengan menyemai generator angka acak sehingga setiap proses berbeda. Kemudian cukup membangun string dalam array, Contoh penggunaan:
sumber
MATLAB,
10394 byteDengan Pemformatan
Output Sampel
Ada spasi spasi tambahan karena setiap entri array ditampilkan dengan tab di antara mereka, tetapi ini harus dapat diterima sesuai spesifikasi.
Ini sepertinya implementasi yang sangat sederhana bagi saya, jadi saya yakin ini bisa diperbaiki.
Terima kasih kepada @Luis Mendo untuk saran.
sumber
d=@(p)disp(char([1,~(1:p)]+48));for i=1:m-1;p=randi([0,n]);d(p);n=n-p;end;d(n)
a=
. Dalam hal ini Anda tidak dapat melakukan itu, pada prinsipnya, karena fungsi anonim tidak dapat berisi loop. Tapi Anda bisa menggunakan trik memasukkan semuanya ke dalameval('...')
. BTW, itu biasanya dianggap praktik buruk dan buruk di Matlab, tapi di sini kami suka menyalahgunakan bahasa :-)Oktaf ,
6254 byteFungsi anonim yang mengambil dua angka dan mengeluarkan array karakter 2D
>
untuk kotak dan*
objek. Semua hasil kemungkinan sama.Cobalah online!
sumber
TI-Basic,
6362 byteKriteria ini membuat program ini lebih mudah untuk ditulis.
Contoh I / O:
Penjelasan:
sumber
MATLAB,
736458 bytePerbarui # 3
Saya memang membutuhkan penyortiran, karena jika tidak, saya mendapatkan bilangan bulat negatif. Saya memang mengganti
disp(sprintf(...))
denganfprintf(...)
sekarang, jadi jawabannya tetap 58 byte.Perbarui # 2:
Saya menyadari bahwa saya tidak perlu mengurutkan array, dan sebenarnya menyortir sebenarnya akan mengurangi rata-rata angka dalam array. Jadi saya menghapus
sort(...)
bagian itu. Perhatikan bahwa output tetap sama, jadi saya tidak memperbarui "output sampel".Akhirnya mendekati jawaban Oktaf dari Luis! : D
Perbarui # 1:
Alih-alih mengkonversi ke string, saya hanya menampilkan angka secara langsung. Saya bisa mengurangi menjadi 58 byte, dengan menghapus
disp(...)
, tapi kemudian saya mendapatkan tambahanans =
hanya dengan sprintf, dan tidak tahu apakah itu dapat diterima.Kode awal:
Berkat beberapa saran oleh Luis , saya menyingkirkan loop dalam jawaban saya sebelumnya . Sekarang saya pertama-tama membuat array vertikal
m
angka acak yang menambahkan hinggan
(diff([0;sort(randi(n,m-1,1));n])
), kemudian menggunakannya sebagai eksponen 10, mengonversinya menjadi string, menjustifikasi-kiri, dan menampilkannya.Saya secara teknis bisa menyingkirkan disp (...) untuk menyimpan 6 byte lagi, tetapi kemudian "ans" akan dicetak yang dapat melanggar spesifikasi. Mungkin juga ada cara untuk mengubahnya menjadi string dan membenarkan kiri untuk mendapatkan format akhir yang diinginkan, jadi saya terbuka untuk saran.
Output sampel:
Catatan : Saya telah mengubah fungsi saya menjadi fungsi anonim di sini, berdasarkan saran. Dalam output sampel, saya telah menetapkan itu
a
untuk menunjukkan. Saya harap ini tidak melanggar spesifikasi, tetapi jika itu tolong beri tahu saya dan saya akan mengubahnya.sumber
m
bilangan bulat acak yang menambahkann
, karena saya terjebak pada bagian itu untuk waktu yang lama .. (Masih tidak dapat menambahkan lebih dari 2 tautan dalam jawaban saya, jadi termasuk itu dalam komentar)Ditumpuk , 29 byte
Cobalah online!
Berperilaku dengan membangun array
M
berisi lajang'|'
, kemudian menambahkan'#'
ke waktu larik yang dipilih secara acakN
.sumber
randin
menggunakan algoritma Fisher-Yates secara internal. (Ini adalah algoritma yang sama dengan jawaban CJam menggunakan FWIW)Python 2 ,
80 95 8988 byteCobalah online!
sumber
Arang , 19 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
sumber