Наполните миску алфавитным супом

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 Must . И каждая конфигурация должна иметь ненулевую вероятность возникновения (указано в задаче). Так что это исключает подход всегда-одинаковой длины
Луис Мендо
Может ли ободок быть одинаковым для всех прогонов программы и вводимых значений, но использовать несколько не букв, например, рисуя художественную границу ASCII |+-?
Адам
@ Adám Хм Я собираюсь сказать нет, это слишком большое изменение
Луис Мендо

Ответы:

13

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

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

Принимает три входа в порядке: высота, ширина, строка. Вывод в виде 2D списка символов.
Используется в 8качестве границы, но может быть любой цифрой.

-1 байт благодаря @Grimy .

Попробуйте онлайн или проверьте все контрольные примеры . (TIO содержится }}J»в нижнем колонтитуле, чтобы красиво распечатать результат; смело удаляйте его, чтобы вместо этого увидеть фактический выводной 2D-список символов.)

Объяснение:

*               # 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, хотя.
Кевин Круйссен
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⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}(или вместо >если ⎕io=1)
СПП
на самом деле, 27:'#',∘⌽∘⍉⍣4{⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
нгн
3
25:'#',∘⌽∘⍉⍣4{⍵⍴⊃¨↓∘⍺¨?⍨×/⍵}
нгн
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понимания и возвращает двумерный массив символов.

Jitse
источник
Хорошее использование набора понимания для рандомизации. +1. Но ваши коды опираются на имя «f» функции. Поэтому я думаю , что решение лямбда не действует ...
agtoever
1
@ Спасибо, спасибо! Функция не является рекурсивной, поэтому она может быть анонимной. Вы имеете в виду f'{s:{m*n}}'часть? Потому что это синтаксис для форматированной строки, который, по совпадению, также начинается с f.
Джитс
3
Этот код нарушает PEP 8 несколькими способами.
Кристофер Олссон
1
@ Кристофер-Ольссон абсолютно!
Джитс
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.)

manatwork
источник
5

J , 30 29 байт

-1 байт благодаря Ионе

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

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

Гален Иванов
источник
1
Потому что TIO использует фиксированное случайное начальное число. 9!:1]6!:9''исправляет это
Адам
2
Очень нравится способ, которым используется нулевая заливка {.. Небольшая настройка для 29 '#'|.@|:@,^:4[$*/@[(?~@[{{.)]: попробуйте онлайн!
Иона
1
@ Иона Спасибо!
Гален Иванов
5

PowerShell , 163 111 93 байта

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

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

Принимает ввод как $width, $hвосемь, $string.

Создает строку #соответствующего $width, присоединяет строку с некоторыми вычислениями, а затем #снова эту же строку. Вычисление начинается с взятия входной $sстроки и выполнения .padRig с htточностью до $wвосьмого на $hвосемь (т.е. сделать строку достаточно длинной, чтобы полностью занять прямоугольное пространство. Затем мы преобразуем эту строку toCharArray , и sortэто Randomly. Это дает мы перепутали среднюю часть. Наконец, мы разбиваем -replaceее на куски одинакового $wчисла и окружаем эти куски символом #s.

-52 благодаря вдохновению от AZTECCO
-18 байт благодаря мази

AdmBorkBork
источник
У вас есть 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
Arnauld
источник
4

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

Анонимная негласная инфиксная функция. Принимает [M,N]как левый аргумент и Sкак правый аргумент.

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

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

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

 взять M× Nсимволов из S, отступы с пробелами справа

 измените порядок в следующем порядке:

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

г eshape , что к следующей форме:

 левый аргумент (то есть 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     _
_____________

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

manatwork
источник
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
2
99 байтов
ночь2
1
Спасибо, @ Night2. Я не могу вообразить, что я испортил вчера, поскольку я попытался переместить больше материала внутри join(), но не смог уменьшить размер. Man
manatwork
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
Sanchises
источник
Вы можете изменить 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? Я сомневаюсь в этом, но так как я не знаю, как добавить элементы в список, я не уверен.
Кевин Круйссен
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
nwellnhof
источник
69 байтов
Джо Кинг
3

Perl 5 -lF , 99 97 байт

-2 байта любезно предоставлены @NahuelFouilleul

%k=map{$_=>$F[$_]||$"}0..($m=<>)*($n=<>)-1;say+($p='#'x($n+1)),map"#
#"x!($i++%$n).$_,values%k,$p

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

Xcali
источник
($i++%$n==0)может быть изменено!($i++%$n)
Науэль Фуйе
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 приятно, обновляется!
каракули
3

Ява (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
};
Avi
источник
Хороший ответ! +1 от меня. Одна маленькая вещь для гольфа: .replaceAll("(.{"+n+"})","\n#$1#")может стать.replaceAll(".{"+n+"}","\n#$0#")
Кевин Круйссен
@KevinCruijssen Спасибо за улучшение :)
Ави
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.

flawr
источник
2
Умная! Моя попытка была 22 байта
Sanchises
2
@Sanchises Пойдите отправьте это так или иначе!
flawr
2

T-SQL 2017, 232 байта

Тестирование этого онлайн - старая версия sql-сервера, которая стоит другого персонажа. Я выложил более короткую версию.

Golfed:

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(@))

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

Ungolfed:

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(@))
t-clausen.dk
источник
2

С (лязг) , 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 в time () вызов // for (srand (time (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 
AZTECCO
источник
Предлагаю *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;
floorcat
@ceilingcat должно работать, но по некоторым причинам выдает неправильные результаты в последних 2 тестах
AZTECCO
1

Желе , 16 байт

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

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

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

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

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

Джонатан Аллан
источник