Napełnij miskę zupą alfabetyczną


24

Wydaje się, że nigdy nie mamy dość wyzwań związanych z alfabetem ...


Przepis

Dany

  • ciąg liter Si
  • dwie dodatnie liczby całkowite M, N,

utwórz zupę alfabetyczną z literami Szajmującymi losowe pozycje w prostokątnej misce o rozmiarze M× N, otoczonej nie alfabetycznym, spacji, która reprezentuje brzeg miski.

Pozycje nie używane przez litery powinny być wyświetlane jako spacje. Zobacz przykłady poniżej .

Zasady dodatkowe

  • Rozmiar M× Nodnosi się do wnętrza miski. Rozmiar wraz z obręczą wynosi M+2× N+2.
  • Każda postać z Spowinna pojawić się raz w misce, w innej pozycji ; to znaczy, jedna postać nie może zastąpić innej.
  • S może zawierać duplikaty . Na przykład, jeśli Sjest to sznurek 'abcc', zupa musi zawierać jeden a, jeden bi dwa c(wszystkie w różnych pozycjach).
  • Wejścia będą spełniać ograniczenia M >= 1 , N >= 1, 1 <= length(S) <= M*N.
  • Obrzeże miski może być dowolnym niealfabetycznym znakiem spacji , spójnym między przebiegami programu i wartościami wejściowymi.
  • Pozycje liter w misce są losowe, więc wynik może się różnić przy każdym uruchomieniu programu z tymi samymi danymi wejściowymi.
  • Biorąc pod uwagę dane wejściowe, każdy możliwy zestaw pozycji literowych powinien mieć niezerowe prawdopodobieństwo . Ponieważ nie można tego sprawdzić w kilku realizacjach programu, wyjaśnij, w jaki sposób twój kod to spełnia.
  • Dozwolone są wiodące lub końcowe białe znaki wokół obręczy.
  • Sbędą zawierać tylko wielkie litery. Jeśli chcesz, możesz wybrać tylko małe litery.
  • Wejścia i wyjścia są elastyczne jak zwykle. Na przykład wynikiem może być ciąg znaków z nowymi liniami, tablica znaków 2D lub lista linii.
  • Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.
  • Najkrótszy kod w bajtach wygrywa.

Przykłady

Dane wejściowe są pokazane jako S, [M N], gdzie Mjest liczbą wierszy i Nliczbą kolumn. Znak #jest używany do obręczy.

'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  #
###########################################


„Pozycje liter w misce są losowe, [...]” <- masz na myśli, że może być losowe, czy musi być losowe? I czy wszystkie linie mogą mieć tę samą liczbę znaków przez cały czas?
Ismael Miguel

@IsmaelMiguel Must . I każda konfiguracja musi mieć niezerowe prawdopodobieństwo wystąpienia (określone w wyzwaniu). To wyklucza podejście zawsze tej samej długości
Luis Mendo

Czy obręcz może być spójna między przebiegami programu i wartościami wejściowymi, ale może używać wielu liter innych niż litery, np. Rysując obramowanie grafiki ASCII |+-?
Adám

@ Adám Hm Powiem nie, to zbyt duża zmiana
Luis Mendo

Odpowiedzi:


13

05AB1E , 20 18 16 15 14 bajtów

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

Pobiera trzy dane wejściowe w kolejności: wysokość, szerokość, łańcuch. Wyjście jako dwuwymiarowa lista znaków.
Używa 8jako granicy, ale może być dowolną cyfrą.

-1 bajt dzięki @Grimy .

Wypróbuj online lub sprawdź wszystkie przypadki testowe . (TIO zawiera }}J»w stopce ładny wydruk wyniku; możesz go usunąć, aby wyświetlić rzeczywistą wyjściową listę znaków 2D).

Wyjaśnienie:

*               # 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 Właściwie to mówię wyzwanie 3 minuty temu. ;) To całkiem prosta implementacja. Spróbuję stąd zagrać w golfa.
Kevin Cruijssen

1
Bardzo miło, nie myślałem o tym *j! Oto 13 dla starszych lub brzydkie 14 dla nowoczesnych (generuje tablicę znaków 2D).
Grimmy,

1
@Grimy 13-bajtowy wydaje się nie działać 1,1,"O", więc myślę, że musi być również 14-bajtowy dla dziedzictwa. Dzięki za -1.
Kevin Cruijssen

7

APL (Dyalog Unicode) , 25 bajtów SBCS

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

Wypróbuj online!

-22 dzięki @ngn, -7 dzięki @ngn i @ Adám

Wyjaśnienie:

'#',∘⌽∘⍉⍣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 bajtów SBCS

Kąty obręczy są różnymi znakami

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

Wypróbuj online!

Użycie dfn do wyświetlenia tego pola.


29: '#',∘⌽∘⍉⍣4⊢⍴∘(?⍨∘≢⊃¨⊂)↑⍨∘(×/) Wypróbuj online!
Adám

28: {'#',∘⌽∘⍉⍣4⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}(lub zamiast >jeżeli ⎕io=1)
NGN

faktycznie, 27:'#',∘⌽∘⍉⍣4{⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}
ngn

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


6

Python 3 , 110 bajtów

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)]

Wypróbuj online!

Losuje za pomocą setzrozumienia i zwraca tablicę znaków 2D.


Ładne użycie zestawu rozumienia do losowania. +1. Ale twoje kody opierają się na nazwie „f” funkcji. Dlatego myślę, że rozwiązanie lambda jest nieprawidłowe ...
16:41

1
@agtoever Thanks! Ta funkcja nie jest rekurencyjna, więc może być anonimowa. Masz na myśli f'{s:{m*n}}'część? Ponieważ taka jest składnia sformatowanego łańcucha, który przypadkowo zaczyna się również od znaku f.
Jitse

3
Ten kod wydaje się naruszać PEP 8 na kilka sposobów.
Christofer Ohlsson

1
@ Christofer-Ohlsson absolutnie!
Jitse

2
@ChristoferOhlsson Witamy w świecie golfa kodowego, haha. ;) Brak jakichkolwiek komentarzy / dokumentów; zmienne / metody jednoznakowe bez żadnych (niepotrzebnych) spacji / znaków nowej linii; potencjalnie setki ostrzeżeń kompilatora, które po prostu ignorujemy; zwiększenie wydajności z O (log (N)) do O (N ^ N); itp. Jeśli można zaoszczędzić choćby jeden bajt, wszystko jest w porządku i jest całkowicie warte gry w golfa. ;)
Kevin Cruijssen

5

Bash + coreutils, 139 125 znaków

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

Przykładowy przebieg:

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

Wypróbuj online!

Bash + coreutils + pudełka, 97 znaków

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

Przykładowy przebieg:

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     *
*************

Wypróbuj online! (Częściowo, ponieważ boxesnie jest zainstalowany w TIO).



5

PowerShell , 163 111 93 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako $width, $hosiem, $string.

Konstruuje ciąg o #odpowiedniej $width, ciąg łączy to z pewnym obliczeniem, a następnie ten sam #ciąg ponownie. Obliczenia zaczynają się od pobrania $string wejściowego i zrobienia .padRig htdo idth $wo $hosiem długości (tj. Zrób ciąg wystarczająco długi, aby całkowicie zajął prostokątną przestrzeń. Następnie przekształcamy ten ciąg toCharArra yi sorttak dalej Random. To daje nam pomieszaną środkową część. Na koniec dzielimy -replaceje na równe części i $wotaczamy je kawałkami #s.

-52 dzięki inspiracji AZTECCO
-18 bajtów dzięki mazzy


Masz 2 x losowe (12), podczas gdy JS ma jeden, dodał spacje, aby wypełnić rozmiar M * N i posortował, po czym niestety nadal płacisz 21 za „$”
AZTECCO

1
@AZTECCO Dzięki za inspirację!
AdmBorkBork

Dzięki @mazzy - bardzo sprytne z -replacezamiast podziału i łączenia.
AdmBorkBork

4

JavaScript (ES7), 125 bajtów

Zwraca ciąg. Wykorzystuje 0jako znak ramki.

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

Wypróbuj online!

Skomentował

(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 (Dyalog Extended) , 23 bajty SBCS

Anonimowa ukryta funkcja poprawki. Przyjmuje [M,N]jako lewy argument i Sprawy argument.

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

Wypróbuj online!

×/⍛() Zastosuj następującą funkcję między argumentami, zastępując lewy argument jego produktem:

 weź M× Nznaki z S, dopełnienie spacjami po prawej stronie

 zmień kolejność w następującej kolejności:

?⍨⍤ przetasowane indeksy od 1 do…
 lewy argument ( M× N)

R eshape że w następujący kształt:

 lewy argument (tj. Mwiersze i Nkolumny)

'#'⍣4 Zastosuj następującą funkcję cztery razy, za każdym razem ze znakiem krzyżyka jako lewym argumentem:
∘⍉ transponuj prawy argument
∘⌽ dubluj prawy argument
,łącząc kolumnę skrótów z lewą stroną tego


4

PHP 7.4, 107 99 94 znaków

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

Dzięki:

  • Ismael Miguel za przypomnienie mi o funkcjach strzałek PHP 7.4 (-10 znaków)
  • Night2 dla skutecznego odwracania konkatenacji i join()(-8 znaków)
  • Night2 za pokazanie, jak korzystać chunk_split()„s $endparametr (-5 znaków)

Wypróbuj online!

PHP 7.3, 117 112 108 znaków

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

Dzięki:

  • Night2 dla skutecznego odwracania konkatenacji i join()(-5 znaków)
  • Night2 za pokazanie, jak korzystać chunk_split()„s $endparametr (-4 znaków)

Przykładowy przebieg:

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     _
_____________

Wypróbuj online!


1
Uważam, że 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";powinno to działać w PHP 7.4 ( wiki.php.net/rfc/arrow_functions_v2 ) i wydano wersję Canditate ( wiki.php.net/todo/php74 ), więc jest to dostępny „kompilator”, który przyszedł przed tym wyzwaniem i każdy może go użyć.
Ismael Miguel

1
Doh, masz rację. Czytaj o, ale zapomniałem. (Uwaga do siebie: następnym razem nie tylko czytać Night2 „s wskazówka upvote to też może pomaga pamiętać..)
manatwork


1
Dziękuję, @ ​​Night2. Nie mogę sobie wyobrazić tego, co zawiodłem wczoraj, gdy próbowałem przenieść więcej rzeczy wewnątrz join(), ale nie udało mi się zmniejszyć rozmiaru. ☹
manatwork

1
Dostałem jeszcze krótszy przy użyciu chunk_split: 94 bajtów Usunąłem również ostatni średnik, ponieważ uważam, że nie jest potrzebny, napisałeś funkcję, więc kod, który przypisze ją do zmiennej, nie powinien się liczyć.
Noc 2

3

MATL , 22 19 bajtów

tZ"ibpyn&Z@(TT35&Ya

Wypróbuj online!

Dzięki @LuisMendo za zapisanie 3 bajtów, więc teraz ma tę samą liczbę bajtów, co odpowiedź @ flawr , ale wystarczająco różni się, by mimo to wysłać . Omówienie agorithm wysokiego poziomu:

 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

Można zmienić Z}&Oprzez Z", a także pozwala usunąć ostatecznac
Luis Mendo

@LuisMendo Och, to bardzo pomaga! Pomyśl o tym, powinienem był przynajmniej to zrobić 1$O.
Sanchises

3

Ruby , 121 bajtów

Tworzy miskę, odpytuje indeksy wszystkich spacji w misce, pobiera próbki spacji równych rozmiarowi łańcucha i wypełnia je. sampleNie zwraca posortowanej listy, więc nie ma potrzeby tasowania. Wyszukiwanie indeksów do 9*m*n(który prawie na pewno wykracza poza zakres) nadal będzie zawierać wszystkie spacje i jest o 1 bajt krótszy niż 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}

Wypróbuj online!


3

Czerwony , 120 116 114 112 bajtów

-2 bajty dzięki @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]

Wypróbuj online!


2
-2 bajty poprzez pozbycie się + 1i użycie to"""00"0 nzamiast tego.
Kevin Cruijssen

1
@KevinCruijssen Thanks! Zastąpiłem go copy, dla tej samej liczby bajtów.
Galen Iwanow

1
To rzeczywiście wygląda na nieco czystsze! Nie znam Reda, z wyjątkiem odpowiedzi, które widziałem od ciebie, więc po prostu trochę się bawiłem. ;) Czy umieszczenie tlinii jako wiodącego / końcowego elementu przed zapętleniem, aby zaoszczędzić na dwóch luzach, print tbyłoby krótsze? Wątpię, ale ponieważ nie wiem, jak dodać elementy do listy, nie jestem pewien.
Kevin Cruijssen

3

Perl 6 , 74 67 bajtów

-5 bajtów dzięki Jo King

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

Wypróbuj online!

Wyjaśnienie

{                                                                 }
                                         ^$^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

Perl 5 -lF , 99 97 bajtów

-2 bajty dzięki uprzejmości @NahuelFouilleul

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

Wypróbuj online!


($i++%$n==0)może zostać zmieniony przez!($i++%$n)
Nahuel Fouilleul

3

k4, 32 28 bajtów

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

edycja: -4 dzięki Galenowi Iwanowowi!

nazywany jak

f["hey";3 3]

wyjaśnienie:

                 (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
Myślę, że możesz zaoszczędzić trochę bajtów, jeśli dodasz tylko #na końcu każdej linii i transponujesz / odwrócisz 4 razy, coś takiego .
Galen Iwanow

1
@GalenIvanov ładne, zaktualizowane!
bazgroły

3

Java (JDK) , 180 178 bajtów

Ani jednego dodatkowego importu:

(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#");}

Wypróbuj online!

Walka o grę w golfa była dość trudna. W szczególności import związany z metodami Collect.shuffle () / Arrays był zbyt duży, aby go zaakceptować, więc musiałem stworzyć własny algorytm tasowania ciągów (prawdopodobnie nie wydajny ani jednolicie rozproszony). Ogromne podziękowania dla Stevena za udowodnienie, że algorytm może wygenerować dowolny zestaw pozycji .

Sformatowane (z wyjaśnieniem):

(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
};

Niezła odpowiedź! +1 ode mnie Jedna mała rzecz do golfa: .replaceAll("(.{"+n+"})","\n#$1#")może zostać.replaceAll(".{"+n+"}","\n#$0#")
Kevin Cruijssen

@KevinCruijssen Dzięki za poprawę :)
Avi

2

Węgiel drzewny , 27 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe w szerokości, wysokości, łańcuchu zamówienia. Wyjaśnienie:

NθNη

Wprowadź szerokość i wysokość.

↖B⁺²θ⁺²η#

Ustaw miskę.

FS«

Pętla nad znakami w ciągu.

W℅KKJ‽θ‽η

Skocz do losowej pozycji w misce, aż znajdziesz puste miejsce.

Pι

Wydrukuj bieżący znak bez poruszania kursorem.


Czy to Move(:UpLeft)konieczne? Bez niego działa dobrze, ale może dodałeś go z powodu, o którym nie myślę?
Kevin Cruijssen

1
@KevinCruijssen Bez niego nigdy nie byłbym w stanie pisać liter w dolnym rzędzie lub skrajnej prawej kolumnie.
Neil

Ach, więc o to chodziło. To wyjaśnia, dzięki!
Kevin Cruijssen

2

Japt -R , 21 18 bajtów

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

Spróbuj

ú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 bajtów

pZ@iy~hw)1GeTT35&Ya

Wypróbuj online!

Dzięki @LuisMendo za -8 bajtów!

Objaśnienie: poblicza liczbę zup-pikseli. Następnie Z@tworzy losową permutację wielkości liczby pikseli zupy. Użyjemy tego jako indeksów, do iy~hktórych należy ciąg wejściowy z dodaną wystarczającą ilością spacji. w)zamienia oba i indeksuje jeden z drugim. Następnie przekształcamy 1Gekształt do pożądanego prostokąta i #-padamy go za pomocą TT35&Ya.


2
Sprytny! Moja próba miała 22 bajty
Sanchises

2
@ Sanchises Go i tak opublikuj!
flawr

2

T-SQL 2017, 232 bajty

Testowanie tego online jest starszą wersją serwera SQL, która kosztuje inną postać. Zamieściłem krótszą wersję.

Gra w golfa:

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

Wypróbuj online

Nie golfowany:

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 (clang) , 169 164 162 160 bajtów

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);}

Wypróbuj online!

-2 wprowadzenie a = o w time () wywołanie // for (srand (time (a = o));; ...

Zapisano 7 Sugestia @ceilingcat do użycia - ~ zmienna i automatyczne przechowywanie dla ciągu o oraz wiele ulepszeń.

Degolf:

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 

Zaproponuj *a=--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(;zamiast--i;)*a++=i%m?-~i%m<3|i<m|i>m*n?35:32:10;for(*a=0;
ceilingcat

@ceilingcat powinien działać, ale z jakiegoś powodu daje zły wynik w 2 ostatnich testowych przypadkach
AZTECCO


1

Galaretka , 16 bajtów

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

Dyadyczny link akceptujący listę liczb całkowitych, [M, N]po lewej stronie i listę znaków S, po prawej stronie, która daje listę list znaków, linii. Używa znaku tyldy ~jako granicy.

Wypróbuj online!

Wszystkie możliwe wyniki mają niezerową szansę na uzyskanie, ponieważ tasujemy ( ) listę znaków Swraz z odpowiednią liczbą spacji.

Kod Ṿ€«”~ZƊ⁺zapisuje bajt, który, jak sądzę, byłby wymagany do dołączenia do znaku nowej linii, który pełne programy wykorzystujące liczbę całkowitą taką jak zero musiałyby zastosować (np. P⁶ẋaẊs⁸Ṫ;€0ZUƊ4¡YLub P⁶ẋaẊs⁸Ṫj@€Ø0Z$⁺Y). Może istnieje sposób, aby zaoszczędzić więcej ...?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.