Вырасти несколько цветов!

11

Недавно пришла весна, и это почти время, когда цветы начинают прорастать. Поэтому я хочу, чтобы вы помогли им вырасти.

Твое задание:

Даны два числа, mи nвыводятся 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

Код гольф, поэтому самый короткий код выигрывает!

Спасибо ComradeSparklePony за то, что приняли этот вызов и разместили его в подарочной коробке Secret Santa !. Песочница

Кристофер
источник
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 m? что это за нилад ?
Тит
Эти 33 символа действительно только 33 байта?
Тит
1
@ Titus Я не менял значения, я поменял порядок ввода (и при этом испортил объяснение), так что спасибо, что поймал это. Nilad (в отличие от монады, диады или ...) - это функция, которая не принимает входных данных и возвращает значение - так как такая константа является nilad, как и отдельный вход для функции или программы. Это на самом деле 33 разных байта - символы являются просто кодировкой 256 байтов, которые Jelly использует, как связано со словом байтов в заголовке.
Джонатан Аллан
Вы почти потеряли меня в 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
    ;
Titus
источник
1
Вы добавили байты для флага, верно?
Кристофер
@ Кристофер -rсвободен ; он говорит PHP запускать код из аргумента командной строки. -nсбрасывает PHP к настройкам по умолчанию.
Тит
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) в nиm .

Создает упорядоченную одномерную n*(n-1)длинную «клумбу», bобъединяя:
- список, содержащий «цветок» [1]многократно m; и
- список, содержащий «пробел», [0]повторенный n*~-n-mраз *.

* Оператор головастика ~( ~x=-1-x) сохраняет 2 байта n*~-n-mвместо более нормального вида n*(n-1)-m.

Shuffles ( с помощью random«Sshuffle функцию ) эту клумбу, чтобы расположить цветы и места случайным образом среди n*(n-1)позиций.

Шаги по 0-индексированным строкам rиprints каждая по очереди создает двухмерную клумбу из одномерной ...

В последней двумерной ( n*n) клумбе есть стебли, на sодин ряд ниже цветочных головок f, если и только если нет цветочной головки для показа. Это достигается за счет (операцию XOR ^) fс , -sгде fи sявляются 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.

Для того, чтобы получить fи функция используется с двумя копиями одного размерной клумбы, одна с конечными пробелами (цветочные головки) и один с ведущими пробелами (стебли). Все это создается для каждой строки (для сохранения байтов), и требуемая строка вырезается с помощью .szipnn[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

Попробуйте онлайн!

Генерирует выходную строку по одному символу за раз. Случайно выбирает, является ли текущая ячейка цветком с вероятностью, равной числу mоставшихся цветов, деленному на количество оставшихся пробелов. Добавляет новую строку каждые nсимволы. Пустая ячейка заполняется стеблем, |если символом nконца является a &.

XNOR
источник
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 байт для физического Newline

решение 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

Распечатайте стебель, если внизу цветка еще нет.

Нил
источник