알파벳 수프로 그릇을 채우십시오


24

우리는 것 결코 얻을 피곤 알파벳 관련 문제의 ...


조리법

주어진

  • 문자의 문자열 S
  • 이 양 개의 정수 M, N,

의 문자 알파벳 수프 생산 S점유하는 임의의 위치 A의 직사각형 그릇 크기 M× N, 액자 그릇의 테두리를 나타내는 알파벳이 아닌, 공백이 아닌 문자를.

문자로 사용하지 않는 위치는 공백으로 표시해야합니다. 아래 예를 참조하십시오 .

중재 규칙

  • 크기 M× N는 그릇 의 내부 를 나타냅니다 . 림을 포함한 크기는 M+2× N+2입니다.
  • 의 각 캐릭터 는 다른 위치 에 그릇에 한 번S 나타나야합니다 . 즉, 한 문자가 다른 문자를 덮어 쓸 수 없습니다.
  • S 중복이 포함될 수 있습니다 . 예를 들어, S문자열 'abcc'인 경우 수프에는 1 a, 1 b및 2 c(모두 다른 위치에 있음)가 있어야합니다 .
  • 입력은 만족 제한을 M >= 1 , N >= 1, 1 <= length(S) <= M*N.
  • 보울의 림은 프로그램 실행 및 입력 값에서 일관된 비 알파벳, 비 공백 문자 일 수 있습니다.
  • 보울의 글자 위치는 임의적이므로 동일한 입력으로 프로그램을 실행할 때마다 결과가 다를 수 있습니다.
  • 입력이 주어지면, 가능한 모든 문자 위치 세트는 0이 아닌 확률을 가져야합니다 . 프로그램의 몇 가지 실현으로 확인할 수 없으므로 코드가이를 어떻게 수행하는지 설명하십시오.
  • 림 주변의 선행 또는 후행 공백 이 허용됩니다.
  • S대문자 만 포함합니다 . 원하는 경우 소문자 만 선택할 수 있습니다 .
  • 입력과 출력은 평소처럼 유연 합니다. 예를 들어, 출력은 개행 문자가 포함 된 문자열, 2D 문자 배열 또는 행 목록 일 수 있습니다.
  • 모든 프로그래밍 언어의 프로그램 또는 기능 이 허용 됩니다 . 표준 허점 은 금지되어 있습니다.
  • 바이트 단위의 가장 짧은 코드가 이깁니다.

입력은로 표시되며 S, [M N]여기서 MN수는 열 수입니다. 캐릭터 #는 림에 사용됩니다.

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


무슨 뜻이야 - < "그릇에 문자 위치는 무작위, [...] 있습니다" 무작위 또는 있어야 랜덤? 그리고 모든 줄에 항상 같은 수의 문자를 사용할 수 있습니까?
Ismael Miguel

@IsmaelMiguel 머스트 . 그리고 모든 구성에는 0이 아닌 확률이 있어야합니다 (챌린지에 설명되어 있음). 그래서 항상 같은 길이의 접근을 배제합니다
Luis Mendo

림이 프로그램 실행 및 입력 값에서 일관 될 수 있지만 문자가 아닌 ASCII 테두리를 그리는 등 여러 문자가 아닌 문자를 사용할 수 있습니다 |+-.
Adám

@ Adám Hm 아니오라고 말할 것입니다. 너무 큰 변화입니다
Luis Mendo

답변:


13

05AB1E , 20 18 16 15 14 바이트

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

높이, 너비, 문자열의 순서로 세 가지 입력을받습니다. 2D 문자 목록으로 출력합니다. 테두리로
사용 8하지만 모든 숫자가 될 수 있습니다.

@Grimy 덕분에 -1 바이트 .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 . (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 분 전에 도전을합니다. ;) 꽤 간단한 구현입니다. 여기부터 골프를 치려고합니다.
Kevin Cruijssen

1
아주 좋은, 나는 생각하지 않았다 *j! 레거시 의 경우 13 , 현대의 경우 못생긴 14 입니다 (2D 문자 배열 출력).
그리미

1
@Grimy 13 바이트는 입력에 실패하는 것 같으 1,1,"O"므로 레거시에서도 14 바이트이어야한다고 생각합니다. 그래도 -1 주셔서 감사합니다.
Kevin Cruijssen

7

APL (Dyalog Unicode) , 25 바이트 SBCS

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

온라인으로 사용해보십시오!

@ngn 덕분에 -22, @ngn 및 @ Adám 덕분에 -7

설명:

'#',∘⌽∘⍉⍣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⊢⍴∘(?⍨∘≢⊃¨⊂)↑⍨∘(×/) 온라인으로 해보십시오!
Adám

28 : {'#',∘⌽∘⍉⍣4⊢⍵⍴⍺\⍨(≢⍺)>?⍨×/⍵}(또는 if 대신 )>⎕io=1
ngn

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

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


6

파이썬 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이해 를 사용하여 무작위 화 하고 2D 문자 배열을 리턴합니다.


무작위로 설정 이해력을 잘 사용합니다. +1. 그러나 코드는 함수의 이름 'f'에 의존합니다. 따라서 람다 솔루션이 유효하지 않다고 생각합니다.
agtoever

1
@agtoever 감사합니다! 이 함수는 재귀 적이 지 않으므로 익명 일 수 있습니다. 그 f'{s:{m*n}}'부분 을 언급하고 있습니까? 그것이 형식화 된 문자열의 구문이기 때문에 우연히는로 시작합니다 f.
Jitse

3
이 코드는 여러 가지 방법으로 PEP 8을 위반 한 것으로 보입니다.
Christofer Ohlsson

1
@ Christofer-Ohlsson은 절대적으로!
Jitse

2
@ChristoferOhlsson 코드 골프의 세계, 하하에 오신 것을 환영합니다. ;) 의견 / 문서가 없습니다. (필요하지 않은) 공백 / 줄 바꾸기가없는 단일 문자 변수 / 방법; 잠재적으로 수백 가지의 컴파일러 경고가 무시됩니다. O (log (N))에서 O (N ^ N)으로 성능 향상; 단일 바이트조차도 저장할 수 있다면 코드 골프에 적합합니다. ;)
Kevin Cruijssen

5

배쉬 +로 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@
@@@@@@@@@@@@@

온라인으로 사용해보십시오!

배쉬 + 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     *
*************

온라인으로 사용해보십시오! ( boxesTIO에 설치되지 않은 부분 )



5

PowerShell을 , 163 (111) 93 바이트

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

온라인으로 사용해보십시오!

입력을 $width, $height, $string 으로 취합니다 .

#적절한 $width 의 문자열을 생성 하고 , 문자열 결합하여 계산을 수행 한 다음 동일한 #문자열을 다시 생성합니다. 입력을 복용 계산이 시작 $s.padRig을 트링하고, 일을 ht받는 최대 $w로 IDþ $h팔 개 길이 (즉, 우리는 그 문자열로 변환. 충분히 완전히 직사각형 공간을 차지하기 위해 문자열을 toCharArra을 y, 그리고 sort그것을 RandomLY. 즉 제공 마지막으로, 우리는 -replace그것을 동일한 $width 덩어리로 나누고 , 그 덩어리를 #s로 둘러 쌉니다 .

AZTECCO의 영감 덕분에 -52 mazzy
덕분에 -18 바이트


당신은이 2 개 임의 (12) JS 하나를 가지고있는 동안 당신은 여전히 불행하게도 '$'21를 지불 그 후, 그는, M * N 크기를 채우기 위해 공간을 추가 및 분류
AZTECCO

1
@AZTECCO 영감을 주셔서 감사합니다!
AdmBorkBork

@mazzy에게 감사드립니다- -replace분할하고 결합 하는 대신 매우 영리합니다 .
AdmBorkBork

4

자바 스크립트 (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 (Dyalog Extended) , 23 바이트 SBCS

익명의 암묵적 삽입 기능. 소요 [M,N]왼쪽 인수로 및 S오른쪽 인자로.

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

온라인으로 사용해보십시오!

×/⍛() 왼쪽 인수를 제품으로 대체하여 인수 사이에 다음 기능을 적용하십시오.

오른쪽에서 공백으로 채워서 에서 M× N문자를  가져 S옵니다.

 다음 순서로 재정렬하십시오.

?⍨⍤ 셔플 된 인덱스 1
 에서 왼쪽 인수 ( M× N)

R 다음과 같은 형태로 그 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 자)을 상기시켜주는 Ismael Miguel
  • 연결과 join()(-8 문자) 를 효율적으로 되돌릴 수있는 Night2
  • chunk_split()$end매개 변수 사용 방법을 보여주는 Night2 (-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._;}

덕분에 :

  • 연결 및 join()(-5 자) 를 효율적으로 되돌릴 수있는 Night2
  • chunk_split()$end매개 변수 사용 방법을 보여주는 Night2 (-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 ) 및 릴리스 canditate는 (출시되었습니다 wiki.php.net/todo/php74를 , 그래서 그것을 온 가능한 "컴파일러"입니다) 이 도전 전에, 누구나 사용할 수 있습니다.
Ismael Miguel

1
Doh, 네 말이 맞아 읽었지만 잊었다. (나 자신에게 참고 : 다음 번에 Night2팁을 읽지 말고 그것을
찬성


1
@ Night2 감사합니다. 어제 엉망이 된 것을 상상할 수 없습니다. 내에서 더 많은 물건을 옮기려고 시도했지만 join()크기를 줄이는 데 실패했습니다. ☹
manatwork

1
chunk_split: 94 바이트를 사용하여 더 짧은 것을 얻었습니다 . 필요하지 않다고 생각하여 마지막 세미콜론도 제거했습니다. 함수를 작성 했으므로 변수에 할당 할 코드는 계산하지 않아야합니다.
18:57의

3

MATL , 22 19 바이트

tZ"ibpyn&Z@(TT35&Ya

온라인으로 사용해보십시오!

3 바이트를 저장해 준 @LuisMendo에게 감사드립니다. 이제 @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
Luis Mendo

@LuisMendo 아 그거 많이 도와 줘! 생각해 보니, 적어도해야만 했어 1$O.
Sanchises

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 바이트

@Kevin Cruijssen 덕분에 -2 바이트!

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
제거 + 1하고 to"""00"0 n대신 사용하여 -2 바이트 .
Kevin Cruijssen

1
@KevinCruijssen 감사합니다! copy동일한 바이트 수를 위해 로 대체했습니다 .
Galen Ivanov

1
그것은 실제로 조금 더 깨끗해 보인다! 나는 당신에게서 본 답을 제외하고는 빨간색을 모른다. 그래서 나는 조금 주위를 어슬렁 거리고 있었다. ;) 두 t줄을 절약하기 위해 루핑하기 전에 줄을 선행 / 트레일 링 항목으로 설정하는 print t것이 더 짧습니까? 의심하지만 목록에 항목을 추가하는 방법을 모르기 때문에 확실하지 않습니다.
Kevin Cruijssen

3

펄 6 , 74 67 바이트

Jo King 덕분에 -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}

편집 : Galen Ivanov에게 -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 회, 역 같은 것을 .
Galen Ivanov

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 메서드와 관련된 가져 오기가 너무 받아 들여서 자체 문자열 셔플 링 알고리즘을 만들어야했습니다 (아마도 효율적이거나 균일하게 분산되지 않음). 알고리즘에서 모든 위치 세트를 생성 할 수 있음입증 한 Steven에게 큰 감사를드립니다 .

형식화 (설명 포함) :

(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#")
Kevin Cruijssen

@KevinCruijssen 개선에 감사드립니다 :)
Avi

2

, 27 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 순서 너비, 높이, 문자열로 입력을받습니다. 설명:

NθNη

너비와 높이를 입력하십시오.

↖B⁺²θ⁺²η#

그릇을 프레임.

FS«

문자열의 문자를 반복합니다.

W℅KKJ‽θ‽η

빈 자리가 발견 될 때까지 그릇의 임의의 위치로 이동하십시오.

Pι

커서를 움직이지 않고 현재 문자를 인쇄합니다.


그게 Move(:UpLeft)필요한가요? 그것 없이는 잘 작동하지만 어쩌면 내가 생각하지 않는 이유로 추가 했습니까?
Kevin Cruijssen

1
@KevinCruijssen 그것 없이는 맨 아래 줄이나 맨 오른쪽 열에 글자를 쓸 수 없습니다.

아, 그렇습니다. 감사합니다!
Kevin Cruijssen

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

온라인으로 사용해보십시오!

-8 바이트를위한 @LuisMendo에게 감사합니다!

설명 : p수프 픽셀 수를 계산합니다. 그런 다음 Z@수프 픽셀 수의 임의 순열을 생성합니다. iy~h충분한 공백이 추가 된 입력 문자열 인 인덱스로 이것을 사용합니다 . w)둘을 교환하고 하나를 다른 것으로 색인합니다. 그런 다음 1Ge도형을 원하는 사각형으로 모양을 #바꾸고을 사용하여 채 웁니다 TT35&Ya.


2
영리한! 나의 시도는 22 바이트
13시 48 분에 Sanchises

2
@Sanchises 어쨌든 게시하십시오!
flawr

2

T-SQL 2017, 232 바이트

이 온라인 테스트는 다른 문자를 사용하는 이전 버전의 sql-server입니다. 더 짧은 버전을 게시했습니다.

골프 :

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 in time () call // for (srand (time (a = o)); ...

7 개의 @ceilingcat 제안을 저장하여 문자열 o에-~ variable 및 자동 스토리지를 사용하고 여러 가지 개선 사항을 적용했습니다.

데 고프 :

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;
ceilingcat

그것은 작동해야하지만 어떤 이유로 지난 2 테스트 케이스에 잘못된 출력을 제공 @ceilingcat
AZTECCO


1

젤리 , 16 바이트

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

[M, N]왼쪽에 정수 목록 ()과 문자 목록 ()을 허용하는 2 진 링크 S는 오른쪽에 문자 목록, 행을 표시합니다. 물결표 문자 ( ~)를 테두리로 사용합니다 .

온라인으로 사용해보십시오!

가능한 모든 출력은 0 의 문자 목록을 섞기 때문에 0이 아닌 확률 로 나타납니다.S적절한 수의 공백과 함께 .

이 코드 Ṿ€«”~ZƊ⁺는 0과 같은 정수를 사용하는 전체 프로그램이 채택 해야하는 개행과 결합해야 할 것으로 생각되는 바이트를 저장합니다 (예 : P⁶ẋaẊs⁸Ṫ;€0ZUƊ4¡Y또는 P⁶ẋaẊs⁸Ṫj@€Ø0Z$⁺Y). 더 많이 절약 할 수있는 방법이 있을까요?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.