文字列の文字はどんどん進む


23

PhiNotPiのフラクタルラインチャレンジの初期ドラフトに触発されました。)

W > 1、高さH > 1、および2(W+H-2)印刷可能なASCII 文字で構成される文字列が与えられます。タスクは、この文字列を、左上隅から時計回りに、指定された幅と高さの長方形に巻き付けて印刷することです。長方形の内側はスペースで埋められます。テストケースはこれを非常に明確にすることを望んでいます。

プログラムまたは関数を作成し、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
あなたのリーダーボードはとてもクールです。
アレックスA.

2
リーダーボードスクリプトをゴルフしましたか?
mbomb007

2
@ mbomb007いいえ、コードをミニファイアーで実行したため、展開してもスペースをあまり消費しません。(改行を削除するだけで十分だったと思います。)私はまだ、ハードドライブに縮小されていないバージョンを持っています。
マーティンエンダー

2
これを「弦の中のチャーズラウンドアンドラウンド」に名前を変更すると、曲のリズムにより良くフィットします。
ジャスティン

回答:


9

CJam、27バイト

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

私は実際にはCJamではありませんが、これはMartinに勝ると思います。主な違いは、入力を読み取る前に改行をプッシュし、すぐに最初の行を印刷することです。これにより、高さを保存する必要がなくなります。

順番に入力を取ります

H "String" W

オンラインでお試しください。


10

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

最初の行を印刷してから、2本の垂直線を印刷してから、最後の行を印刷します。

print3回書くよりも短くする必要がありますが、変数に保存するためにこれまで試してきたすべてのことは'\n'.join長くなりました。


Python 3に切り替えて、変数に印刷を保存できます
オマー

1
@Omar eval入力で使用し、printステートメントを括弧で囲む必要があるため、時間が長くなります。
FryAmTheEggman

ああ、私はeval考慮していませんでした!printPython 2ではその後にスペースが必要なので、括弧はあまり問題になりません。からに移動print blahしてp(blah)も、3文字節約されます。
オマー

9

CJam、31 30バイト

オプティマイザーの主張では、ここに私自身の試みがあります。私は自分の挑戦に勝つことのファンではないので、これに勝つためにAPLファミリー(またはCJamでより良い誰か)を数えています。;)

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

質問で与えられたのと同じ順序で入力を受け取ります:

"Hello, World! " 5 4

ここでテストしてください。

オプティマイザーのおかげで1バイト節約されました。

説明

もともと、スペースの長方形から始めて、文字列を文字列で包みながらグリッド全体を4回回転させるという素晴らしいアイデアがありました。ただし、幅または高さ、あるいはその両方がの場合、それを動作させることができなかったようです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では機能しません。しかし、それは良い考えです。どうにかして別の方法で使用できるかどうかを調べます。
マーティンエンダー

ど!あなたはH = 2の問題についても言及しましたが、私はまだそれを防ぐのを忘れていました。
DocMax

9

Pyth、47 46 45 40 37 36バイト

これは、Pythで実装されている明らかなアプローチです。最初の行にインデックスを付けて出力し0:width、次に中央、最後に出力します。

@Jakubeを使用zしてQ、2つの入力とusing を使用したヒントをありがとうp

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

入力を文字列および次元のタプルとして入力し、改行で区切ります:

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です。
ジャクベ

私たちのアプローチでは37文字が可能です。
寂部

@ジャクベのヒントをありがとう!
マルティセン

もう1つの文字の節約。代わりに++使用pして切り替えzt_N*d-k2
ジャクベ

5

J、61バイト

方法:

(height-2)*(width-2)スペースのブロックから始めて、文字列の最後から必要な量の文字を取り出し、現在のブロックに追加します。これを4回繰り返します。'Hello, World! ' 5 4例で示した合計5つの状態(X読みやすくするためにスペースをsに置き換えています):

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

コード:

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

明示的な関数定義。2オペランド関数は、左引数として文字列を取り、右引数として2つの整数のリストを取ります。

使用例:

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

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

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

こちらからオンラインでお試しください。


うわー、私は、これはJ.に幅と高2のために働くことに感銘を受けています
マーティン・エンダー

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

@isaacgありがとう、Maltysenの答えですでに似たようなものを既に見ました。
ジャクベ

4

JavaScript(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)、no string.repeat

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

Python 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

Haskell、164 156バイト

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ブロックを作成し、最初の行を入力文字列の先頭に置き換えます。次に、ブロックを反時計回りに回転させ、最初の行の置換をさらに3回繰り返します。

#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で試したものに似ていますが、機能する点が異なります。;)
マーティン・エンダー

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

ファイルのhexdump(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

Bash + coreutils、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

JavaScriptの、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実装と同じアプローチを使用します。スペースのブロックから始め、4回回転させながら、文字列の末尾からエッジに追加します。

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と文字列がある場合ssto の末尾のスライスを追加できます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] ... }/( ... )中の文字列とマトリックスで構成されるタプルに関数を繰り返し適用します。この回転と連結のステップを実行するたびに、文字列も切り刻みます。

編集:

もう1つのアイデアは、入力文字列を各回転で必要なフラグメントに分割して、プログラムの本体を単純化することです。残念ながら、これは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]

いくつかの可能な最適化がありますが、コナのセグメンテーション違反を作り続けます...


'take'(ダイアディック#)と明示的な引数リストを使用して、これを少し改善できます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

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



1

C ++、398バイト

使用コンパイラー-GCC 4.9.2 with -std=c++14flag

#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]();
アンモルシンジャギ

1

Perl、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

Java 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.