种些花!


11

春天已经到来,几乎是花朵开始发芽的时候。所以我希望你能帮助他们成长。

你的任务:

给定两个数字,mn,将输出m花朵随机放置在n*n网格上。

一朵花看起来像这样:

&
|

一朵花的位置由它所在的位置定义&。随机放置两朵花时,不能在同一位置放两朵花。如果一朵花的&重叠与另一朵花的重叠|,请显示&。最下面一排花可能不包含任何花&

通过任何标准方法,输入可以是数字或字符串。

输出可以是字符串列表,每个字符串代表网格的一行,或者是与列表相同的准则后的定界字符串。标准输出方法。随行随行,您可以使用标签来分隔花朵。请注意,每个网格必须完全用空格或其他东西填充。

请注意,输入将始终有效,您将始终能够合法地将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提出的挑战并将其张贴在Secret Santa的礼物盒中!沙盒发布


2
当您说“随机”时,是否所有可能的结果都需要具有相等的概率?
xnor

Answers:


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

我的心被风吹
克里斯托弗

您是否交换了mand的意思,n或者为什么square m?是尼拉德人吗?
泰特斯(Titus),

这33个字符真的只有33个字节吗?
泰特斯(Titus)

1
@Titus我没有交换含义,而是交换了输入顺序(这样做搞乱了解释),因此感谢您理解这一点。nilad(相对于monad或dyad或...)是不接受任何输入并返回值的函数-此类常数就是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

@Christopher -r是免费的;它告诉PHP从命令行参数运行代码。-n将PHP重置为默认设置。
泰特斯(Titus),

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

通过串联创建一个有序的,一维n*(n-1)长的“花坛”, - 重复包含“花”的列表;和 -包含“空间”列表重复倍*。b
[1]m
[0]n*~-n-m

* operator运算符~~x=-1-x)保存2个字节n*~-n-m代替看起来更普通的字节n*(n-1)-m

随机播放(使用randomshuffle功能)此花坛,以在n*(n-1)位置之间随机放置花朵和空间。

逐步浏览索引为0的行,r然后prints依次从一维数组创建二维花坛。

当且仅当无头花展示时,最后的二维(n*n)花坛上的茎杆s位于头顶下方一行f。这是通过XORing(^f-swhere fsare之前的1s和0s并使用结果索引到长度为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.

要获得fszip功能用于与一个维花坛的两个副本,一个与n尾随空格(花头)和一个具有n前导空格(秸秆)。为每一行创建整个对象(以节省字节),并使用切出所需的行[r*n:r*n+n]


2

Python 2中184个 179字节

from random import*
m,n=input()
s,a=' &'
l=[s]*n*-~n
while s.count(a)<m:x=randrange(n*n-n);l[x]=a;l[x+n]='|&'[l[x+n]==a];s='\n'.join(''.join(l[i*n:][:n])for i in range(n))
print s

在线尝试!


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

在线尝试!

一次生成一个字符的输出字符串。随机选择当前单元格是否为花朵,其概率等于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那是因为只有两朵花的空间。
尼尔

啊,我读错了它。道歉。
毛茸茸的

1

木炭,27字节

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

在线尝试!链接是详细版本的代码。说明:

Nθ

输入n

将默认打印方向更改为向下。

FN«

输入m并循环多次。

J‽θ‽⊖θ

跳转到网格上的随机位置。

W⁼KK&J‽θ‽⊖θ

如果已经有一朵花,请继续跳到随机位置,直到找到合适的位置。

&

打印头花。

¬KK

如果下面还没有头花,请打印秸秆。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.