Виростіть кілька квітів!


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

Код гольфу настільки короткий виграє код!

Дякуємо товаришуSparklePony за те, що зробили цей виклик та опублікували його в подарунковій коробці таємного Санта !. Пісочний пост


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? wth - нілад ?
Тіт

Це справді 33 символи лише 33 байти?
Тит

1
@Titus Я не міняв значеннями, я поміняв порядок введення (і, таким чином, переплутав пояснення), тож спасибі, що це зрозумів. Нилад (на відміну від монади чи діади або ...) - це функція, яка не приймає входів і повертає значення - оскільки така константа є ніладом, як і єдиний вхід до функції або програми. Це дійсно 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
    ;

1
Ви додали байти для прапора?
Крістофер

@Christopher -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.

Перемішає (за допомогою функції random' shuffle) цю клумбу, щоб розташувати квіти і пробіли випадковим чином серед n*(n-1)позицій.

Проходимо через 0-індексовані рядки, rі printsкожен по черзі створює двовимірну клумбу з одновимірної ...

Кінцева двовимірна ( n*n) клумба має стебла, sодин ряд нижче квіткових головок f, якщо і тільки якщо немає квіткової головки для показу. Це досягається XORing ( ^) 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та sвикористання zipфункції використовуються дві копії одновимірної клумби, одна з nпроміжними проміжками (квіткові головки) та одна з 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

Спробуйте в Інтернеті!

Створює вихідний рядок по одному символу за раз. Випадково вибирає, чи є поточна клітина квіткою, ймовірність якої дорівнює кількості 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

Надрукуйте стебло, якщо внизу вже немає головки квітки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.