Güvercin Deliği İlkesi ve Kod Golf


26

Güvercin yuvası prensibi devletler bu

Eğer N öğeler konur M ile, kutular N > M , daha sonra en az bir kutu birden fazla öğe içermelidir.

Çoğu için, bu prensip diğer matematiksel işlemlerle karşılaştırıldığında özel bir statüye sahiptir. EW Dijkstra'nın yazdığı gibi ,

Bazı mistiklerle çevrilidir. Bunu kullanan kanıtlar genellikle özel, özellikle ustaca olan bir şey olarak kabul edilir.

Meydan okuma

Bu zorluğun amacı, ASCII sanat gösterimlerini kullanan güvercin deliği ilkesini göstermektir. özellikle:

  1. Olumsuz ve pozitif olarak girdi N(öğe sayısı) ve M(kutu sayısı ) olarak alın . küçük olabilir (ilke bu durumda olmasa bile).NMNM
  2. Kutulara olası eşya atamalarından birini rastgele seçin. Her bir ödevin, seçilme sıfırı olmayan bir olasılığı olmalıdır.
  3. Atama ASCII sanat gösterimi aşağıdaki gibi üretin:

    • Her Mbiri bir kutuya karşılık gelen çizgiler var .
    • Her satır gibi beyaz olmayan bir karakterle başlar |.
    • Bu karakterin ardından, başka bir boşluk olmayan karakter, örneğin #, o kutudaki öğeler kadar çok tekrarlanır.

Örneğin düşünün N = 8, M = 5. Kutulara öğelerin seçili atama ise 4, 1, 0, 3, 0, temsilidir

|####
|#
|
|###
|

Aynı programın farklı bir çalışması (farklı bir atama ile sonuçlanan)

|#
|##
|#
|#
|###

Temsil ile ilgili bazı esneklikler var; aşağıya bakınız.

Belirli kurallar

Kod teorik olarak Nve değerleri için çalıştırılmalıdırM . Uygulamada hafıza boyutu veya veri tipi sınırlamaları ile sınırlandırılabilir.

Çıktıyı gözlemlemek, tüm ödevlerin sıfır olasılıksız olup olmadığını belirlemek için yeterli olmadığından , her başvuru açık değilse, kodun bunu nasıl başardığını açıklamalıdır.

Aşağıdaki gösterim varyasyonlarına izin verilir:

  • Herhangi bir farklı, boşluk olmayan karakter çifti seçilebilir. Program yürütmeleri arasında tutarlı olmalıdırlar.
  • Temsilin 90 derecelik dönüşleri kabul edilebilir. Yine, seçim tutarlı olmalıdır.
  • İzler veya baştaki boşluklara izin verilir.

Farklı bir versiyonudur biçimi ile, bir örnek olarak N = 15, M = 6program iki uygulama sonuçları olabilir

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

veya

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

Benzer şekilde, N = 5, M = 7temsili bir başka varyasyonu kullanılarak, verebilir,

  *
* * * *
UUUUUUU

veya

 *** **
UUUUUUU

veya

   *
*  *
*  * 
UUUUUUU

İlkenin bu durumda nasıl uygulanamayacağına dikkat edin, çünkü N< M.

Genel kurallar

Herhangi bir programlama dilinde programlara veya fonksiyonlara izin verilir . Standart boşluklar yasaktır.

Giriş herhangi bir makul yoldan alınabilir ; ve iki sayı dizisi veya iki farklı dizge gibi herhangi bir biçimde.

Çıkış araçları ve formatları da esnektir. Örneğin çıktı, dizelerin bir listesi veya yeni satırlı bir dize olabilir; işlev çıktı argümanı olarak döndürüldü veya STDOUT'da görüntülendi. İkinci durumda, sınırlı ekran genişliğinden kaynaklanan hat sarma hakkında endişelenmenize gerek yoktur.

Bayt cinsinden en kısa kod kazanır.


11
Aslında unvanı almak için şimdiye kadar beni aldı ...
Martin Ender

@MartinEnder "Güvercin deliği prensibi" nin "kod golf" den daha fazla karakteri var mı, yoksa başka bir şaka mı var?
dorukayhan Monica'yı

5
@dorukayhan Standart bir tarayıcıda, soru başlığının biraz yukarısındaki metne bakın ...
Luis Mendo

Yanıtlar:


2

Jöle , 9 8 bayt

=þṗX¥S⁵*

Bu, M'yi sol, N'yi de sağ argümanına alan çift yönlü bir bağlantıdır . Çıktı, 0'ın güvercinleri ve 1'in delikleri temsil ettiği bir tam sayı dizisidir .

Çevrimiçi deneyin!

Nasıl çalışır

=þṗ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.

10

Mathematica, 68 bayt

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

İki tamsayı argümanını alan, adlandırılmamış bir işlev (kutu sayısı, ardından öğe sayısı).

İlk önce tüm olası bölümleri N+Mtam olarak Mpozitif parçalara göre hesaplar ve 1sonra her bölümden çıkarır . Bu bize olası tüm bölümleri verir Niçine Mnegatif olmayan parçaları (ki IntegerPartitionsaksi üretmek olmaz). Sonra rastgele bir bölüm seçin ve karıştırın. Bu, sıfır ile izin verilen tüm olası sipariş bölümlerini garanti eder. Son olarak, karşılık gelen güç 10 yükselterek bir çıkış hattına bölmenin her bin dönüştürme (her hat bir hâle gelir 1000...ile ksıfır). Örnek bir çıktı şöyle görünebilir:

100
10000
1
10
10

İnanıyorum PadRightiçin ped olmaz Msıfır eğer N< M.
LegionMammal978

1
@ LegionMammal978 Teşekkürler, aynı byte sayısında düzeltmeyi başardı.
Martin Ender

... dürüstçe etkilendim. Benzer bir çözüm yapmak üzereydim, fakat PadRightanlaşılabilirliği çok daha uzun sürecek.
LegionMammal978

@ LegionMammal978 Kaçınılması gereken başka bir yol PadRightolabilir IntegerPartitions[#,{#2},0~Range~#].
Martin Ender

1
Buitltin yok mu? Şaşırdım ...: D Ama güzel cevap. İlk önce nasıl çalıştığını
bulmam gerek

9

Python 2, 77 86 bayt

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

[0, n] içinde bir sayı oluşturur, birçok öğe yazdırır ve onu n'den çıkarır. Bunu m kere yapar.

Bu hiçbir şeyi son kutuya getirme ihtimalini düşürüyor, ancak soru sadece her çıktının mümkün olmasını istedi , eşit olasılıkla değil .


7

Toplu iş, 164 bayt

@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%%

Bence art arda 7 %işaret yeni bir kişisel en iyi olabilir! Not: Bu, aynı kutuya 9'dan fazla öğe ataması durumunda tek çıktı üretir; eğer bu bir problemse, 180 byte için:

@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%%

Evet, %ikinci satırda toplam 28 s.


5

C, 102 bayt

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,"");}

Stdin'e girdi, örneğin:

echo "5 4" | ./pigeonhole

Her çıktıyı eşit olasılıkla üretmeyecek, ancak tüm olası kombinasyonları üretebilecek kapasitededir.

Yıkmak:

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
            "");
}

GCC'nin tanımsız davranışını ele almasına güvenir %0s- normalde %0bir tamsayı ya da şamandıranın sıfırlanmasına neden olur, ancak yalnızca susturur (hiçbir zaman kesilmez), bu nedenle boş yazdırmak mümkün olmaz. Fakat karakter dizileri için davranış tanımlanmamıştır ve GCC onu aynı şekilde sıfır tuşlaması yapmaya karar vermiştir, bu yüzden sıfır tuş takımları sıfır veya daha fazla karakter yazabilmek için boş bir satır dizisi oluşturur 0.


2
İşlevlere izin verildiğinden, ve a(b,c){...}yerine birkaç karakteri kesebilirsiniz . mainscanf
Kevin,

3

Python 2, 102 99 97 90 bayt

m-1kez, ve xarasında rasgele bir miktar seçti , kapsayıcı ve n'den çıkarın. Sonra bir ve yazdırın .0n1'0'*x

Sonunda, yazdır 1ve kalan 0s. Tüm eşit şanslarda değil, ancak tüm yapılandırmalar mümkündür.

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

(Bozuk Python cevabından tekrar kullanılan kod.)


Bu cevabın cevabım üzerine bir öneri olması gerektiğini düşünüyorum, çünkü küçük bir hata düzeltmesiyle tam olarak aynı cevap.
orlp

1
@ orlp Eğer bu cevabın geçmişine bakarsanız, sadece son versiyonunda oldu. Başlangıçta böyle yapsaydım, bunun yerine yorum olarak gönderirdim.
L3viathan

Ah sonra sorun değil, göründüğü gibi (ve 'yeniden kullanılmış kod' yazdın), olduğundan daha farklı görünmesini sağladı. Üzgünüm.
orlp

@orlp Sorun yok. Seninki şimdi çalışıyor ve benimkinden daha kısa, seninkine çok yakın olduğunu hissediyorsan bu cevabı silebilirim, umrumda değil, sadece cevabını kopyala yapıştırmadığımı açıklığa kavuşturmak istedim.
L3viathan

3

Haskell, 114 94 bayt

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

Bir kaba kuvvet yaklaşımının bir kısmı: Sonsuz bir rasgele sayı listesi oluşturur, listenin başlangıcından n sayı alır, bunları toplar ve m'ye eşit olup olmadıklarını kontrol eder. Değilse, ilk elemanı listeden çıkarın ve tekrarlayın.

Çevrimiçi deneyin!

Not: İçe aktarma olmadan 73 bayt

EDIT: 10 ^ numara ile bazı baytlar kaydedildi ( Yeni sürümü çevrimiçi olarak deneyin! )


2

REXX, 74 bayt

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

Çıktı (8 5):

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

Çıktı (8 5):

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

2

C, 175 138 bayt

37 byte tasarruf için @Dave teşekkürler!

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++]);}

Çevrimiçi deneyin!


1
Merhaba, bunu azaltmanıza yardımcı olabilecek birkaç şey: callocsize 0-başlatılmış bellek verir (tüm 0'ları kendiniz ayarlamanıza gerek yoktur), strchrbir dizgenin sonunu bulabilir, virgül işlemleri zincirleyebilir, ihtiyaçtan kaçınarak {}ve x[0] == *x. Ayrıca dikkat edin; Eğer değiliz malloctüm öğeleri aynı kutuya ise yeterli bellek ing.
Dave,

2

AHK, 66 bayt

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

Orlp'in 0'dan N'ye rasgele sayılar kullanarak ve ardından N'den çıkardığı aynı prensibi takip ettim . Ne ​​yazık ki, Gönder işlevinin çalışma biçimi nedeniyle 10 ^ r kullanarak baytları kaydedemedim. Maalesef ve kalın. N = 8, m = 5 için bazı çıktılar:

|##     |#####    |##       |##     |#      |##   
|##     |#        |#####    |       |###    |#    
|#      |##       |         |###    |###    |     
|###    |         |         |       |#      |     
|       |         |#        |###    |       |#####

2

CJam, 30 31 21 bayt

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

Giriş, n myığındaki iki sayıdır . Kullanımları 1sütun karakter için ve 0tekrarlanan karakter için.

Açıklama:

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

1

Röda , 79 bayt

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

Çevrimiçi deneyin!

Bu, bir sıfır dizisi oluşturur ve bunları rastgele yerlerde artırır.


1

PHP, 100 bayt

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);

Yıkmak :

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

Çıktılar m=7ve n=5:

İlk çalıştırma:

za
zaa
za
za
zaa

İkinci infaz:

za
zaa
zaaa
z
za

Çevrimiçi deneyin!


[,$m,$n]=$argv;Birkaç karakterden tasarruf etmek için PHP 7.1'den kullanabilirsiniz . \n1 bayttan tasarruf etmek için gerçek bir satır sonu ile değiştirebilirsiniz . Sonları ve bir noktalı virgül for(;$m-->0;)$a[rand(0,$n-1)].=a;kaydetmek için kullanabilirsiniz $m. [,$m,$n]=$argv;$a=array_fill(0,$n,z);for(;$m-->0;)$a[rand()%$n].=a;echo join("\n",$a);85 byte
Christoph

Bu da [,$m,$n]=$argv;for(;$m--;)${rand()%$n}.=a;for(;$n--;)echo"z${$n}\n";67 bayt daha golf aşağı .
Christoph,

@Christoph [,$m,$n]=$argv;Diğer kod golflerinde gösterimi gördüm, ancak benim dev ortamımda veya eval.in'de çalışmasını sağlayamadım
roberto06


1
Güzel. Sanırım pasajınızı bir cevap olarak gönderebilirsiniz, çünkü benimkinden oldukça farklıdır;)
roberto06

1

JavaScript, 105 bayt

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

Çevrimiçi deneyin!

Satırları atama yöntemi nedeniyle bu, tabana biraz ulaşması için küçük bir şans olmasına rağmen, tabana doğru daha fazla yerleşme eğiliminde olacaktır.


1

Ruby, 52 bayt

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

İki tamsayı argüman olarak alan ve bir Dizge dizisi döndüren adsız bir işlev oluşturur:

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

1

Python 2, 81 bayt

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

Dizelerin bir listesini döndürür.


1

Javascript (ES7), 75 bayt

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

Sadece çoğu cevabın zaten bunu kullandığını anlamak için 10 fikrinin gücüyle geldiğim için zekiyim sanıyordum.


1

AWK, 78 bayt

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

2 argüman alır, önce eşya sayısı, sonra kutu sayısı. Rasgele sayı üretecinin tohumlanmasıyla başlar, böylece her işlem farklıdır. Sonra basitçe bir dizede dizeleri kurar, Örnek kullanım:

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

Example output:
|##
|###
|##
|##
|###

1

MATLAB, 103 94 bayt

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)

Biçimlendirme ile

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

Örnek çıktı

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

Her dizi girişi aralarında bir sekme ile görüntülendiğinden izleyen boşluklar vardır, ancak bu özellik başına göre kabul edilebilir olmalıdır.

Bu bana çok basit bir uygulama gibi görünüyor, bu yüzden bunun daha iyi olabileceğine eminim.

Önerileriniz için @Luis Mendo'ya teşekkürler.


İki kez yazmaktan kaçınmak için, ekran ifadesini anonim bir işlev olarak tanımlayan epeyce bayt kaydedebilirsiniz: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 Öneriniz için teşekkürler, güncelleyeceğim. Asıl işlevimi de aynı şekilde tanımlayabilir miyim, örneğin. a = @ (m, n) ... çünkü bu da bayt sayısını azaltacaktır. İnsanlar, MATLAB code-golf cevaplarında "işlev adı (args)" özelliğini nasıl kaldırır / kısarlar?
Krostd

Evet, cevap olarak çok büyük bir işlev de kullanabilirsiniz. Hatta atlayabilirsiniz a=. Bu durumda, bunu yapamazsınız, prensip olarak, adsız işlevler döngü içeremez. Ama herşeyi içine sokma hilesini kullanabilirsiniz eval('...'). BTW, bu normalde Matlab'da çirkin ve kötü bir uygulama olarak kabul edilir, ancak burada dilleri kötüye kullanmaktan hoşlanıyoruz :-)
Luis Mendo

Hmm .. Önerinize dayanarak güncelleme yapacağım ve bu konuda biraz daha düşüneceğim ve bu olası görünmese de, döngüden kaçınabileceğimden emin olacağım. Bunu yapabilen bir mantık düşünebiliyorum, ama nasıl uygulanacağından emin değilim .. 10 ^ n sayısını tanımlamayı ve 10'un gücüne sahip m sayıları bulmayı ve sonra onları yazdırmayı düşünüyorum. Şu an sahip olduğum ile tamamen aynı olacak ..: D Herhangi bir öneriniz var mı? Başka bir cevap olarak göndermek için çekinmeyin.
Krostd

Ben m faktörleri demek istedim (sadece herhangi bir sayı değil)
Krostd

1

Octave , 62 54 bayt

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

İki sayı alan ve 2B karakter dizisini çıktıran ve >kutular için ve *nesneler için atanan isimsiz işlev . Tüm sonuçlar eşit derecede muhtemeldir.

Çevrimiçi deneyin!


1

TI-Basic, 63 62 bayt

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

Her bir ödevin, seçilme sıfırı olmayan bir olasılığı olmalıdır.

Bu kriterler bu programın yazılmasını çok kolaylaştırdı.

Örnek G / Ç:

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

Açıklama:

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

1

MATLAB, 73 64 58 bayt

Güncelleme 3.

Sıralamaya ihtiyacım var, öyle görünüyor, çünkü aksi halde negatif tamsayılar alıyorum. Değiştirdimdisp(sprintf(...)) ile fprintf(...)cevap 58 bayt kalabilmeleri için de, şimdi.

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

Güncelleme # 2:

Diziyi sıralamaya gerek duymadığımı fark ettim ve aslında sıralama aslında dizideki sayıların ortalamasını düşürür. Böylece sort(...)kısmı sildim . Çıktının aynı kaldığına dikkat edin, bu yüzden "örnek çıktı" yı güncellemiyorum.

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

Sonunda Luis tarafından Octave cevabını kapatıyor! : D

Güncelleştirme # 1:

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

Dize dönüştürmek yerine sadece sayıları doğrudan görüntüler. Kaldırarak 58 bayta kadar indirebilirim.disp(...) ama sonradan fazladanans = indirebilirim sadece sprintf ile kabul edilebilir olup olmadığını bilmiyorum.

İlk kod:

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

Luis'in bazı önerileri sayesinde önceki cevabımdaki döngüden kurtuldum . Şimdi ilk önce ( mkadar) ekleyerek rastgele sayılar dikey bir dizi oluşturunndiff([0;sort(randi(n,m-1,1));n]) ) 'a , daha sonra bunları 10 üssü olarak kullanıyorum, dizgeye dönüştürüyorum, sola yaslamak ve görüntülemek.

Teknik olarak 6 bayttan tasarruf etmek için dağıtımdan (...) kurtulabilirim, ancak sonra özellikleri ihlal edebilecek bir "ans" basılır. Onları dize olarak değiştirmenin ve istenen bitiş biçimini almak için sola yaslanmanın bir yolu da olabilir, bu yüzden önerilere açığım.

Örnek çıktı:

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

Not : İşlevimi burada önerilere göre adsız bir işlev olarak değiştirdim. Örnek çıktıda bunu göstermek için tayin ettima. Umarım bu özellikleri ihlal etmez, ancak eğer öyleyse lütfen bana bildirin, ben de değiştireyim.


Ben sadece en iyi cevabın 10 aynı mantığı kullandığını fark ettim .. .. Buna değer, ve eğer önemliyse, cevabım için referans olarak kullanmadım. P)
Krostd

Ayrıca etmek notu kredi istedi bu cevabı oluşturma fikrine mkadar ekleyin rasgele tamsayılar nben uzun süre bu bölümü takılıp beri, .. (Hala dahil böylece, benim cevapları 2 bağlantıları daha fazla ekleyemezsiniz bir yorumda)
Krostd

1

Yığılmış , 29 bayt

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

Çevrimiçi deneyin!

Mİçeren '|', sonra da ekleyerek bir tekiller dizisi oluşturarak davranır.'#' rastgele seçilen bir dizi Nzamanına .


Güzel! Ve tüm sonuçların eşit olması muhtemeldir, değil mi?
Luis Mendo

@LuisMendo öyle olmalı, çünkü randinFisher-Yates algoritmasını dahili olarak kullanıyor. (Bu CJam cevap FWIW kullandığı aynı algoritmasıdır)
Conor O'Brien

1

Python 2 , 80 95 89 88 bayt

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

Çevrimiçi deneyin!

  • Eklendi 15 Bayt: Önceki düzenleme biraz kusurluydu, bazı pastacılar dışlandı.
  • Kaydedilen 6 Bayt: [n, x] [m> 1] ise başkası değiştirildi
  • Kaydedilen 1 Bayt: içe aktarma *

1

Kömür , 19 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

  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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.