줄의 문자가 빙글 빙글 돌다


23

( PhiNotPi의 프랙탈 라인 챌린지 초기 초안에서 영감을 얻었습니다 .)

인쇄 가능한 ASCII 문자 로 구성된 너비 W > 1, 높이 H > 1및 문자열 이 제공 2(W+H-2)됩니다. 이 문자열을 왼쪽 위 모서리에서 시작하여 시계 방향으로 주어진 너비와 높이의 사각형으로 감싸서 인쇄합니다. 사각형의 내부는 공백으로 채워져 있습니다. 테스트 사례를 통해이를 분명히 알 수 있습니다.

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 결과를 STDOUT (또는 가장 가까운 대안)에 인쇄하거나 문자열로 리턴하여 프로그램 또는 함수를 작성할 수 있습니다.

선행 또는 후행 공백이 없어야합니다 (입력 문자열에있을 수있는 공백 제외). 선택적으로 단일 후행 줄 바꿈을 출력 할 수 있습니다.

이것은 코드 골프이므로 가장 짧은 제출 (바이트)이 이깁니다.

테스트 사례

각 테스트 사례 "String" W H에는 예상 출력 이 뒤 따릅니다.

"Hello, World! "
5 4
Hello
    ,
!    
dlroW

"+--+|||+--+|||"
4 5
+--+
|  |
|  |
|  |
+--+

">v<^"
2 2
>v
^<

"rock beats scissors beats paper beats "
11 10
rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 

Note that the following string contains an escaped '"'.
"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
46 3
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~                                            O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes


8
당신의 리더 보드는 너무 시원합니다.
Alex A.

2
리더 보드 스크립트를 골프로 했습니까?
mbomb007

2
@ mbomb007 아니요, 축소기를 통해 코드를 실행 했으므로 확장 할 때 많은 공간을 차지하지 않습니다. (줄 바꿈을 제거하는 것으로 충분했을 것입니다.) 여전히 하드 드라이브에 축소되지 않은 버전이 있습니다.
Martin Ender

2
이 이름을 "String Go Round and Round의 Chars"로 바꾸면 노래의 리듬에 더 잘 맞습니다.
Justin

답변:


9

CJam, 27 바이트

Nl~:L/(os\2-{)L2-S*@(N@}*W%

나는 실제로 CJam은 아니지만 이것이 Martin을 능가한다고 생각합니다. 가장 큰 차이점은 입력 읽기 전에 줄 바꿈 누르고 첫 번째 줄을 즉시 인쇄하여 높이를 저장할 필요 가 없다는 것 입니다.

순서대로 입력을받습니다

H "String" W

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


10

파이썬 2, 95 바이트

s,m,n=input()
print s[:n]
for i in range(m-2):print s[~i]+' '*(n-2)+s[n+i]
print s[1-m::-1][:n]

첫 번째 줄, 두 개의 세로 줄, 마지막 줄을 인쇄합니다.

print세 번 쓰는 것보다 짧은 것이 있어야 하지만 변수에 저장하여 지금까지 시도한 모든 '\n'.join것이 더 길었습니다.


Python 3으로 전환하여 변수에 인쇄를 저장할 수 있습니다.
Omar

1
@Omar eval입력 에 사용 하고 인쇄 문을 대괄호로 묶어야하므로 더 길어집니다 .
FryAmTheEggman

아, 나는 eval고려 하지 않았다 ! print파이썬 2에서는 그 뒤에 공백이 필요하기 때문에 괄호는 큰 문제가되어서는 안됩니다 . 에서 계속하면 3자를 절약 print blah할 수 p(blah)있습니다.
Omar

9

CJam, 31 30 바이트

Optimizer의 주장에 따르면, 여기 내 시도가 있습니다. 나는 내 자신의 도전을이기는 팬이 아니므로 APL 가족 (또는 CJam에서 더 나은 사람)을 이길 것입니다. ;)

l~:H;:V/(N@s{)V2-S*@(N@}H2-*W%

질문에 주어진 순서대로 입력을받습니다 :

"Hello, World! " 5 4

여기에서 테스트하십시오.

Optimizer 덕분에 1 바이트가 절약되었습니다.

설명

원래, 나는 사각형의 사각형으로 시작한 다음 문자 그대로 전체 그리드를 네 번 회전하면서 문자열을 감싸는 것에 대한 좋은 아이디어를 얻었습니다. 그러나 너비 또는 높이 또는 둘 다 인 경우 작동하지 않는 것 같습니다 2. 그래서 순진한 접근 방식 (인쇄 상단, 측면 루프, 하단 인쇄)을 시도했지만 놀랍게도 실제로는 짧았습니다.

l~                             "Read and evaluate the input.";
  :H;                          "Store the height in H and discard it.";
     :V/                       "Store the width in V and split the input into chunks of size V.";
        (N                     "Slice off the first such chunk and push a newline.";
          @s                   "Pull up the other chunks and join them back together.";
            {          }H2-*   "Repeat this block H-2 times, printing the sides.";
             )                 "Slice off the last character of the string.";
              V2-S*            "Push V-2 spaces.";
                   @(          "Pull up the remaining string and slice off the first character.";
                     N@        "Push a newline and pull up the remaining string.";
                            W% "Reverse the remainder of the string, which is the bottom row.";

문자열의 길이를 구할 수 있고 V가 있으므로 H를 저장할 필요가 없습니다. V 문자 만 남을 때까지 블록을 반복하십시오. l~;:V/(N@s{)V2-S*@(N@_,V-}gW%1 문자를 저장합니다.
DocMax

@DocMax 불행히도, 그것은 높이 2에서는 작동하지 않습니다. 좋은 아이디어이지만, 어떻게 든 다른 방법으로 사용할 수 있는지 살펴볼 것입니다.
Martin Ender

도! 당신은 심지어 H = 2 문제 에 대해 언급 했지만 나는 여전히 그것에 대해 경계하는 것을 잊었습니다.
DocMax

9

피스, 47 46 45 40 37 36 바이트

이것은 Pyth에서 구현 된 명백한 접근법입니다. 인덱싱하여 첫 번째 줄을 인쇄합니다.0:width 한 다음 중간, 끝을 .

을 사용 z하고 Q두 개의 입력 을 사용 하고 팁을 사용하는 @Jakube에게 감사드립니다 p.

AkYQ<zkV-Y2p*d-k2@zt_N@z+kN;<_<z-2Yk

stdin에서 입력을 문자열과 치수의 튜플로 가져옵니다.

Hello, World! 
5, 4

그리고 stdout에 씁니다.

여기에서 시도하십시오 .

A              Double assignment
 kY            The vars k and Y
 Q             The dimension tuple
<zk            Prints out first line by doing z[:width]
V-Y2           For N in height-2
 p             Print out everything
  *d           Repeat " "
   -k2         Width-2 times
  @z           Index z
   -_N1        At index -N-1
  @z           Index z
   +kN         At index k+N
;              Close out loop
<_<z-2Yk       Print last line

z문자열을 읽는 데 사용 하면 많은 문자가 절약됩니다. 또한 t_N같은 것 -_N1입니다.
Jakube

우리의 접근 방식으로 37자를 사용할 수 있습니다.
Jakube

팁에 대한 @Jakube 감사합니다!
Maltysen

한 번 더 문자 절약. 대신 ++사용 p하고 스위치 zt_N와 함께 *d-k2.
Jakube

5

J, 61 바이트

방법:

(height-2)*(width-2)공백 블록 에서 시작 하여 문자열 끝에서 필요한 양의 문자를 가져 와서 현재 블록에 추가합니다. 우리는 이것을 4 번 반복합니다. 삽화가 총 5 주 'Hello, World! ' 5 4예 (공백으로 치환 X가독성 S)

XXX   !_   orld   ,_W   Hello
XXX   XX   XXX!   XXo   _XXX,
      XX   XXX_   XXr   !XXX_
      XX          XXl   dlroW
                  _!d   

코드:

4 :'|:>{:((}.~{:@$);({.~{:@$)|.@|:@,])&>/^:4(|.x);'' ''$~y-2'

명시 적 함수 정의. two-operand 함수는 문자열을 왼쪽 인수로 사용하고 두 정수 목록을 오른쪽 인수로 사용합니다.

사용법 예 :

   wrap_on=.4 :'|:>{:((}.~{:@$);({.~{:@$)|.@|:@,])&>/^:4(|.x);'' ''$~y-2'

   'Hello, World! ' wrap_on 5 4
Hello
    ,
!    
dlroW

   '>v<^' wrap_on 2 2
>v
^<

여기에서 온라인으로 사용해보십시오.


와우, 이것이 J의 너비와 높이 2에서 작동한다는 것에 깊은 인상을 받았습니다.
Martin Ender

4

피스, 38 37

AGHQ<zGFNC,_>z_ttH>zGj*dttGN)<>_zttHG

나는 원래 38 가지 해결책을 가지고 있었지만 기본적으로 Maltysen의 대답에 대한 골프 해결책이었습니다. 그래서 나는 조금 다르게 가기로 결정했습니다.

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

              implicit: z=string from input, Q=pair of numbers from input
AGHQ          G=Q[0] (width), H=Q[1] (height)
<zG           print z[:G]
    _>z_ttH     last H-2 chars reversed
    >zG         all chars from the Gth position to end
  C,           zip these 2 strings to pairs
FN            for each pair N:
  j*dttGN       seperate the two chars by (G-2) spaces and print
)             end for
<>_zttHG     print last line z[::-1][H-2:][:G]

_>z_ttH와 같습니다 <_zttH.
isaacg 2016 년

@isaacg Thanks, Maltysen의 답변과 비슷한 것을 이미 보았습니다.
Jakube

4

자바 스크립트 (ES6), 110 115

문자열을 반환하는 3 개의 매개 변수가있는 함수

F=(s,w,h,q=h+(w-=2),t=b='')=>
[for(c of s)q?t+=q<h?c+'\n'+s[w+h+w+q--]+' '.repeat(q&&w):(b+=s[w+q--],c):q]
&&t+b

Chrome 버전 119 : 기능의 짧은 형식이 없으며 기본 매개 변수가 없습니다. for(of)지원 되더라도 사용할 이유가 없습니다.

function F(s,w,h){
  for(q=h+(w-=2),t=b=i='';
      q;
      q<h?t+='\n'+s[w+h+w+q--]+' '.repeat(q&&w):b+=s[w+q--])
    t+=s[i++];
  return t+b
}

ES5 버전 126 : for (of) 없음, 문자열 없음

function F(s,w,h){
  for(q=h+(w-=2),t=b=i='';
      q;
      q<h?t+='\n'+s[w+h+w+q--]+Array(q&&-~w).join(' '):b+=s[w+q--])
    t+=s[i++];
  return t+b
}

언 골프

F=(s,w,h)=>
{
  var q = h+(w-=2), // middle length 
      t = '', // top and body
      b = ''; // bottom row
  for(c of s)
    if (q > 0)
    {
      if (q < h)
      {
        t += c+'\n'; // right side, straight
        t += s[w+h+w+q]; // left side, backwards 
        if (q > 1) // body fill, except for the last line
          t += ' '.repeat(w)
      }
      else
      {
        t+=c, // top, straight
        b+=s[w+q] // bottom, backwards
      }
      --q
    }
  return t+b

Firefox / FireBug 콘솔에서 테스트

;[["Hello, World! ", 5, 4],["+--+|||+--+|||",4,5],[">v<^",2,2]
,["rock beats scissors beats paper beats ",11,10]
,["!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",46,3]]
.forEach(test => console.log(F(...test)))

산출

Hello
    ,
!    
dlroW

+--+
|  |
|  |
|  |
+--+

>v
^<

rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~                                            O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP

3

파이썬 2, 97 바이트

def f(s,w,h):print s[:w];i=0;exec'print s[~i]+" "*(w-2)+s[w+i];i+=1;'*(h-2);print s[1-h:w+h-3:-1]

직접 접근.


3

하스켈, 164156 바이트

import Data.List
r=replicate
p w h(s:t)=unlines$fst$n$n$n$n(r h$r w ' ',(w,h,s:t++[s]))
n(_:b,(w,h,s))=(transpose$map reverse$(take w s):b,(h,w,drop(w-1)s))

이 함수 p는 출력을 인쇄하지 않지만 문자열로 반환합니다 (예 : p 4 5 "+--+|||+--+|||"->) "+--+\n| |\n| |\n| |\n+--+\n". 더 나은 디스플레이 사용을 위해 putStr:

putStr $ p 4 5 "+--+|||+--+|||"

+--+
|  |
|  |
|  |
+--+

작동 방식 : wx h블록의 공백을 만들고 첫 번째 줄을 입력 문자열의 시작 부분으로 바꿉니다. 그런 다음 블록을 시계 반대 방향으로 돌리고 첫 번째 줄을 세 번 더 반복하여 반복하십시오.

4 번 턴 후 첫 번째 문자가 다시 잘리지 않도록 시작하기 전에 입력 문자열에 추가합니다.

"Hello World" example, 5 x 4


         |  Start               Turn #1          Turn #2     Turn #3   Turn #4
---------+--------------------------------------------------------------------
String   |  "Hello, World! H"   "o, World! H"    "World! H"  "d! H"    ""
left     | 
         |
Block    |  <empty>             Hello            o, W        World     d! H
before   |                                       l                     l  e
rotating |                                       l           ,         r  l
         |                                       e           olleH     o  l
         |                                       H                     W ,o

편집 : 컷 오프 첫 문자 후 회전 # 4 문제를 해결하는 더 좋은 방법을 찾았습니다.


아 좋은 ... 이것은 CJam에서 시도한 것과 비슷하지만 작동한다는 점만 다릅니다. ;)
Martin Ender

3

포스트 스크립트, 62 바이트

물론 이진 토큰을 사용하지만 다음과 같습니다.

/Courier findfont setfont

0 h moveto

s [
    w {1 0} repeat pop pop
    h {0 -1} repeat pop pop
    w {-1 0} repeat pop pop
    h {0 1} repeat
] xyshow

다음은 파일의 16 진 덤프 ( xxd round.ps)입니다.

0000000: 91c7 9243 9295 3020 6892 6b73 5b77 7b31  ...C..0 h.ks[w{1
0000010: 2030 7d92 8392 7592 7568 7b30 202d 317d   0}...u.uh{0 -1}
0000020: 9283 9275 9275 777b 2d31 2030 7d92 8392  ...u.uw{-1 0}...
0000030: 7592 7568 7b30 2031 7d92 835d 92c3       u.uh{0 1}..]..

다음으로 실행 :

gs -dw=11 -dh=10 -ss="rock beats scissors beats paper beats " round.ps

출력은 실제로 작습니다 (글꼴 크기를 전혀 조정하지 않아서).

이것은 xyshow연산자가 사용자 정의 문자 간격을 사용하여 문자열을 작성하는 이점을 활용합니다 . 이 경우 음수 세로 간격을 사용하여 기록한 다음 음수 가로 공간을 사용하여 뒤로 쓰고 양수 수직 공간을 사용하여 위로 씁니다. 이 때문에 문자열 조작을 사용할 필요가 없습니다.


3

> <>, 82 80 + 3 = 83 바이트

:2-&\
v!?:<oi-1
/?(0:i
\~ao{2-{~}
\{:?!v1-}o&:&
>:?v!~{{o}ao4.
^  >" "o1-
o;!?l<

> <> (물고기)에 대한 Esolang 페이지

예상보다 짧았습니다. 첫 번째 줄을 인쇄 한 다음 중앙 공간으로 채워진 열, 마지막 줄을 인쇄하는 간단한 접근 방식을 사용합니다.

STDIN을 통해 문자열을 입력하고 다음과 같이 -v플래그 와 함께 명령 행을 통해 높이와 너비를 입력하십시오 .

py -3 fish.py round.fish -v <height> <width>

설명

:2-&           Put W-2 in the register
:?!v1-io       Directly print the first W characters of the input
i:0(?/         Read the rest of the input
~ao{2-{~}      Pop a few leftovers 0s from above, decrement H by 2 and print a newline
               Stack now consists of H = H-2 at the bottom and the rest of the input reversed

[loop]

{:?!v          If H is 0...
  ~                Pop the 0
  l?!;o            Print the rest of the (reversed) input

               Otherwise...
  1-}              Decrement H
  o                Output the top of stack
  &:&              Copy I = W-2 from the register
  :?               If I is nonzero...
    " "o1-             Print a space and decrement I, then repeat from the previous line
  {{o}ao           Print the bottom input character and output a newline
  4.               Jump to the start of the loop (note that I = 0 is leftover from above)

2

배쉬 + 코어 유틸리티, 124

시작하는 쉘 스크립트 :

echo "${3:0:$1}"
fold -1<<<"${3:$1*2+$2-2}"|tac|paste - <(fold -1<<<"${3:$1:$2-2}")|expand -t$[$1-1]
rev<<<"${3:$1+$2-2:$1}"

입력을 명령 행 인수로 전달하십시오.

$ ./roundnround.sh 5 4 "Hello, World! "
Hello
    ,
!    
dlroW
$ 

2

자바 스크립트, 161 (160) 158 바이트

내가 생각해 낸 방법은 너무 오래 밝혀졌지만 오, 실제로 연습되었습니다. (또한 철자가 필요합니다 r+o[u]+'\n':d.)

function f(o,w,n){s=o.slice(0,w)+'\n';o=o.slice(w);n-=2;r='';for(u=w-2;u--;)r+=' ';for(u=d=0;d=o[2*n+w+~u],u<w+n;u++)s+=(u<n)?(d||' ')+r+o[u]+'\n':d;return s}

의미가없는 입력의 경우 출력이 정의되지 않았지만 (문자 적으로, 여러 번) 모든 테스트 사례에서 작동합니다.


slice보다 짧습니다 substr. 정확히 같지는 않지만이 경우에는 사용할 수 있습니다.
edc65

2

그루비, 140

f={a,x,y->println a.substring(0,x);(1..y-2).each{println a[a.length()-it]+' '*(x-2)+a[it+x-1]}println a.substring(x+y-2,2*x+y-2).reverse()}

요구:

f('rock beats scissors beats paper beats ',11,10)

산출:

rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 

2

K, 55 54 바이트

randomra의 J 구현과 동일한 접근법을 사용합니다. 공백 블록으로 시작하고 네 번 회전하면서 끈의 꼬리에서 가장자리까지 추가하십시오.

f:{`0:*4{((,r#*|x),|:'+*x;(r:-#*x)_*|x)}/((y-2)#" ";x)}

그리고 몇 가지 예 :

  f["Hello,_World!_";4 5]
Hello
_   ,
!   _
dlroW

  f[">v<^";2 2]
>v
^<

가독성을 위해 약간 분류하면

NxM 블록을 생성하십시오.

  t:2 3#!6
(0 1 2
 3 4 5)

transpose ( +) 및 reverse-each ( |:') 를 사용하여 90도 회전 :

  |:'+t
(3 0
 4 1
 5 2)

따라서 공백 블록 t과 문자열 s이있는 경우 꼬리 부분에 다음 s을 추가 할 수 있습니다 t.

  s: 12 18 17 8 9
12 18 17 8 9
  (,(-#t)#s),|:'+t
(8 9
 3 0
 4 1
 5 2)

이 양식 4 {[x] ... }/( ... )을 사용하여 작성 하는 문자열과 행렬로 구성된 튜플에 함수를 반복적으로 적용합니다. 이 회전 및 연결 단계를 수행 할 때마다 줄도 잘라냅니다.

편집하다:

또 다른 아이디어는 입력 문자열을 각 회전마다 원하는 조각으로 분할하여 프로그램의 본문을 단순화하는 것입니다. 불행히도 이것은 56 바이트에서 약간 더 길다.

f:{`0:((y-2)#" "){|:'(,y),+x}/(+\(0,y[0 1 0]-2 1 1))_|x}

분할 점을 계산하는 더 좋은 방법이 있다면 제안을 할 수 있습니다.

edit2 :

약간 재정렬하면 한 쌍의 괄호를 제거 할 수 있습니다. 54 바이트!

f:{`0:((y-2)#" "){|:'(,y),+x}/(0,+\y[0 1 0]-2 1 1)_|x}

2

K, 80 68 바이트

f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}

@JohnE 덕분에 80에서 단축되었습니다.

기발한:

f:{s:x;n:z;`0:(,s@!n),({s[(#s)+-2-x],({" "}'!n-2),s@n+x}'!y-2),,(|s@!-4+#s)@!n}

나는이 일이 어떻게 작동하는지 거의 알지 못한다.

사용법 예 :

f["Hello, world! ";5;4]

가능한 최적화가 있지만 Kona segfault를 계속 만들고 있습니다 ...


'take'(dyadic #)와 명시 적 인수 목록을 사용하여이를 조금 개선 할 수 있습니다 f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}. 내 수는 68 자입니다.
JohnE

@JohnE 감사합니다! 나는 명백한 논증 목록에 대해 알고 있었지만 어떻게 든 내 마음을 미끄러 뜨렸다. 그래도 난폭 한 #에 대한 실마리는 없었습니다.
kirbyfan64sos

2

R, 178

이것은 s, w, h매개 변수로 사용 되는 명명되지 않은 함수 입니다. 줄을 나누는 더 좋은 방법이 있었으면 좋겠다.

function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')}

언 골프

W=w+h-1;                                 # additional index points
H=w+W-1;                                 # additional index points
S=strsplit(s,'')[[1]];                   # vectorize the string
O=array(" ",c(h,w+1));                   # create an array of spaces
O[,w+1]="\n";                            # set newlines
O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);    # build middles lines
O=t(O);                                  # transpose array
O[1:w,c(1,h)]=c(S[1:w],S[H:W]);          # build top and bottom lines
cat(O,sep='')                            # cat out results

시운전

> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})("Hello, World! ",5,4)
Hello
    ,
!    
dlroW
> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})("+--+|||+--+|||",4,5)
+--+
|  |
|  |
|  |
+--+
> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})(">v<^",2,2)
>v
^<
> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})("rock beats scissors beats paper beats ",11,10)
rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb
> # Escaped the \ as well 
> (function(s,w,h){W=w+h-1;H=w+W-1;S=strsplit(s,'')[[1]];O=array(" ",c(h,w+1));O[,w+1]="\n";O[1:h,c(w,1)]=c(S[w:W],S[(W+W-1):H]);O=t(O);O[1:w,c(1,h)]=c(S[1:w],S[H:W]);cat(O,sep='')})("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",46,3)
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~                                            O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP
> 

2

티 -SQL, 307

여전히 끔찍하게 길지만 이것은 쿼리에서 생각한 것보다 훨씬 더 쉽고 짧았습니다. T-SQL에 대한 인라인 테이블 값 함수로 구현되었습니다.

CREATE FUNCTION f(@S VARCHAR(MAX),@ INT,@H INT)RETURNS TABLE RETURN WITH R AS(SELECT 2i,LEFT(@S,@)S,STUFF(@S,1,@,'')+'|'R UNION ALL SELECT i+1,CASE WHEN i<@H THEN LEFT(RIGHT(R,2),1)+REPLICATE(' ',@-2)+LEFT(R,1)ELSE REVERSE(LEFT(R,@))END,STUFF(STUFF(R,LEN(R)-1,1,''),1,1,'')FROM R WHERE i<=@H)SELECT S FROM R

이 문자열은 @h 번 반복됩니다. 첫 번째 재귀는 문자열에서 @W 문자를 자릅니다. 가운데 재귀는 문자열 패딩 사이의 나머지 문자열에서 마지막과 첫 번째를 가져옵니다. 마지막 재귀는 남은 것을 뒤집습니다. SQL Server가 VARCHARS의 후행 공백을 처리하는 방식을 처리하는 손실 된 문자가 몇 가지 있습니다.

시운전

WITH TestSet AS (
    SELECT *
    FROM (VALUES
        ('Hello, World! ',5,4),
        ('+--+|||+--+|||',4,5),
        ('>v<^',2,2),
        ('rock beats scissors beats paper beats ',11,10),
        ('!"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~andfoure',50,3)
        ) Test(S,W,H)
)
SELECT x.S 
FROM TestSet 
    CROSS APPLY (
        SELECT S FROM dbo.F(S,W,H)
        )x

S
----------------------------
Hello
    ,
!    
dlroW
+--+
|  |
|  |
|  |
+--+
>v
^<
rock beats 
          s
s         c
t         i
a         s
e         s
b         o
          r
r         s
epap staeb 
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR
e                                                S
ruofdna~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUT

(24 row(s) affected)


2

MATLAB, 101

function f(H,W,S)
w=1:W;h=(0:H-3).';n=W+H-2;S(3*n)=' ';S([w;[2*n-h,3*n*ones(H-2,W-2),h+W+1];n-w+W+1])

1

C ++, 398 바이트

컴파일러 사용 - GCC 4.9.2-std=c++14플래그

#include<bits/stdc++.h>
using namespace std;string s;vector<vector<char>> M;int w,h,p,i,j;void F(int x,int y){if(p<s.size()&&(((!y||y==h-1)&&x>=0&&x<w)||((!x||x==w-1)&&y>=0&&y<h))&&!M[y][x])M[y][x]=s[p++],F(x+1,y),F(x,y+1),F(x-1,y),F(x,y-1);}int main(){getline(cin,s);cin>>w>>h;M.resize(h,vector<char>(w,0));F(0,0);while(i<h){j=0;while(j<w){if(!M[i][j])M[i][j]=32;cout<<M[i][j++];}i++;cout<<endl;}}

여기에서 테스트하십시오.

설명

#include<bits/stdc++.h>
using namespace std;

string s; // input string
vector<vector<char>> M; // output matrix
int w, h, p, i, j;
// w = width
// h = height
// p = iterator over s
// i, j = iterators used later for printing answer

void F( int x, int y )
{
    // If the coordinates (x, y) are either on the first row/column or the last row/column and are not already populated with the input characters, populate them
    if ( p < s.size() && ( ( ( y == 0 || y == h - 1 ) && x >= 0 && x < w ) || ( ( x == 0 || x == w - 1 ) && y >= 0 && y < h ) ) && !M[y][x] )
    {
        M[y][x] = s[p++];
        F( x + 1, y );
        F( x, y + 1 );
        F( x - 1, y );
        F( x, y - 1 );
    }
}

int main()
{
    getline( cin, s );
    cin >> w >> h;
    // Input taken !!

    M.resize( h, vector<char>( w, 0 ) ); // Fill the matrix with null characters initially

    F( 0, 0 ); // This function does all the work

    // Now printing the matrix
    while ( i < h )
    {
        j = 0;
        while ( j < w )
        {
            if ( !M[i][j] )
            {
                M[i][j] = ' ';  // Replace '\0' with ' '
            }
            cout << M[i][j++];
        }
        i++;
        cout << endl;
    }

}

char[][]대신 사용하여 문자를 저장할 수 없습니까?
corsiKa

아니오, vector<vector<char>> M;M.resize(h,vector<char>(w,0));약간 짧습니다char** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Anmol Singh Jaggi

1

펄, 193,195 바이트

($s,$w,$h,$i,$y)=(@ARGV,0,2);
$o.=substr$s,$i,$w;
$i+=$w;
$o.=sprintf"\n%s%*s",substr($s,2*($w+$h)-$y++-3,1)||' ',$w-1,substr($s,$i++,1)while$y<$h;
print$o."\n".reverse(substr($s,$i,$w))."\n";

이것이 크게 향상 될 수 있다고 확신합니다. 나는 멍청한 놈입니다. >, <


0

자바 11, 180 바이트

(s,w,h)->{var r=s.substring(0,w)+"\n";int i=w;for(var S=s.split("");i<w+h-2;)r+=S[3*w+2*h-i-5]+" ".repeat(w-2)+S[i++]+"\n";return r+new StringBuffer(s.substring(i,i+w)).reverse();}

온라인으로 사용해보십시오 (참고 : Java 11은 아직 TIO가 아니기 때문에 동일한 바이트 수에 대해 String.repeat(int)에뮬레이트됩니다 repeat(String,int).)

설명:

(s,w,h)->{               // Method with String & 2 int parameters and String return-type
  var r=s.substring(0,w)+"\n";
                         //  Result-String, starting at the the first row of output,
                         //  which is a substring in the range [0, `w`)
  int i=w;               //  Index-integer, starting at `w`
  for(var S=s.split(""); //  Split the input-String into a String-array of characters
      i<w+h-2;)          //  Loop `i` in the range [`w`, `w+h-2`)
    r+=                  //   Append the result-String with:
       S[3*w+2*h-i-5]    //    The character at index `2*w+2*h-4 - i+w-1`
       +" ".repeat(w-2)  //    Then append `w-2` amount of spaces
       +S[i++]           //    Then append the character at index `i`
       +"\n";            //    And a trailing new-line
  return r               //  After the loop, return `r` as result
         +new StringBuffer(s.substring(i,i+w)).reverse();
                         //  Appended with the last row of output,
                         //  which is a substring in the range [`i`, `i+w`) reversed

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