꽃을 키우세요!


11

최근 봄이오고 꽃이 싹트기 시작하는시기가 거의 다되었습니다. 그래서 그들이 자라도록 도와주십시오.

당신의 작업 :

을 감안할 때 두 개의 숫자, mn, 출력 m꽃은 무작위로에 배치 n*n격자입니다.

하나의 꽃은 다음과 같습니다.

&
|

꽃의 위치는 꽃의 위치에 따라 결정됩니다 &. 두 꽃을 무작위로 배치 할 때 같은 장소에 두 꽃을 둘 수 없습니다. 한 꽃이 &다른 꽃과 겹치는 경우을 |표시하십시오 &. 꽃의 맨 아래 줄에는 포함 할 수 없습니다 &.

표준 방법을 통해 숫자 나 문자열로 입력 할 수 있습니다.

출력은 문자열 목록, 각 문자열은 그리드의 한 행을 나타내거나 목록과 동일한 지침에 따라 구분 된 문자열 일 수 있습니다. 표준 출력 방법. 허용되는 것은 무엇이든, 탭을 사용하여 꽃을 분리 할 수 ​​있습니다. 모든 그리드는 공백 또는 무언가로 완전히 채워 져야합니다.

주 입력이 항상 유효합니다, 당신은 항상 법적으로 들어갈 수있을 것입니다 m에 꽃 n으로 n격자입니다.

테스트 사례 :

전체 "임의 배치"비트로 인해 매우 엄격한 테스트 사례 만 보장 할 수 있기 때문에 답변이 제공되는 유일한 테스트 사례입니다. 그러나 나는 모든 테스트 제출을 통해 유효한지 확인하기 위해 온라인으로 모든 제출을 시도 할 것입니다.

테스트 케이스에 대한 입력은 형식으로 제공 m, n됩니다.

Input: 2, 2
Output:

&&
||
--------------
Input: 6, 3
Output:

&&&
&&&
|||

Output:테스트 사례에서 단어 다음에 나오는 줄 바꿈 은 선택 사항입니다.

다른 테스트 사례 :

  1. 1, 10
  2. 0, 100
  3. 5, 8
  4. 6, 3

코드 골프가 가장 짧은 코드가 승리합니다!

이 도전을하고 Secret Santa의 선물 상자에 게시 해 주신 ComradeSparklePony에게 감사합니다!. 샌드 박스 게시물


2
"무작위로"말할 때 가능한 모든 결과가 같은 확률을 가져야합니까?
xnor

답변:


5

젤리 , 33 바이트

²‘;⁹R¤ṬṖs⁸×’¤Ẋ€ṙ2B¤F€ZḄị“&|& ”s⁸Y

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

어떻게?

²‘;⁹R¤ṬṖs⁸×’¤Ẋ€ṙ2B¤F€ZḄị“&|& ”s⁸Y - Main link: n, m        e.g. 3, 2
²                                 - square n                    9
 ‘                                - increment                   10
     ¤                            - nilad followed by link(s) as a nilad:
   ⁹                              -     link's right argument   2
    R                             -     range                   [1,2]
  ;                               - concatenate                 [10,1,2]
      Ṭ                           - untruth (1s at indexes)     [1,1,0,0,0,0,0,0,0,1]
       Ṗ                          - pop                         [1,1,0,0,0,0,0,0,0]
            ¤                     - nilad followed by link(s) as a nilad:
         ⁸                        -     link's left argument    3
           ’                      -     decrement               2
          ×                       -     multiply                6
        s                         - split into chunks           [[1,1,0,0,0,0],[0,0,0]]
             Ẋ€                   - shuffle €ach       (maybe:) [[0,1,0,0,1,0],[0,0,0]]
                  ¤               - nilad followed by link(s) as a nilad:
                2B                -     2 in binary             [1,0]
               ṙ                  - rotate (vectorises)         [[[0,0,0],[0,1,0,0,1,0]],[[0,1,0,0,1,0],[0,0,0]]]
                   F€             - flatten €ach                [[0,0,0,0,1,0,0,1,0],[0,1,0,0,1,0,0,0,0]]
                     Z            - transpose                   [[0,0],[0,1],[0,0],[0,0],[1,1],[0,0],[0,0],[1,0],[0,0]]
                      Ḅ           - from binary (vectorises)    [0,1,0,0,3,0,0,2,0]
                        “&|& ”    - literal                     ['&','|','&',' ']
                       ị          - index into                  [' ','&',' ',' ','&',' ',' ','|',' ']
                               ⁸  - link's left argument        3
                              s   - split into chunks           [[' ','&',' '],[' ','&',' '],[' ','|',' ']]
                                Y - join with newlines          [' ','&',' ','\n',' ','&',' ','\n',' ','|',' ']
                                  - implicit print

내 마음이 날아
Christopher

당신의 의미 교환나요 mn또는 당신은 왜합니까 square m? wth는 nilad 입니까?
Titus

이 33자는 실제로 33 바이트입니까?
Titus

1
@Titus 나는 의미를 바꾸지 않았고, 입력 순서를 바꿨고 (그리고 설명을 엉망으로 만들었습니다.) nilad (모나드 또는 다이어 드 또는 ...와는 대조적으로)는 입력을받지 않고 값을 반환하는 함수입니다. 상수는 함수 나 프로그램에 대한 단일 입력 인 것처럼 nilad입니다. 이것들은 실제로 33 개의 다른 바이트입니다-문자는 Jelly가 헤더의 단어 바이트로 연결된 256 바이트 의 인코딩 일뿐 입니다.
Jonathan Allan

당신은 거의 나를 잃었습니다 rotate. 잘 했어; 훌륭한 고장!
Titus

4

PHP (> = 7.1) 135 131 128 116 110 109 바이트

for([,$m,$n]=$argv,$z=$q=$n*$n;$q;)echo" |&"[$m&&rand(0,--$z-$n)<$m?$s[$q]=2+!$m--:$s[$q+$n]/2],"
"[--$q%$n];

명령 행 인수에서 입력을받습니다. 온라인으로 실행 -nr하거나 테스트하십시오 .

고장

for([,$m,$n]=$argv,     # import arguments
    $z=$q=$n*$n;        # $q = number of total fields, $z-$n = available for flowers
    $q;                 # loop $q down to 0
)   
    echo" |&"[              # print:
        $m&&rand(0,--$z-$n)<$m  # if (probability $m/($z-$n)), decrement $z
            ?$s[$q]=2+!$m--     # then index 2 (flower), set $s[$q], decrement $m
            :$s[$q+$n]/2        # else if flower above, then 1 (stalk), else 0 (space)
        ],
        "\n"[--$q%$n]           # print newline every $n characters
    ;

1
깃발에 바이트를 추가 했습니까?
Christopher

@Christopher -r는 무료입니다 . PHP가 명령 행 인수에서 코드를 실행하도록 지시합니다. -nPHP를 기본 설정으로 재설정합니다.
Titus

1
@JonathanAllan 버전 사전 설정은 이전 방문에 따라 달라집니다. 아마 쿠키 일 것입니다.
Titus

3

파이썬 2 , 150 바이트

from random import*
n,m=input()
b=[1]*m+[0]*(n*~-n-m)
shuffle(b)
for r in range(n):print''.join(' &|'[f^-s]for s,f in zip([0]*n+b,b+[0]*n)[r*n:r*n+n])

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

어떻게?

취하고 input()STDIN에서 제공된 튜플 (쉼표 등 십진 정수 문자열을 분리 언팩 3,6로) nm.

작성 순서, 한 차원 n*(n-1)긴, "화" b, 연결하여 :
-는 "꽃"이 포함 된 목록을 [1]반복 m번; 와
-는 "공간"이 포함 된 목록을 [0]반복 n*~-n-m번 *을.

올챙이 연산자 ~( ~x=-1-x)는 n*~-n-m보다 일반적인 모양 대신 2 바이트를 절약 n*(n-1)-m합니다.

이 화단 random의 셔플 ( ' shuffle기능 사용)을 사용 하여 꽃과 공간을 무작위로 n*(n-1)위치에 배치합니다.

0 인덱싱 행 내지 단계, r그리고 prints차례로 각각은 하나의 차원에서 하나의 이차원 화를 만드는 ...

마지막 2 차원 n*n화단에는 s꽃 머리 f가없는 경우에만 꽃 머리 아래에 한 줄의 줄기 가 있습니다. 이는 XOR 연산 (의해 달성된다 ^) f으로 -s여기서 f그리고 s있는 1S 및 0전 길이의 문자열로 3 색인 결과를 사용들 ' &|':

f   s   f^-s   ' &|'[f^-s]
0   0    0     ' '
0   1   -1     '|'  < negative indexing used here
1   0    1     '&'
1   1   -2     '&'  < ...and here.

얻으려면 f및 함수는 일차원 화의 두 사본 하나에 사용되는 트레일 링 스페이스 (꽃 헤드)와 함께 하나의 선행 공백 (줄기). 바이트를 절약하기 위해 각 행마다 모든 것이 작성되고 필요한 행은을 사용하여 슬라이스됩니다 .szipnn[r*n:r*n+n]



2

파이썬 2 , 129 바이트

from random import*
n,m=input();d=n*n-n
s=''
while d+n:b=0<random()*d<m;m-=b;d-=1;s+=' |&'[-b|(s[~n:-n]=='&')]+'\n'[d%n:]
print s

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

한 번에 한 문자 씩 출력 문자열을 생성합니다. 현재 셀이 m남은 꽃 수를 남은 공간 수로 나눈 확률과 동일한 확률로 꽃인지 여부를 임의로 선택합니다 . 모든 n문자 마다 줄 바꿈을 추가합니다 . 끝 |의 기호 n가 이면 빈 셀에 줄기가 채워집니다 &.


1

PHP, 111 바이트

for([,$b,$s]=$argv;$i<$s**2;)echo${+$i}="| &"[(rand(1,$s**2-$s-$i)>$b?0:$b--)>0?2:${$i-$s}!="&"],"\n"[++$i%$s];

온라인 버전

실제 줄 바꿈의 경우 -1 바이트

max를 사용하는 솔루션 115 바이트

for([,$b,$s]=$argv;$i<$s**2;)echo${+$i}="&| "[rand(1,max($s**2-$s-$i,1))>$b?1+(${$i-$s}!="&"):!$b--],"\n"[++$i%$s];

이 방법으로 137 바이트는 문자열의 첫 부분을 섞습니다.

for([,$b,$s]=$argv,$a=str_shuffle(($p=str_pad)($p("",$b,_),$s**2-$s));$i<$s**2;)echo$a[$i]<_?" |"[$a[$i-$s]==_&$i>=$s]:"&","\n"[++$i%$s];

1

자바 스크립트 (ES6), 157 바이트

f=(n,m,a=[...(` `.repeat(n)+`
`).repeat(n)],r=Math.random()*-~n*~-n|0)=>m?(a[r]==` `?a[m--,r]=`&`:0,f(n,m,a)):a.map((c,i)=>c==` `&&a[i+~n]==`&`?`|`:c).join``
<div oninput=o.textContent=f(n.value,m.value)><input id=n type=number min=2 value=2><input id=m type=number min=1><pre id=o>

설명 : 꽃 격자와 개행을 나타내는 배열을 작성합니다. 원하는 수의 꽃에 도달 할 때까지 꽃을 배치 할 빈 사각형을 재귀 적으로 임의로 검색합니다. 마지막으로 꽃 줄기는 공간이있는 곳에 생성됩니다.


어떤 이유로 n = 2 및 m = 3 일 때 오류가 발생합니다.
얽히고 설킨 Shaggy

@Shaggy 2 개의 꽃을위한 공간이 없기 때문입니다.
Neil

아, 나는 그것을 잘못 읽었습니다. 사과.
얽히고 설킨 Shaggy

1

, 27 바이트

Nθ↷FN«J‽θ‽⊖θW⁼KK&J‽θ‽⊖θ&¬KK

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

Nθ

입력 n.

기본 인쇄 방향을 아래쪽으로 변경하십시오.

FN«

m여러 번 입력 하고 반복하십시오.

J‽θ‽⊖θ

그리드에서 임의의 위치로 이동하십시오.

W⁼KK&J‽θ‽⊖θ

이미 꽃이있는 경우 적절한 지점을 찾을 때까지 임의의 위치로 계속 점프하십시오.

&

꽃 머리를 인쇄하십시오.

¬KK

아래에 꽃 머리가 없으면 줄기를 인쇄하십시오.

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