Наповніть миску супом з алфавітом


24

Ми , здається , ніколи і НЕ отримати втомився алфавіт пов'язаних проблем ...


Рецепт

Дано

  • рядок літер Sта
  • два позитивних цілих чисел M, N,

виготовляють алфавітний суп з літерами, що Sзаймають випадкові положення у прямокутній мисці розміром M× N, обрамленою неабетковим символом, який не є пробілом, щоб зобразити ободок чаші.

Позиції, які не використовуються літерами, повинні відображатися як пробіли. Дивіться приклади нижче .

Додаткові правила

  • Розмір M× Nвідноситься до внутрішньої частини чаші. Розмір, включаючи ободок, M+2× N+2.
  • Кожен персонаж з нього Sповинен з’явитися один раз у мисці, в іншому положенні ; тобто один символ не може замінити інший.
  • S може містити дублікати . Наприклад, якщо Sце рядок 'abcc', суп повинен містити один a, один bі два c(усі в різних положеннях).
  • Входи будуть задовольняти обмеження M >= 1 , N >= 1, 1 <= length(S) <= M*N.
  • Ободок чаші може мати будь-який не алфавітний, непробільний символ , який відповідає послідовностям програми та вводу значень.
  • Позиції букв у чаші випадкові, тому результат може відрізнятися щоразу, коли програма запускається з однаковими входами.
  • З огляду на введення, кожен можливий набір позицій літер повинен мати ненульову ймовірність . Оскільки це неможливо перевірити за допомогою декількох реалізацій програми, поясніть, як ваш код виконує це.
  • Провідна або кільцева пробіл навколо обідка дозволений.
  • Sбудуть містити лише великі літери. Якщо хочете, ви можете взяти лише малі літери.
  • Введення та вихід гнучкі, як завжди. Наприклад, результатом може бути рядок з новими рядками, двовимірний масив символів або список рядків.
  • Програми або функції дозволені на будь- якій мові програмування . Стандартні лазівки заборонені.
  • Виграє найкоротший код у байтах.

Приклади

Вхідні дані відображаються як S, [M N], де Mкількість рядків і Nкількість стовпців. Символ #використовується для обода.

'O', [1 1]:

###
#O#
###

'HEY', [1 3]:

#####
#YHE#
#####


'HELLO', [4 11]:

#############
#  O        #
#         H #
#    LE     #
#   L       #
#############


'ADVNJSGHETILMVXERTYIOJKCVNCSF', [8 12]:

##############
#K  V  L   S #
# A   V  X H #
#T    M C    #
# I       O N#
#  YC        #
# G  I   R SE#
#   J      F #
#JT  D  V EN #
##############


'OOOOOOOOOOXXXXX', [13 31]:

#################################
#    X                          #
#                O              #
#                               #
#                  X            #
#                        O      #
#             X           O     #
#      O                        #
#         X                     #
#                        O      #
#       X                       #
#                    O          #
#  O      O      O              #
#                             O #
#################################


'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ', [11 41]

###########################################
#                                       JU#
#     Q         C M    G     R T U Y  H   #
#  KI          E   H    M   YO            #
#      V BW        I    JC                #
#     SV           D     P   B          U #
#           A     F    RF   J  KP E       #
#            E   N      TH        Z       #
#    N  BM  O     Q   I        AS N  WX   #
#   S     O  K       G L       P       Q  #
#Z     L T         R   L       A      F DD#
#      V   Y           WX   C       G XZ  #
###########################################


"Позиції літер у мисці випадкові, [...]" <- ти маєш на увазі, що вони можуть бути випадковими чи повинні бути випадковими? І чи можуть усі рядки мати однакову кількість символів весь час?
Ісмаїл Мігель

@IsmaelMiguel Повинен . І кожна конфігурація повинна мати ненульову ймовірність виникнення (зазначена в виклику). Таким чином, це виключає "завжди" однаковий підхід
Луїс Мендо

Чи може ободок бути послідовним для виконання програми та значень введення, але використовувати декілька не букв, наприклад, намалювати межу мистецтва ASCII |+-?
Адам

@ Adám Гм. Я скажу ні, це занадто велика зміна
Луїс Мендо

Відповіді:


13

05AB1E , 20 18 16 15 14 байт

*j.rS²ô2Føε8.ø

Бере три входи в порядку: висота, ширина, рядок. Виведіть як двовимірний список символів.
Використовується 8як рамка, але може бути будь-якою цифрою.

-1 байт завдяки @Grimy .

Спробуйте в Інтернеті або перевірте всі тестові випадки . (TIO містить }}J»у нижньому колонтитулі, щоб красиво роздрукувати результат; сміливо видаляйте його, щоб побачити фактичний вихідний двовимірний список символів.)

Пояснення:

*               # Multiply the (implicit) width and height inputs
 j              # Pad the (implicit) input-string with up to that amount of leading spaces,
                # so the total string-length is equal to that value
  .r            # Shuffle the characters in the string
    S           # Convert the string to a list of characters
                # (edge-case for the zip below with strings of size 1 with 1x1 dimensions)
     ²          # Push the width input again
      ô         # Split the list of characters into parts of that size
       2F       # Loop 2 times:
         ø      #  Zip/transpose the 2D list; swapping rows/columns
          ε     #  Inner map over each line:
           8.ø  #   And surround this line-list with a leading/trailing "8"
                # (after the loop, the result is output implicitly)

1
@LuisMendo Я фактично просто кажу про виклик 3 хвилини тому. ;) Це досить пряма реалізація. Спробуємо гольф його звідси.
Кевін Крейссен

1
Дуже добре, я не думав про це *j! Ось 13 для спадщини або некрасиво 14 для сучасних (виводить двовимірний масив символів).
Гриммі

1
@Grimy 13-байт, здається, не вдається для введення 1,1,"O", тому я думаю, що він повинен бути 14-байтовим для спадщини. Дякую за -1, хоча
Kevin Cruijssen

7

APL (Dyalog Unicode) , 25 байт SBCS

'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}

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

-22 завдяки @ngn, -7 завдяки @ngn та @ Adám

Пояснення:

'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
          {            ⍵}  Function that generates the content
                            argument:  (width and height),  (string)
                     ×/    get the product
                   ?⍨      For each randomized elements
               ↓∘⍺¨        take the character in 
           ⍵⍴⊃¨            turn it back into a matrix of shape 
      4                 Then, 4 times, do these 3 things:
'#',                       - prepend a # to the axis
                          - reverse the columns
                          - swap columns and lines

APL (Dyalog Extended) , 21 байт SBCS

Кути обода є різними символами

{⌂disp⊂⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}

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

Використання dfn для відображення вікна.


29: '#',∘⌽∘⍉⍣4⊢⍴∘(?⍨∘≢⊃¨⊂)↑⍨∘(×/) Спробуйте в Інтернеті!
Адам

28: {'#',∘⌽∘⍉⍣4⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}(або замість >if ⎕io=1)
ngn

на самому ділі, 27:'#',∘⌽∘⍉⍣4{⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
СПП

3
25:'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
ngn


6

Python 3 , 110 байт

lambda s,m,n,r=['#']:[r+(n*r+[i for i,j in{*zip(s+m*n*' ',range(m*n))}]+n*r)[k*n:-~k*n]+r for k in range(m+2)]

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

Довільно рандомізується за допомогою setрозуміння та повертає двовимірний масив символів.


Приємне використання заданого розуміння для рандомізації. +1. Але ваші коди покладаються на ім'я 'f' функції. Тому я думаю , що рішення лямбда не діє ...
agtoever

1
@agtoever Дякую! Функція не є рекурсивною, тому може бути анонімною. Ви посилаєтесь на f'{s:{m*n}}'частину? Тому що це синтаксис для відформатованого рядка, який так само випадково також починається з f.
Jitse

3
Цей код, схоже, порушує PEP 8 кількома способами.
Крістофер Олссон

1
@ Крістофер-Ольссон абсолютно!
Jitse

2
@ChristoferOhlsson Ласкаво просимо у світ коду-гольфу, ха-ха. ;) Жодних коментарів / документів; одиночні змінні / методи без будь-яких (непотрібних) пробілів / нових рядків; потенційно сотні попереджень компілятора, які ми просто ігноруємо; підвищення продуктивності від O (log (N)) до O (N ^ N); і т. д. Якщо він може врятувати навіть один байт, це все добре і цілком варто цього для коду-гольфу. ;)
Кевін Крейссен

5

Bash + coreutils, 139 125 символів

r=`printf %$3s@@|tr \  @`
echo $r
printf %$[$2*$3]s $1|fold -1|shuf|tr -d \\n|fold -$3|paste -d@ <(:) - <(:)|head -$2
echo $r

Проба зразка:

bash-5.0$ bash soup.sh HELLO 4 11
@@@@@@@@@@@@@
@  H        @
@      OE   @
@    L      @
@          L@
@@@@@@@@@@@@@

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

Bash + coreutils + поля, 97 символів

printf %$[$2*$3]s $1|fold -1|shuf|tr -d \\n|fold -$3|boxes -dsimple -s$[$3+2]x$[$2+2] -pa0 -itext

Проба зразка:

bash-5.0$ set -- HELLO 4 11

bash-5.0$ printf %$[$2*$3]s $1|fold -1|shuf|tr -d \\n|fold -$3|boxes -dsimple -s$[$3+2]x$[$2+2] -pa0 -itext
*************
* O   L  E  *
*      H    *
*           *
*     L     *
*************

Спробуйте в Інтернеті! (Частково, як boxesце не встановлено в TIO.)


5

J , 30 29 байт

-1 байт завдяки Йона

'#'|.@|:@,^:4[$*/@[(?~@[{{.)]

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


1
Тому що TIO використовує фіксований випадковий насіння. 9!:1]6!:9''виправляє це
Adám

2
Дійсно подобається спосіб використання нульового заповнення {.. Невеликий твіт для 29 '#'|.@|:@,^:4[$*/@[(?~@[{{.)]: Спробуйте в Інтернеті!
Іона

1
@Jonah Дякую!
Гален Іванов

5

PowerShell , 163 111 93 байт

param($w,$h,$s)'#'*$w+-join($s|% *ht($w*$h)|% t*y|sort{Random})+'#'*$w-replace".{$w}",'#$0#
'

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

$wВводить дані як idth, $hвосьми, $string.

Створює рядок з #відповідного $wIDþ, рядок-об'єднання, з деякими обчисленнями, а потім в тому ж #рядку знову. Розрахунок починається з прийняття вхідного $sтрінгу та виконання .padRig htдо $width на $hвісім завдовжки (тобто, зробіть рядок достатньо довгий, щоб повністю зайняти прямокутний простір. Потім перетворимо цей рядок toCharArra y, і sortце Randomly. Це дає Нам нарешті змішану середню частину.Нарешті, ми розбиваємо -replaceїї на шматки рівних $wідт, і оточуємо ці шматки #s.

-52 завдяки натхненню від AZTECCO
-18 байт завдяки маззі


У вас є 2-х випадкових (12), а у JS є один, він додав пробіли для заповнення розміру M * N і відсортований, після чого ви все ще платите 21 за '$', на жаль
AZTECCO

1
@AZTECCO Дякую за натхнення!
AdmBorkBork

Спасибі @mazzy - дуже розумний, -replaceзамість того, щоб розколотись та приєднатись.
AdmBorkBork

4

JavaScript (ES7), 125 байт

Повертає рядок. Використовується 0як символ кадру.

(s,h,w)=>(a=[...s.padEnd(w++*h++)].sort(_=>Math.random()-.5),g=x=>y+~h?(x%w&&y%h&&a.pop())+[`
`[x-w]]+g(x<w?x+1:!++y):a)(y=0)

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

Прокоментував

(s, h, w) => (               // s = string; h = height; w = width
  a =                        // build an array a[] consisting of:
    [...s.padEnd(w++ * h++)] //   all original characters in s padded with spaces for a
    .sort(_ =>               //   total length of w * h, in a random order
      Math.random() - .5     //   (this is not guaranteed to be uniform, but it is not
    ),                       //   required to be)
  g = x =>                   // g is a recursive function taking x:
    y + ~h ?                 //   if we haven't reached the end of the grid:
      ( x % w &&             //     if we're not located on a vertical border
        y % h &&             //     nor on a horizontal border,
        a.pop()              //     extract the last character from a[]
      ) +                    //     (otherwise, append '0')
      [`\n`[x - w]] +        //     if we've reached the end of the row, append a linefeed
      g(                     //     append the result of a recursive call:
        x < w ? x + 1 : !++y //       using either (x+1, y) or (0, y+1)
      )                      //     end of recursive call
    :                        //   else (end of grid):
      a                      //     a[] is now empty and can be used as an empty string
)(y = 0)                     // initial call to g with x = y = 0

4

APL (розширений діалог) , 23 байти SBCS

Функція анонімного мовчазного виправлення. Бере[M,N] як лівий аргумент і Sяк правий аргумент.

'#',∘⌽∘⍉⍣4⊣⍴×/⍛(?⍨⍤⊣⊇↑)

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

×/⍛() Застосувати наступну функцію між аргументами, замінивши лівий аргумент своїм продуктом:

 взяти M×N символів з S, прокладки з пробілами праворуч

 упорядкуйте це у наступному порядку:

?⍨⍤ перетасовані індекси від 1 до…
 лівий аргумент ( M× N)

r Формуйте таку форму:

 лівий аргумент (тобто Mрядки таN стовпці)

'#'⍣4 Застосуйте таку функцію чотири рази, кожен раз із символом хеша як лівий аргумент:
∘⍉ перенесіть правий
∘⌽ дзеркало аргументу, правий аргумент
,об'єднає стовпець хешей у ліву частину цього


4

PHP 7.4, 107 99 94 символів

fn($s,$r,$c)=>_.chunk_split(($b=str_pad(_,$c,_)).str_shuffle(str_pad($s,$r*$c)),$c,"_
_").$b._

Завдяки:

  • Ісмаїл Мігель нагадав мені про функції стрілок PHP 7.4 (-10 символів)
  • Night2 для ефективної реверсії конкатенацій та join()(-8 символів)
  • Night2 для показу , як використовувати chunk_split()«s $endпараметр (-5 символів)

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

PHP 7,3, 117 112 108 символів

function s($s,$r,$c){echo _.chunk_split(($b=str_pad(_,$c,_)).str_shuffle(str_pad($s,$r*$c)),$c,"_
_").$b._;}

Завдяки:

  • Night2 для ефективної реверсії конкатенацій і join()(-5 символів)
  • Night2 для показу , як використовувати chunk_split()«s $endпараметр (-4 символів)

Проба зразка:

php > function s($s,$r,$c){echo _.chunk_split(($b=str_pad(_,$c,_)).str_shuffle(str_pad($s,$r*$c)),$c,"_
php " _").$b._;}
php > s('HELLO', 4, 11);
_____________
_  L        _
_        L  _
_E          _
_    OH     _
_____________

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


1
Я вважаю, що це fn($s,$r,$c)=>($b=str_repeat(9,$c+2))."\n9".join("9\n9".str_split(str_shuffle(str_pad($s,$r*$c)),$c))."9\n$b";повинно працювати в PHP 7.4 ( wiki.php.net/rfc/arrow_functions_v2 ), а кандидат на реліз був випущений ( wiki.php.net/todo/php74 ), тож це доступний "компілятор", який прийшов перед цим викликом, і будь-хто може ним скористатися.
Ісмаїл Мігель

1
До, ти маєш рацію. Прочитав, але забув. (Примітка до себе: в наступний раз , не просто читати night2 «s наконечник Upvote це теж, може бути , допомагає згадати ..)
manatwork


1
Дякую, @ Night2. Я не можу уявити, що я зіпсував вчора, коли я намагався перемістити більше речей всередині join(), але не зміг зменшити розмір. ☹
манатура

1
Отримав навіть коротший, використовуючи chunk_split: 94 байти Я також видалив останню крапку з комою, оскільки я вважаю, що вона не потрібна, ви написали функцію, тому код, який збирається призначити її змінній, не повинен зараховуватися.
Ніч2

3

MATL , 22 19 байт

tZ"ibpyn&Z@(TT35&Ya

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

Дякуємо @LuisMendo за збереження 3-х байт, тож тепер він має той самий побічний облік, як і відповідь @ flawr , але достатньо інший для публікації в будь-якому випадку. Огляд агоритму високого рівня:

 Z"                  % Create n x m matrix of spaces
           (         % Index into this matrix:
   i                 %  The alphabet vermicelli (explicit input)
        &Z@          %  at a random locations (randperm), which are
      yn             %   length(S) numbers, ranging
t   bp               %   from 1 to n*m
            TT35&Ya  % And finally add a border

Ви можете змінити Z}&Oшляхом Z", і що також дозволяє видалити остаточнийc
Луїс Mendo

@LuisMendo О, це дуже допомагає! Подумайте про це, я повинен був хоча б зробити 1$O.
Санчіз

3

Рубін , 121 байт

Створює чашу, запитує індекси всіх пробілів всередині чаші, відбирає кількість пробілів, рівних розміру рядка, і заповнює їх. sampleНе повертає відсортованого списку, тому не потрібно перетасовувати. Пошук індексів до 9*m*n(що майже напевно виходить за межі діапазону) все одно отримає всі пробіли і на 1 байт коротший, ніж r.size.

->s,m,n{r=[t=?@*(n+2),*["@#{' '*n}@"]*m,t]*$/;i=-1;(0..9*m*n).select{|j|r[j]==' '}.sample(s.size).map{|j|r[j]=s[i+=1]};r}

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


3

Червоний , 120 116 114 112 байт

-2 байти завдяки @Kevin Cruijssen!

func[s m n][random pad s m * n insert/dup t: copy"00"0 n
print t loop m[print rejoin[0 take/part s n 0]]print t]

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


2
-2 байти, позбувшись + 1і скориставшись to"""00"0 nзамість цього.
Кевін Круїссен

1
@KevinCruijssen Дякую! Я замінив його copyна той самий підрахунок байтів.
Гален Іванов

1
Це дійсно виглядає трохи чистіше! Я не знаю Червоного, за винятком відповідей, які я бачив від вас, тому я просто трохи обмахувався. ;) Чи буде ставити tрядок як провідний / кінцевий елемент перед циклом, щоб зберегти на двох вільних, print tбути коротшим? Я сумніваюся в цьому, але оскільки я не знаю, як додати елементи до списку, я не впевнений.
Kevin Cruijssen

3

Perl 6 , 74 67 байт

-5 байт завдяки Джо Кінгу

{0 X~0 x$^n,|comb($n,[~] $^s.comb[pick *,^$^m*$n]X//' '),0 x$n X~0}

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

Пояснення

{                                                                 }
                                         ^$^m*$n  # Range 0 .. M*N-1
                                  pick *,  # Shuffle
                         $^s.comb  # Split S into chars
                                 [              ]  # Pick shuffled elements
                                                 X//' '  # undef to space
                     [~]  # Join
             # Split into n-character strings
             comb($n,                                  )
            |  # Flatten
     # Add top and bottom of bowl
     0 x$^n,                                            ,0 x$n
 # Add left and right of bowl
 0 X~                                                          X~0



3

k4, 32 28 байт

{4{|+x,'"#"}/y#a?(a:-*/y)$x}

редагувати: -4 дякую Галену Іванову!

називається подібним

f["hey";3 3]

пояснення:

                 (a:-*/y)    / neg product of y and assign to a 
                         $x  / left pad x so we have char vector the length of the inner area
               a?            / take `a` random drawings. if a is negative, draw with no duplicates/replacements
             y#              / reshape to y's dimensions
 4{        }/                / do {} 4 times 
   |+x,'"#"                  / append "#" along right-side of x then transpose (+) and reverse (|)

1
Я думаю, ви можете зберегти кілька байтів, якщо додавати лише #в кінці кожного рядка і 4 рази переміщувати / обернути назад, щось подібне .
Гален Іванов

1
@GalenIvanov приємно, оновлено!
scrawl

3

Java (JDK) , 180 178 байт

Ні одного додаткового імпорту:

(y,m,n)->{for(m*=n;y.length()<m;y+=" ");var s="";for(;m-->0;y=s)for(var c:y.split(s=""))s=Math.random()<.5?s+c:c+s;s="#".repeat(n);return(s+y+s).replaceAll(".{"+n+"}","\n#$0#");}

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

Це була цілком боротьба, щоб звалити цей гольф. Зокрема, імпорт методів Collections.shuffle () / Arrays був занадто великим, щоб прийняти, тому мені довелося створити власний алгоритм перетасовки рядків (напевно, ні ефективний, ні рівномірно розподілений). Велика подяка Стівену за доведення будь-якого набору позицій може бути сформована за допомогою алгоритму.

Відформатовано (з поясненням):

(y, m, n) ->                                                   // y = yummies in the soup,
{                                                              // m = height, n = width
    for (m *= n; y.length() < m; y += " ")                     // set m to m*n and
        ;                                                      // add spaces to y to fill up
    var s = "";                                                // the rest of the soup
    for (; m-- > 0; y = s)                                     // for m*n iterations, scramble y
        for (var c : y.split(s = ""))                          // with random appends
            s = Math.random() < .5 ? s + c : c + s;
    s = "#".repeat(n);                                         // create the top/bottom of the rim
    return (s + y + s).replaceAll(".{" + n + "}", "\n#$0#"); // add all sides of the rim
};

Гарна відповідь! +1 від мене. Одна невелика річ до гольфу: .replaceAll("(.{"+n+"})","\n#$1#")може стати.replaceAll(".{"+n+"}","\n#$0#")
Кевін Круїссен

@KevinCruijssen Дякую за покращення :)
Avi

2

Вугілля деревне , 27 байт

NθNη↖B⁺²θ⁺²η#FS«W℅KKJ‽θ‽ηPι

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Вводить дані в ширину порядку, висоту, рядок. Пояснення:

NθNη

Введіть ширину та висоту.

↖B⁺²θ⁺²η#

Каркас миску.

FS«

Проведіть петлю над символами в рядку.

W℅KKJ‽θ‽η

Переходьте до випадкової позиції в мисці, поки не знайдеться порожнє місце.

Pι

Роздрукувати поточний символ без переміщення курсору.


Це Move(:UpLeft)потрібно? Добре працює без нього, але, можливо, ви додали його з тієї причини, про яку я не думаю?
Кевін Кройсейсен

1
@KevinCruijssen Без цього я ніколи не зможу писати листи в нижній рядок або крайній правий стовпець.
Ніл

А, так це було. Це пояснює це, дякую!
Кевін Круїссен

2

Japt -R , 21 18 байт

úV*W ö¬òW ²Ô²û2W+2

Спробуй це

úV*W ö¬òW ²Ô²û2W+2     :Implicit input of string U=S and integers V=M & W=N
úV*W                   :Right pad U with spaces to length V*W
     ö¬                :Random permutation
       òW              :Split to array of strings of length W
          ²            :Push 2
           Ô           :Reverse
            ²          :Push 2
             û2W+2     :Centre pad each element with "2" to length W+2
                       :Implicit output, joined with newlines

2

MATL , 29 27 19 байт

pZ@iy~hw)1GeTT35&Ya

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

Дякую @LuisMendo за -8 байт!

Пояснення: pобчислює кількість суп-пікселів. Потім Z@виробляється випадкова перестановка розміру кількості пікселів супу. Ми будемо використовувати це в якості індексів, до iy~hяких додається рядок введення з достатньою кількістю пробілів. w)поміняє два і індексує одне іншим. Потім 1Geформуємо форму в потрібний прямокутник і #вкладаємо його TT35&Ya.


2
Розумний! Моєю спробою було 22 байти
Санчіз

2
@Sanchises Відправте це все одно!
недолік

2

T-SQL 2017, 232 байти

Тестування цього Інтернету - це старіша версія sql-сервера, яка коштує іншого символу. Я розмістив більш коротку версію.

Гольф:

DECLARE @ varchar(max)=''SELECT top 999 @+=substring(@i,number+1,1)FROM spt_values
WHERE type='P'and number<@a*@b
ORDER BY newid()WHILE-@b<1SELECT @=stuff(@+' ',@b*@a+1,0,'#
#'),@b-=1PRINT stuff(replicate('#',2+2*@a),2+@a,0,trim(@))

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

Безголівки:

DECLARE @ varchar(max)=''

SELECT top 999 @+=substring(@i,number+1,1)
FROM spt_values
WHERE type='P'and number<@a*@b
ORDER BY newid()

WHILE-@b<1
SELECT @=stuff(@+' ',@b*@a+1,0,'#
#'),@b-=1
PRINT stuff(replicate('#',2+2*@a),2+@a,0,trim(@))

2

C (стук) , 169 164 162 160 байт

i,b;f(n,m,s)char*s;{char*a,o[b=i=-~++n*(m+=3)];for(srand(time(a=o));--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;*s;*a=*a-32?*a:*s++)a=o+rand()%b;puts(o);}

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

-2 введення a = o в час () виклик // для (srand (час (a = o)); ...

Збережена пропозиція 7 @ceilingcat для використання - ~ змінна та автоматичне зберігання для рядка o плюс багато вдосконалень.

Дегольф:

char*a,// pointer for set operations 
*o=malloc(b=i=(m+=3)*(n+=2));  => o[b=i=(m+=3)*-~++n]
// before allocating for the whole bowl as a char array
// increments m by 3 (2 for rims and 1 for '\n') and n by one but allocates for 2(rims)
// and assigns bowl size to i and b.
srand(time(0));// seeds rand function 
for(// loop to make empty bowl 
a=o;// using pointer as iterator
 --i ;)//  i decremented as a counter

 *a=// sets every char to..
 i%m?// if(not) over right side of bowl (m+3)
   -~i%m<3|i<m|i>m*n-m?35// if on rim '#'//-~i == (i+1)
   :32 // else ' ' 
  :10;// i%m==0

for(*a=0;// before loop terminates bowl with \0
 *s;// for every letters(exit on '\n')
 *a=*a-32?*a:*s++)
 // puts letter if bowl at a is a space and
 // go to next letter

 a=o+rand()%b; 
 // sets a to o offsetted by random

puts(o);// prints bowl 

Запропонувати *a=--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(;замість--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;
roofcat

@ceilingcat це має працювати, але чомусь він дає неправильний висновок щодо останніх 2 тестових випадків
AZTECCO


1

Желе , 16 байт

P⁶ẋaẊs⁸ṪṾ€«”~ZƊ⁺

Діадичне посилання, що приймає список цілих чисел, [M, N]зліва та список символів, Sправоруч - список списків символів, рядки. Використовує символ тильди ~, як кордон.

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

Усі можливі виходи мають ненульовий шанс отримати результат, оскільки ми переміщуємо ( ) список символів Sразом із відповідною кількістю пробілів.

Код Ṿ€«”~ZƊ⁺зберігає байт, який, на мою думку, потрібно буде з'єднати з новими рядками, які повинні використовувати повні програми, що використовують ціле число, таке як нуль (наприклад, P⁶ẋaẊs⁸Ṫ;€0ZUƊ4¡Yабо P⁶ẋaẊs⁸Ṫj@€Ø0Z$⁺Y). Можливо, є спосіб заощадити більше ...?

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