Prinsip & Kode Golf Pigeonhole

26

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:

  1. Ambil sebagai input N(jumlah item) dan M(jumlah kotak), dengan Nnon-negatif dan Mpositif. Nmungkin lebih kecil dari M(bahkan jika prinsipnya tidak berlaku dalam kasus itu).
  2. Pilih secara acak salah satu penugasan item yang mungkin untuk kotak. Setiap penugasan harus memiliki probabilitas yang tidak nol untuk dipilih.
  3. Menghasilkan representasi seni ASCII dari penugasan sebagai berikut:

    • Ada Mgaris, 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.

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 Ndan 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 = 6hasil dari dua eksekusi program bisa

VVVVVV
@@@@@@
@@ @@@
 @  @@
    @

atau

VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@

Demikian juga, N = 5, M = 7bisa 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.

Luis Mendo
sumber
11
Sebenarnya saya butuh waktu sampai sekarang untuk mendapatkan gelar ...
Martin Ender
@ MartinEnder Apakah itu "prinsip pigeonhole" memiliki lebih banyak karakter daripada "kode golf", atau adakah lelucon lain?
dorukayhan ingin Monica kembali
5
@dorukayhan Di peramban standar, lihat teks sedikit di atas judul pertanyaan ...
Luis Mendo

Jawaban:

2

Jelly , 9 8 byte

=þṗX¥S⁵*

Ini 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

=þṗX¥S⁵*  Main link. Left argument: m. Right argument: n

    ¥     Combine the two links to the left into a dyadic chain and call it
          with arguments m and n.
  ṗ        Compute the n-th Cartesian power of [1, ..., m], i.e., generate all
           vectors of length n that consist of elements of [1, ..., m].
   X       Pseudo-randomly choose one of those vectors with a uniform distribution.
=þ        Equal table; for each k in [1, ..., m] and each vector to the right,
          compare the elements of the vector with k. Group the results by the
          vectors, yielding a 2D Boolean matrix.
     R    Range; map 1 to [1], 0 to [].
      S   Take the sum of all columns.
       ⁵* Raise 10 to the resulting powers.
Dennis
sumber
10

Mathematica, 68 byte

Print/@(10^RandomSample@RandomChoice[IntegerPartitions[+##,{#}]-1])&

Fungsi tanpa nama yang mengambil dua argumen integer, jumlah kotak, diikuti oleh jumlah item.

Pertama-tama menghitung semua kemungkinan partisi N+Mmenjadi Mbagian-bagian yang benar - benar positif, dan mengurangi 1dari setiap partisi sesudahnya. Ini memberi kita semua kemungkinan partisi Nmenjadi Mbagian non-negatif (yang IntegerPartitionstidak 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 menjadi 1000...dengan knol). Contoh output mungkin terlihat seperti:

100
10000
1
10
10
Martin Ender
sumber
Saya percaya PadRighttidak akan mendukung Mnol jika N< M.
LegionMammal978
1
@ LegionMammal978 Terima kasih, berhasil memperbaikinya pada jumlah byte yang sama.
Martin Ender
... Saya benar-benar terkesan. Saya akan melakukan solusi yang serupa, tetapi PadRightketidakmampuan daftar akan membuatnya lebih lama.
LegionMammal978
@ LegionMammal978 Cara lain untuk menghindari PadRightakan IntegerPartitions[#,{#2},0~Range~#].
Martin Ender
1
Tidak buitltin? Saya terkejut ...: D Tapi jawaban yang bagus. Saya hanya perlu mencari tahu cara kerjanya pertama: P
HyperNeutrino
9

Python 2, 77 86 byte

from random import*
n,m=input()
exec'c=randint(0,n);n-=c;print 10**c;'*~-m
print 10**n

Menghasilkan 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 .

orlp
sumber
7

Batch, 164 byte

@for /l %%i in (1,1,%1)do @set h%%i=1
@for /l %%j in (1,1,%2)do @call set/ab=%%random%%%%%%%1+1&call set/ah%%b%%*=10
@for /l %%i in (1,1,%1)do @call echo %%h%%i%%

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:

@for /l %%i in (1,1,%1)do @set h%%i=1
@for /l %%j in (1,1,%2)do @call set/ab=%%random%%%%%%%1+1&call call set h%%b%%=%%%%h%%b%%%%%%0
@for /l %%i in (1,1,%1)do @call echo %%h%%i%%

Ya, %totalnya 28 detik di baris kedua.

Neil
sumber
5

C, 102 byte

n,m;main(x){srand(time(0));for(scanf("%d %d",&n,&m);m--;n-=x)printf("|%0*s\n",x=m?rand()%(n+1):n,"");}

Mengambil input pada stdin, misalnya:

echo "5 4" | ./pigeonhole

Tidak akan menghasilkan setiap output dengan probabilitas yang sama, tetapi mampu menghasilkan semua kombinasi yang mungkin.

Kerusakan:

n,m;
main(x){
    srand(time(0));             // Seed random number generator
    for(scanf("%d %d",&n,&m);   // Parse input values into n and m
        m--;                    // Loop through each bucket (count down)
        n-=x)                   // Subtract number assigned to bucket from total
        printf(                 // Output a formatted string using padding
            "|%0*s\n",          // (turns out %0s will actually zero-pad a string!)
            x=m?rand()%(n+1):n, // Calculate a number of items for this bucket
            "");
}

Bergantung pada penanganan GCC terhadap perilaku tidak terdefinisi %0s- biasanya %0akan 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 lebih 0s.

Dave
sumber
2
Karena fungsi diperbolehkan, Anda dapat memotong beberapa karakter dengan menggunakan a(b,c){...}alih-alih maindan scanf.
Kevin
3

Python 2, 102 99 97 90 byte

m-1kali, pilih jumlah acak xantara 0dan n, inklusif dan kurangi dari n. Kemudian cetak a 1dan '0'*x.

Akhirnya, cetak 1dan sisanya 0. Sama sekali tidak peluang yang sama, tetapi semua konfigurasi dimungkinkan.

from random import*
n,m=input()
exec'x=randrange(n+1);n-=x;print 10**x;'*(m-1)
print 10**n

(Kode yang digunakan kembali dari jawaban Python yang rusak.)

L3viathan
sumber
Saya pikir jawaban ini seharusnya merupakan saran pada jawaban saya karena secara harfiah jawaban yang sama dengan perbaikan bug kecil.
orlp
1
@ orlp Jika Anda melihat riwayat jawaban ini, itu hanya menjadi yang ada di versi terbaru. Jika saya akan membuatnya seperti ini pada awalnya, saya akan mempostingnya sebagai komentar.
L3viathan
Ah, tidak apa-apa, tampilannya (dan Anda menulis 'kode yang digunakan kembali') membuatnya terlihat berbeda dari sebelumnya. Maaf.
orlp
@ orlp Tidak masalah. Anda bekerja sekarang dan lebih pendek dari milik saya, saya juga dapat menghapus jawaban ini jika Anda merasa itu terlalu dekat dengan Anda, saya tidak keberatan, hanya ingin menjelaskan bahwa saya tidak hanya menyalin-tempel jawaban Anda.
L3viathan
3

Haskell, 114 94 byte

import System.Random
n#m=map(10^).take m.until((==n).sum.take m)tail.randomRs(0,m)<$>newStdGen

Sedikit 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! )

Nama Tampilan Umum
sumber
2

REXX, 74 byte

arg n m
m=m-1
o.=@
do n
  a=random(m)
  o.a=o.a||#
  end
do a=0 to m
  say o.a
  end

Output (8 5):

@#
@###
@
@#
@###

Output (8 5):

@#
@#
@
@####
@##
idrougge
sumber
2

C, 175 138 byte

Terima kasih kepada @Dave untuk menghemat 37 byte!

i;f(n,m){char**l=calloc(m,8);for(i=0;i<m;)l[i]=calloc(n+1,1),*l[i++]=124;for(i=n+1;--i;)*strchr(l[rand()%m],0)=35;for(;i<m;)puts(l[i++]);}

Cobalah online!

Steadybox
sumber
1
Hai, beberapa hal yang dapat membantu Anda mengurangi ini: callocakan memberi Anda 0-diinisialisasi memori (tidak perlu mengatur semua 0s sendiri), strchrdapat menemukan akhir string, koma dapat operasi rantai, menghindari kebutuhan {}, dan x[0] == *x. Juga hati-hati; Anda tidak mallocmemiliki cukup memori jika semua item ada di kotak yang sama.
Dave
2

AHK, 66 byte

2-=1
Loop,%2%{
Random,r,0,%1%
Send,|{# %r%}`n
1-=r
}
Send,|{# %1%}

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:

|##     |#####    |##       |##     |#      |##   
|##     |#        |#####    |       |###    |#    
|#      |##       |         |###    |###    |     
|###    |         |         |       |#      |     
|       |         |#        |###    |       |#####
Toast insinyur
sumber
2

CJam, 30 31 21 byte

:B1a*:C\{CBmrAt.*}*N*

Input adalah dua angka n mpada stack. Penggunaan 1untuk karakter kolom dan 0untuk karakter yang diulang.

Penjelasan:

:B          e# Store m in B (without deleting it from the stack)
1a          e# Push 1 and wrap it in an array: [1]
*           e# Repeat the array m times
:C          e# Store this array in C (without deleting)
\{          e# Do n times:
  CBmrAt    e#   Create an array of 1s with a random element replaced with 10.
  .*        e#   Vectorized multiplication: multiply the respective elements in the arrays.
            e#   Effectively, we multiply a random value in the array by 10 (and add a 0 to the end).
}*          e# End loop.
N*          e# Join with newlines.
Buah Esolanging
sumber
1

Röda , 79 byte

f n,m{a=[0]*m
i=0{{n--
a[i%m]++}if randomBoolean
i++}while[n>0]
a|[`|`.."#"*_]}

Cobalah online!

Ini menciptakan array angka nol dan menambahkannya di tempat acak.

fergusq
sumber
1

PHP, 100 byte

list($z,$m,$n)=$argv;$a=array_fill(0,$n,z);while($m>0){$a[rand(0,$n-1)].=a;$m--;}echo join("\n",$a);

Kerusakan :

list($z,$m,$n)=$argv;     // assigns the input vars to $m and $n
$a=array_fill(0,$n,z);    // creates an array $a of $n elements containing 'z'
while($m>0){              // randomly populate array $a
    $a[rand(0,$n-1)].=a;  //
    $m--;                 //
}                         //
echo join("\n",$a);       // output $a contents separated by a new line

Output untuk m=7dan n=5:

Eksekusi pertama:

za
zaa
za
za
zaa

Eksekusi kedua:

za
zaa
zaaa
z
za

Cobalah online!

roberto06
sumber
Anda dapat menggunakan [,$m,$n]=$argv;dari PHP 7.1 untuk menyimpan beberapa karakter. Anda dapat mengganti \ndengan jeda baris yang sebenarnya untuk menghemat 1 byte. Anda dapat menggunakan for(;$m-->0;)$a[rand(0,$n-1)].=a;untuk menyimpan istirahat, a $mdan titik koma. [,$m,$n]=$argv;$a=array_fill(0,$n,z);for(;$m-->0;)$a[rand()%$n].=a;echo join("\n",$a);85 byte
Christoph
Golf ini turun lebih jauh lagi [,$m,$n]=$argv;for(;$m--;)${rand()%$n}.=a;for(;$n--;)echo"z${$n}\n";67 byte.
Christoph
@Christoph Saya melihat notasi [,$m,$n]=$argv;pada kode-golf lain tetapi tidak dapat membuatnya bekerja baik di lingkungan dev saya atau di eval.in
roberto06
coba di sini: sandbox.onlinephpfunctions.com/code/… .
Christoph
1
Bagus. Saya pikir Anda dapat memposting cuplikan sebagai jawaban karena cukup banyak berbeda dari milik saya;)
roberto06
1

JavaScript, 105 byte

x=>y=>{s=[];for(;x>1;y-=t)s[--x]="|"+"#".repeat(t=Math.random()*(y+1)|0);s[0]="|"+"#".repeat(y);return s}

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.

fəˈnɛtɪk
sumber
1

Ruby, 52 byte

->(n,m){r=Array.new(m){?|};n.times{r[rand m]+=?#};r}

Membuat fungsi anonim yang mengambil dua bilangan bulat sebagai argumen dan mengembalikan array dari Strings:

>> puts ->(n,m){r=Array.new(m){?|};n.times{r[rand m]+=?#};r}.call 7,5
|#
|#
|##
|##
|#
Pasang kembali Monica iamnotmaynard
sumber
1

Python 2, 81 byte

from random import*
def f(n,m):l=['#']*m;exec('l[randrange(m)]+="o";'*n);return l

Mengembalikan daftar string.

TFeld
sumber
1

Javascript (ES7), 75 byte

(N,M)=>{for(r='';M;M--,N-=x=~~(Math.random()*(N+1)),r+=10**x+`
`);return r}

Saya pikir saya pandai karena memiliki kekuatan 10 gagasan hanya untuk menyadari bahwa sebagian besar jawaban sudah menggunakan itu.

ValarDohaeris
sumber
1

AWK, 78 byte

{srand();for(;n++;)c[k]=c[k=int($2*rand())]"#"}END{for(;j<$2;)print"|"c[j++]}

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:

awk '{srand();for(;n++;)c[k]=c[k=int($2*rand())]"#"}END{for(;j<$2;)print"|"c[j++]}' <<< "12 5"

Example output:
|##
|###
|##
|##
|###
Robert Benson
sumber
1

MATLAB, 103 94 byte

function a(m,n)
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)

Dengan Pemformatan

function a(m,n)
for i=1:m-1 
    d=@(p)disp(char([1,~(1:p)]+48));  % inline function for displaying
    p=randi([0,n]);              % picking a random number b/w 0 and n
    d(p);                        % '1' represents the box/pigeonhole, with '0's denoting entries
    n=n-p;
end
d(n);                            % writing the remaining entries/zeros

Output Sampel

>> a(4,7)
10
10000
10
10

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.

Krostd
sumber
Anda dapat menyimpan beberapa byte yang mendefinisikan pernyataan tampilan sebagai fungsi anonim, untuk menghindari penulisan dua kali: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)
Luis Mendo
@LuisMendo Terima kasih atas sarannya, saya akan memperbarui. Dapatkah saya juga mendefinisikan fungsi aktual saya dengan cara yang sama, mis. a = @ (m, n) ... karena itu juga akan mengurangi jumlah byte. Bagaimana orang umumnya menghapus / mempersingkat "nama fungsi (argumen)" di jawaban kode-golf MATLAB?
Krostd
Ya, Anda juga bisa menggunakan fungsi anoymous sebagai jawabannya. Anda bahkan dapat melewatkan 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 dalam eval('...'). BTW, itu biasanya dianggap praktik buruk dan buruk di Matlab, tapi di sini kami suka menyalahgunakan bahasa :-)
Luis Mendo
Hmm .. Saya akan memperbarui berdasarkan saran Anda dan berpikir lebih banyak tentang itu dan melihat apakah saya dapat menghindari loop, meskipun itu tampaknya tidak mungkin. Saya bisa memikirkan logika yang bisa melakukan itu, tetapi tidak yakin bagaimana cara mengimplementasikannya .. Saya berpikir untuk mendefinisikan angka 10 ^ n, dan menemukan nomor m yang semuanya adalah kekuatan 10, dan kemudian hanya mencetaknya. Ini akan menjadi output yang sama persis seperti yang saya miliki sekarang ..: D Ada saran? Jangan ragu untuk mempostingnya sebagai jawaban lain.
Krostd
Maksud saya faktor m (bukan sembarang angka)
Krostd
1

Oktaf , 62 54 byte

@(n,m)strcat(62,(sum(randi(m,1,n)==(1:m)',2)>=1:n)*42)

Fungsi anonim yang mengambil dua angka dan mengeluarkan array karakter 2D >untuk kotak dan *objek. Semua hasil kemungkinan sama.

Cobalah online!

Luis Mendo
sumber
1

TI-Basic, 63 62 byte

Prompt N,M
For(A,1,M
N→B
If M-A
randInt(0,N→B
":→Str0
For(C,1,B
Ans+"X→Str0
End
Disp Ans
N-B→N
End

Setiap penugasan harus memiliki probabilitas yang tidak nol untuk dipilih.

Kriteria ini membuat program ini lebih mudah untuk ditulis.

Contoh I / O:

prgmPIDGEON
N=?5
M=?2
:XXXX
:X

Penjelasan:

Prompt N,M     # 5 bytes, input number of items, number of boxes
For(A,1,M      # 7 bytes, for each box
N→B            # 4 bytes, on last box, make sure the sum is met by adding N items
If M-A         # 5 bytes, if not last box
randInt(0,N→B  # 8 bytes, add random number of items from 0 to N to box A
":→Str0        # 6 bytes, first character
For(C,1,B      # 7 bytes, add B items to the box
Ans+"X→Str0    # 8 bytes
End            # 2 bytes
Disp Ans       # 3 bytes, print this box
N-B→N          # 6 bytes, subtract the items used in this box
End            # 1 byte, move on to next box
pizzapants184
sumber
1

MATLAB, 73 64 58 byte

Perbarui # 3

Saya memang membutuhkan penyortiran, karena jika tidak, saya mendapatkan bilangan bulat negatif. Saya memang mengganti disp(sprintf(...))dengan fprintf(...)sekarang, jadi jawabannya tetap 58 byte.

@(m,n)fprintf('%i\n',10.^diff([0;sort(randi(n,m-1,1));n]))

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".

@(m,n)disp(sprintf('%i\n',10.^diff([0;randi(n,m-1,1);n])))

Akhirnya mendekati jawaban Oktaf dari Luis! : D

Perbarui # 1:

@(m,n)disp(sprintf('%i\n',10.^diff([0;sort(randi(n,m-1,1));n])))

Alih-alih mengkonversi ke string, saya hanya menampilkan angka secara langsung. Saya bisa mengurangi menjadi 58 byte, dengan menghapus disp(...), tapi kemudian saya mendapatkan tambahan ans =hanya dengan sprintf, dan tidak tahu apakah itu dapat diterima.

Kode awal:

@(m,n)disp(strjust(num2str(10.^diff([0;sort(randi(n,m-1,1));n])),'left'))

Berkat beberapa saran oleh Luis , saya menyingkirkan loop dalam jawaban saya sebelumnya . Sekarang saya pertama-tama membuat array vertikal mangka acak yang menambahkan hingga n( 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:

>> a=@(m,n)disp(strjust(num2str(10.^diff([0;sort(randi(n,m-1,1));n])),'left'));
>> a(4,6)
1000
10  
100 
1   

Catatan : Saya telah mengubah fungsi saya menjadi fungsi anonim di sini, berdasarkan saran. Dalam output sampel, saya telah menetapkan ituauntuk menunjukkan. Saya harap ini tidak melanggar spesifikasi, tetapi jika itu tolong beri tahu saya dan saya akan mengubahnya.

Krostd
sumber
Saya baru menyadari jawaban teratas menggunakan logika yang sama dengan 10 ^ .. Untuk apa nilainya, dan jika itu penting, saya tidak menggunakannya sebagai referensi untuk jawaban saya .. (tapi sial, seseorang mengalahkan saya untuk itu!: P)
Krostd
Juga ingin mencatat penghargaan atas jawaban ini untuk gagasan membuat mbilangan bulat acak yang menambahkan n, 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)
Krostd
1

Ditumpuk , 29 byte

('|')\rep\[:randin'#'push@.]*

Cobalah online!

Berperilaku dengan membangun array Mberisi lajang '|', kemudian menambahkan '#'ke waktu larik yang dipilih secara acak N.

Conor O'Brien
sumber
Bagus! Dan jadi semua hasil kemungkinan sama, kan?
Luis Mendo
@LuisMendo seharusnya, karena randinmenggunakan algoritma Fisher-Yates secara internal. (Ini adalah algoritma yang sama dengan jawaban CJam menggunakan FWIW)
Conor O'Brien
1

Python 2 , 80 95 89 88 byte

from random import*
n,m=input()
while m:x=randint(0,n);print'1'+'0'*[n,x][m>1];m-=1;n-=x

Cobalah online!

  • Ditambahkan 15 Bytes: Sunting sebelumnya agak cacat, beberapa piegon ditinggalkan.
  • Disimpan 6 Bytes: diganti jika dengan [n, x] [m> 1]
  • Disimpan 1 Byte: impor *
officialaimm
sumber
1

Arang , 19 byte

≔EN⟦⟧θFN⊞‽θ#Eθ⁺|⪫ιω

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  N                 Input `M`
 E                  Map over implicit range
   ⟦⟧               Empty array
≔    θ              Assign resulting nested array to `q`

       N            Input `N`
      F             Loop over implicit range
          θ         Nested array `q`
         ‽          Random element
           #        Literal string
        ⊞           Append to array

             θ      Nested array `q`
            E       Map over array
                 ι  Current element
                  ω Empty string
                ⪫   Join
               |    Literal string
              ⁺     Concatenate
                    Implicitly print on separate lines
Neil
sumber