비둘기 구멍 원리 및 코드 골프


26

비둘기 집 원리의 상태가

N > M을 사용 하여 N 개의 항목을 M 상자에 넣는 경우 하나 이상의 상자에 둘 이상의 항목이 포함되어야합니다.

많은 사람들에게이 원칙은 다른 수학 발표와 비교하여 특별한 지위를 가지고 있습니다. EW 데이 크 스트라는 썼다 ,

그것은 약간의 신비로 둘러싸여 있습니다. 그것을 사용하는 증거는 종종 특별한 무언가, 특히 독창적 인 것으로 간주됩니다.

도전

이 도전의 목적은 ASCII 예술 표현을 사용하여 비둘기 구멍 원리를 설명하는 것입니다. 구체적으로 :

  1. 음수 가 아닌 양수 로 입력 N(항목 수) 및 M(상자 수)로 사용하십시오 . (이 경우 원칙이 적용되지 않더라도) 보다 작을 수 있습니다 .NMNM
  2. 상자에 가능한 항목 할당 중 하나를 임의로 선택하십시오. 각 과제는 0이 아닌 확률을 가져야합니다.
  3. 다음과 같이 과제의 ASCII 아트 표현을 생성하십시오.

    • M각 상자에 해당하는 줄 이 있습니다 .
    • 각 줄은와 같이 공백이 아닌 문자로 시작합니다 |.
    • 이 문자 다음에는 공백이 아닌 다른 문자가 있습니다. 예를 들어 #해당 상자에 항목이있는 횟수만큼 반복됩니다.

예를 들어 고려 N = 8, M = 5. 상자에 항목의 선택의 할당은이 경우 4, 1, 0, 3, 0, 표현입니다

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

동일한 프로그램의 다른 실행 (다른 할당 결과)은

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

표현과 관련하여 약간의 유연성이 있습니다. 아래를 참조하십시오.

특정 규칙

코드는 이론적 으로 N및의 모든 값대해 실행 되어야합니다 M. 실제로 메모리 크기 나 데이터 형식 제한에 의해 제한 될 수 있습니다.

출력을 관찰하는 것만으로는 모든 할당 에 0아닌 확률 이 있는지를 판단하기에 충분하지 않으므로 각 제출은 코드가 명확하지 않은 경우이를 달성하는 방법을 설명해야합니다.

다음과 같은 표현 변형 이 허용됩니다.

  • 공백이 아닌 다른 문자 쌍을 선택할 수 있습니다. 프로그램 실행에서 일관성이 있어야합니다.
  • 표현의 90도 회전이 허용됩니다. 다시, 선택은 일관성이 있어야합니다.
  • 후행 또는 선행 공백이 허용됩니다.

다른 표현 형식에 대한 일 예로서 N = 15, M = 6프로그램의 실행의 두 가지 결과가있을 수

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

또는

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

마찬가지로 N = 5, M = 7표현의 또 다른 변화를 사용하여 줄 수있는,

  *
* * * *
UUUUUUU

또는

 *** **
UUUUUUU

또는

   *
*  *
*  * 
UUUUUUU

이 경우 원칙이 어떻게 적용되지 않는지 참고하십시오 . N< M.

일반적인 규칙

모든 프로그래밍 언어의 프로그램 또는 기능 이 허용 됩니다 . 표준 허점 은 금지되어 있습니다.

합리적인 수단으로 입력 할 수 있습니다 . 두 개의 숫자 배열 또는 두 개의 다른 문자열과 같은 형식으로.

출력 수단과 형식도 유연합니다. 예를 들어, 출력은 문자열 목록이거나 줄 바꿈이있는 문자열 일 수 있습니다. 함수 출력 인수로 리턴되거나 STDOUT에 표시됩니다. 후자의 경우 제한된 디스플레이 너비로 인한 줄 바꿈에 대해 걱정할 필요가 없습니다.

바이트 단위의 최단 코드가 이깁니다.


11
제목을 얻기 위해 실제로 지금까지 나를 데려 갔다 ...
마틴 엔더

@MartinEnder "pigeonhole 원리"가 "코드 골프"보다 더 많은 문자를 가지고 있습니까? 아니면 다른 농담이 있습니까?
dorukayhan 님이 Monica 님을

5
@dorukayhan 표준 브라우저에서 질문 제목의 약간 위에있는 텍스트를보십시오.
Luis Mendo

답변:


2

젤리 , 9 8 바이트

=þṗX¥S⁵*

이것은 M 을 왼쪽으로, N 을 오른쪽 인수로 취하는 2 차원 링크입니다 . 출력은 정수 배열이며, 0 은 비둘기를 나타내고 1 은 구멍을 나타냅니다.

온라인으로 사용해보십시오!

작동 원리

=þṗ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 바이트

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

두 개의 정수 인수 인 상자 수와 항목 수를 사용하는 명명되지 않은 함수입니다.

먼저 N+M정확한 M양의 부분 으로 가능한 모든 파티션을 계산 한 1후 각 파티션에서 뺍니다 . 이것은 우리에게 음이 아닌 부분 N으로 가능한 모든 파티션을 제공합니다 M( IntegerPartitions그렇지 않으면 생성되지 않음). 그런 다음 임의의 파티션을 선택하고 섞으십시오. 이를 통해 0으로 가능한 모든 정렬 된 파티션이 허용됩니다. 마지막으로, 대응하는 전원 (10)을 상승시켜 출력 선에 파티션의 각 빈 변환 (각 라인은가되도록 1000...하여 k제로). 예제 출력은 다음과 같습니다.

100
10000
1
10
10

나는 생각 PadRight에 패드 않을 것 M제로 경우 N< M.
LegionMammal978

1
@ LegionMammal978 감사합니다. 동일한 바이트 수로 수정했습니다.
Martin Ender

... 정말 감동합니다. 비슷한 솔루션을 시도했지만 PadRight목록이 없기 때문에 훨씬 더 길어질 것입니다.
LegionMammal978

@ LegionMammal978 피하는 또 다른 방법 PadRight은입니다 IntegerPartitions[#,{#2},0~Range~#].
Martin Ender

1
buitltin이 없습니까? 놀랐어요 ... : D하지만 좋은 대답입니다. 나는 그것이 어떻게 작동하는지 먼저 알아낼 필요가있다 : P
HyperNeutrino

9

파이썬 2, 77 86 바이트

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

[0, n]에서 숫자를 생성하고, 많은 항목을 인쇄하고 n에서 뺍니다. 이 m 번 수행합니다.

이것은 무엇이든 마지막 상자에 넣을 가능성이 거의 없지만, 문제는 모든 출력이 가능할 뿐 아니라 똑같이 가능하다고 요청한 입니다.


7

배치, 164 바이트

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

나는 7 개의 연속 %표시가 새로운 개인 최고 라고 생각합니다 ! 참고 : 동일한 상자에 9 개 이상의 항목을 할당하면 이상한 출력이 발생합니다. 그것이 문제라면 180 바이트에 대해 :

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

예, %두 번째 줄에서 총 28 초입니다.


5

C, 102 바이트

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에서 입력을받습니다. 예 :

echo "5 4" | ./pigeonhole

동일한 확률로 각 출력을 생성하지는 않지만 가능한 모든 조합을 생성 할 수 있습니다.

고장:

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에서 정의되지 않은 동작을 처리하는 데 의존합니다. %0s일반적으로 %0정수 나 부동 소수점을 0으로 채 웁니다. 그러나 채울 수만 있으므로 잘라낼 수 없으므로 공백을 인쇄 할 수 없습니다. 그러나 문자열의 동작은 정의되어 있지 않으며 GCC는 동일한 방식으로 제로 패드를 만들기로 결정했기 때문에이 제로 패드는 빈 문자열을 0 이상으로 쓸 수 있습니다 0.


2
기능이 허용되므로 and a(b,c){...}대신에 몇 개의 문자를 잘라낼 수 있습니다. mainscanf
Kevin

3

파이썬 2, 102 99 97 90 바이트

m-1시간은, 임의의 양의 선택 x사이를 0하고 n, 포괄적이고 n은에서를 뺍니다. 그런 다음을 인쇄 1하고 '0'*x.

마지막으로 인쇄 1및 나머지 부분 0. 똑같은 기회는 아니지만 모든 구성이 가능합니다.

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

(깨진 Python 답변의 코드를 재사용했습니다.)


나는이 답변이 작은 버그 수정과 문자 그대로 동일한 답변이므로 내 답변에 대한 제안이었을 것이라고 생각합니다.
orlp

1
@orlp이 답변의 기록을 보면 최신 버전의 기록이되었습니다. 처음에 이렇게 만들면 대신 주석으로 게시했을 것입니다.
L3viathan

아, 그러면 괜찮아 보입니다. (그리고 재사용 코드를 작성한) 방식이 다르게 보입니다. 죄송합니다.
orlp

@orlp 문제 없습니다. 당신은 어쨌든 지금보다 짧고 일하고 있습니다.이 답변이 당신과 너무 가깝다고 생각되면이 답변을 삭제할 수 있습니다.
L3viathan

3

하스켈, 114 94 바이트

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

약간의 무차별 대입 접근 방식 : 무한 난수 목록을 생성하고, 목록의 시작 부분에 n 개의 숫자를 취해 합산 한 다음 m과 같은지 확인합니다. 그렇지 않은 경우 목록에서 첫 번째 요소를 빼고 반복하십시오.

온라인으로 사용해보십시오!

참고 : 가져 오기없이 73 바이트

편집 : 10 ^ 트릭으로 일부 바이트를 저장했습니다 ( 온라인에서 새 버전을 사용해보십시오! )


2

REXX, 74 바이트

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

출력 (8 5) :

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

출력 (8 5) :

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

2

C, 175138 바이트

37 바이트를 절약 한 @Dave에 감사드립니다!

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

온라인으로 사용해보십시오!


1
안녕하세요,이를 줄일 수있는 몇 가지 : calloc0 초기화 된 메모리 당신에게 (모든 0 자신을 설정할 필요) 포기하지 않습니다 strchr에 대한 필요성을 피하고, 문자열, 쉼표 캔 체인 작업의 끝을 찾을 수 있습니다을 {}하고 x[0] == *x. 또한 조심하십시오; 당신이하지 않는 malloc모든 항목이 동일한 상자에있는 경우 충분한 메모리를 보내고.
Dave

2

AHK, 66 바이트

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

orlp 가 0에서 N까지의 난수를 사용한 다음 N에서 빼는 것과 동일한 원칙을 따랐 습니다. 불행히도 Send 함수의 작동 방식으로 인해 10 ^ r을 사용하여 바이트를 저장할 수 없었습니다. 아아와 부족. 다음은 n = 8, m = 5에 대한 출력입니다.

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

2

CJam, 30 31 21 바이트

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

입력은 n m스택에서 두 개의 숫자 입니다. 용도 1열 문자와 0반복되는 문자.

설명:

: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

PHP, 100 바이트

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

고장 :

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

에 대한 출력 m=7n=5:

첫 실행 :

za
zaa
za
za
zaa

두 번째 실행 :

za
zaa
zaaa
z
za

온라인으로 사용해보십시오!


[,$m,$n]=$argv;PHP 7.1에서 몇 문자를 저장하는 데 사용할 수 있습니다 . \n1 바이트를 절약하기 위해 실제 줄 바꿈으로 바꿀 수 있습니다 . for(;$m-->0;)$a[rand(0,$n-1)].=a;나누기, a $m및 세미콜론 을 저장하는 데 사용할 수 있습니다 . [,$m,$n]=$argv;$a=array_fill(0,$n,z);for(;$m-->0;)$a[rand()%$n].=a;echo join("\n",$a);85 바이트
Christoph

이로 인해 [,$m,$n]=$argv;for(;$m--;)${rand()%$n}.=a;for(;$n--;)echo"z${$n}\n";67 바이트 더 줄어 듭니다 .
Christoph

@Christoph 나는 [,$m,$n]=$argv;다른 code-golfs에 대한 표기법 을 보았지만 개발 환경이나 eval.in에서 작동시킬 수 없었습니다.
roberto06

여기에서보십시오 : sandbox.onlinephpfunctions.com/code/… .
Christoph

1
좋은. 내 스 니펫은 답변과 같이 답변으로 게시 할 수 있다고 생각합니다.;)
roberto06

1

자바 스크립트, 105 바이트

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

온라인으로 사용해보십시오!

행을 할당하는 방법으로 인해 상단에 약간의 확률이 있지만 하단에 더 많이 배치되는 경향이 있습니다.


1

루비, 52 바이트

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

두 개의 정수를 인수로 사용하고 문자열 배열을 반환하는 익명 함수를 만듭니다.

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

1

파이썬 2, 81 바이트

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

문자열 목록을 반환합니다.


1

자바 스크립트 (ES7), 75 바이트

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

나는 대부분의 답변이 이미 그것을 사용하고 있음을 깨닫기 위해 10 가지 아이디어의 힘을 생각해내는 것이 영리하다고 생각했습니다.


1

AWK, 78 바이트

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

두 개의 인수 (먼저 항목 수, 상자 수)를 사용합니다. 난수 생성기를 시드하여 시작하여 각 실행이 다릅니다. 그런 다음 단순히 배열에 문자열을 작성합니다 (예제 사용법 :).

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 바이트

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)

포맷으로

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

샘플 출력

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

각 배열 항목은 그 사이에 탭으로 표시되므로 후행 공백이 있지만 사양에 따라 허용 될 수 있습니다.

이것은 나에게 매우 단순한 구현처럼 보이므로 이것이 향상 될 수 있다고 확신합니다.

제안에 대한 @Luis Mendo에게 감사합니다.


두 번 쓰지 않기 위해 표시 문을 익명 함수로 정의하는 바이트를 상당히 절약 할 수 있습니다.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 제안 해 주셔서 감사합니다. 업데이트하겠습니다. 예를 들어 실제 기능을 같은 방식으로 정의 할 수 있습니까? a = @ (m, n) ... 바이트 수도 줄어 듭니다. 사람들은 일반적으로 MATLAB 코드 골프 응답에서 "함수 이름 (args)"을 어떻게 제거 / 축소합니까?
Krostd

예, 당신은 또한 답으로 성가신 기능을 사용할 수 있습니다. 을 건너 뛸 수도 있습니다 a=. 이 경우 익명 함수에는 루프를 포함 할 수 없으므로 원칙적으로 그렇게 할 수 없습니다. 그러나 모든 것을 넣는 트릭을 사용할 수 있습니다 eval('...'). BTW, 그것은 일반적으로 Matlab에서 추악하고 나쁜 습관으로 간주되지만, 여기서 우리는 언어를 남용하는 것을 좋아합니다 :-)
Luis Mendo

흠 .. 나는 당신의 제안에 따라 업데이트하고 그것에 대해 좀 더 생각하고 루프를 피할 수 있는지 알아 봅니다. 나는 그것을 할 수있는 논리를 생각할 수 있지만 그것을 구현하는 방법을 잘 모르겠습니다. 숫자 10 ^ n을 정의하고 모두 10의 거듭 제곱 인 m 숫자를 찾은 다음 인쇄합니다. 그것은 지금과 정확히 같은 출력이 될 것입니다 .. : D 어떤 제안? 다른 답변으로 자유롭게 게시하십시오.
Krostd

나는 m 요소를 의미했다 (단지 숫자가 아님)
Krostd


1

TI 기본, 63 62 바이트

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

각 과제는 0이 아닌 확률을 가져야합니다.

이 기준으로 인해이 프로그램을 훨씬 쉽게 작성할 수있었습니다.

예제 I / O :

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

설명:

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 바이트

업데이트 # 3

그렇지 않으면 음의 정수를 얻으므로 정렬이 필요합니다. 나는 대체 않았다 disp(sprintf(...))fprintf(...)대답은 58 바이트를 유지되도록하지만, 지금.

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

업데이트 # 2 :

배열을 정렬 할 필요가 없다는 것을 깨달았으며 실제로 정렬하면 실제로 배열의 평균 수를 줄입니다. 그래서 sort(...)부분을 삭제했습니다 . 출력은 동일하게 유지되므로 "샘플 출력"을 업데이트하지 않습니다.

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

마지막으로 Luis의 Octave 답변을 마칩니다! :디

업데이트 # 1 :

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

문자열로 변환하는 대신 숫자를 직접 표시합니다. 을 제거하여 58 바이트로 줄일 수는 disp(...)있지만 ans =sprintf만으로 여분 을 얻습니다 . 허용되는지 알 수 없습니다.

초기 코드 :

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

Luis의 제안에 따라 이전 답변 에서 루프를 제거했습니다 . 이제 먼저 ( ) m까지 더하는 난수 의 수직 배열을 만든 다음 10의 지수로 사용하고 문자열로 변환하고 왼쪽 정렬하고 표시합니다.ndiff([0;sort(randi(n,m-1,1));n])

기술적으로 disp (...)를 제거하여 다른 6 바이트를 절약 할 수 있지만 "ans"가 인쇄되어 사양을 위반할 수 있습니다. 원하는 최종 형식을 얻기 위해 문자열로 변경하고 왼쪽으로 정렬하는 방법이있을 수 있으므로 제안 사항을 열 수 있습니다.

샘플 출력 :

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

참고 : 제안에 따라 내 기능을 익명 기능으로 변경했습니다. 샘플 출력에서a시연하기 위해할당했습니다. 나는 이것이 사양을 위반하지 않기를 희망하지만, 그것이 알려지면 알려 주시면 변경하겠습니다.


나는 최고 답변이 10 ^.의 동일한 논리를 사용한다는 것을 깨달았습니다. 가치가있는 것, 그리고 그것이 중요하다면, 나는 그것을 나의 대답에 대한 참조로 사용하지 않았습니다. P)
Krostd

또한 부분에 오랫동안 붙어 있었기 때문에을 m더하는 임의의 정수를 생성한다는 아이디어에 대한 이 답변 에 주목하고 싶었 습니다 n. 댓글에서)
Krostd

1

스택 형 , 29 바이트

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

온라인으로 사용해보십시오!

M포함하는 싱글 톤 배열을 구성한 '|'다음 '#'임의로 선택한 배열 N시간에 추가 하여 작동합니다 .


좋은! 모든 결과가 똑같이 될 것입니다.
Luis Mendo

@LuisMendo randin는 Fisher-Yates 알고리즘을 내부적으로 사용하기 때문입니다. (이것은 CJam 답변이 FWIW를 사용하는 것과 동일한 알고리즘입니다)
Conor O'Brien

1

파이썬 2 , 80 95 89 88 바이트

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

온라인으로 사용해보십시오!

  • 15 바이트 추가 : 이전 편집 내용에 약간의 결함이 있었으며 일부 피곤은 제외되었습니다.
  • 6 바이트 절약 : 다른 경우 [n, x] [m> 1]으로 교체
  • 저장된 1 바이트 : 가져 오기 *

1

, 19 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

  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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.