花を育てよう!


11

春が来たばかりで、花が芽を出し始めた頃です。だから、彼らが成長するのを助けてほしい。

あなたのタスク:

2つの数値、、mおよびが与えられた場合、グリッドにランダムに配置されたn出力mn*n

単一の花は次のようになります。

&
|

花の位置は、その場所によって定義され&ます。2つの花をランダムに配置する場合、2つを同じ場所に置くことはできません。ある花&が別の花と重なる場合|、を表示し&ます。花の下の列は何も含まないかもしれません&

入力は、標準メソッドのいずれかを使用して、数値または文字列として行うことができます。

出力は、グリッドの1行を表す文字列のリスト、またはリストと同じガイドラインに従った区切られた文字列です。出力の標準的な方法。後続のものは何でも許可され、タブを使用して花を分離できます。すべてのグリッドは、スペースなどで完全に埋める必要があることに注意してください。

入力は常に有効であることに注意してください。m花をnby nグリッドに常に合法的に適合させることができます。

テストケース:

「ランダム配置」ビット全体により、非常にタイトなテストケースのみが保証されるため、回答が提供される唯一の種類のテストケースになります。ただし、すべての提出物をオンラインで試して、いくつかのテストケースを使用してそれらが有効であることを確認します。

テストケースの入力はの形式で提供されm, nます。

Input: 2, 2
Output:

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

&&&
&&&
|||

Output:テストケースの単語の後の改行はオプションであることに注意してください。

その他のテストケース:

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

ゴルフをコード化するので、最短コードが勝ちます!

この課題を作成し、秘密のサンタさんのギフトボックスに投稿してくれた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

私の心が吹き飛ばされました
クリストファー

あなたがの意味を入れ替えるんでしたmし、nまたは、なぜあなたがsquare mwthniladですか?
タイタス

これらの33文字は実際には33バイトだけですか?
タイタス

1
@Titus私は意味を交換しませんでした、私は入力順序を交換しました(そして、そうすることで説明を台無しにしました)ので、それをキャッチしてくれてありがとう。niladは(モナド、ダイアド、または...とは対照的に)入力を受け取らず、値を返す関数です。定数はniladであり、関数またはプログラムへの単一の入力です。これらは実際には33の異なるバイトです。文字は、ヘッダー内のワードバイトによってリンクされたJellyが使用する256バイトの単なるエンコードです。
ジョナサンアラン

あなたは私をほとんど失ったrotate。よくやった; 優れた故障!
タイタス

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 -rは無料です。コマンドライン引数からコードを実行するようにPHPに指示します。-nPHPをデフォルト設定にリセットします。
タイタス

1
@JonathanAllanそこにあるバージョンプリセットは、前回のアクセスに依存しているようです。おそらくクッキー。
タイタス

3

Python 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

連結することにより、順序付けられた1次元のn*(n-1)長い「花壇」を作成します。- 「花」の繰り返しを含むリスト。および -「スペース」の繰り返し回数を含むリスト*。b
[1]m
[0]n*~-n-m

*おたまじゃくしのオペレータ~~x=-1-xn*~-n-mは、より普通の外観の代わりに2バイト節約しますn*(n-1)-m

この花壇をシャッフルし(randomshuffle機能を使用)、花とスペースをランダムにn*(n-1)配置します。

0から順にインデックスが付けられた行、、rそしてprintsそれぞれが順番に1次元から2次元の花壇を作成します...

最後の2次元(n*n)花壇には、s花頭の1行下に茎があり、表示する花頭fがない場合に限ります。これは、排他的論理和(によって達成される^fを持つとされ、SとSの前から、長さ3の文字列へのインデックス結果を使用して:-sfs10' &|'

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

取得するfsは、zip関数を1次元の花壇の2つのコピーで使用しnます。1つは後続スペース(花頭)、1つはn先行スペース(茎)です。(バイトを節約するために)行ごとに全体が作成され、必要な行はを使用してスライスされ[r*n:r*n+n]ます。



2

Python 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

オンラインでお試しください!

一度に1文字ずつ出力文字列を生成します。現在のセルが、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バイト

最大値を使用した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

JavaScript(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それは、花が2つしか入らないからです。
ニール

ああ、私はそれを間違ったやり方で読んでいた。謝罪。
シャギー

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.