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


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=7및 n=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.