テキストの長方形


13

プログラムは、入力として少なくとも8文字のテキストを取得し、常に偶数の文字で構成されます。(入力の正確さを評価する必要はありません)。

あなたの目標は、そのテキストを長方形として表示することです。たとえばHelloWorld、入力として与えられ、ディスプレイ

Hell
d  o
lroW

ルール:

  • テキストは時計回りに回ります(好きなように開始位置)
  • これは、1文字幅の閉じた長方形を形成します。
  • 長方形は内側のほとんどの領域を囲む必要があります。(テキストを2行で表示するという些細な答えを除外するため)
  • テキスト自体と必要なパディングスペースと改行以外の文字は印刷されません。

コードゴルフとして、最短のコードが勝ちます。

勝者は、最初の有効な回答から10日以内に選択されます。

回答:



7

PostScript 50バイナリ、113 ASCII

これはグラフィカル出力を使用します。バイナリトークンを使用したプログラムのHexdump:

$ hexdump -C textRect_binary.ps 
00000000  74 5b 30 20 39 5b 74 92  62 34 92 36 92 38 92 10  |t[0 9[t.b4.6.8..|
00000010  32 92 19 5d 7b 92 2c 7b  32 92 19 7d 92 83 92 3e  |2..]{.,{2..}...>|
00000020  92 6e 7d 92 49 5d 39 20  39 92 6b 91 c7 39 92 8e  |.n}.I]9 9.k..9..|
00000030  92 c3                                             |..|
00000032

ダウンロードして試してください。Ghostscriptを使用すると、レンダリングされるテキストを次のようにプログラムに渡すことができます。

gs -st=helloworld textRect_binary.ps 

グラフィカル出力は次のようになります。

rendered output

ASCIIトークンを使用した同じコードは次のようになります。

t[0 9[t length
4 div dup
ceiling
2 copy]{cvi{2 copy}repeat
exch neg}forall]9 9 moveto/Courier 9 selectfont
xyshow

戦略は、xyshow各文字を表示した後、次の文字を表示する前に移動する場所を定義するために使用することです。左下隅から開始し、時計回りに移動します。つまり、最初に上に、次に右に、次に下に、次に左に移動します。常に9ユニットを移動しているため、最初に0 9、次に9 0、次に0 -9、それからの相対移動があり-9 0ます。これらの番号の1つのペアからシーケンスを使用して次の番号を取得できますexch neg

xyshowこれらの数字のペアを保持するための配列を作成する必要があります。1文字ごとに1ペアです。つまり、helloworld10文字の文字列を例にとると、上に2回、次に右に3回、次に下に2回、左に3回移動したいということです。これらの値(2および3)は、ストリングの長さを8で除算することによって取得されます。一度床に丸め、天井に1回。

したがって、0 92回コピーしてから、を使用して相対x / y座標に切り替えexch neg、これらを3回コピーします。

このコメントコードは、スタックで何が起こるかを示しています。

t[0 9                % t [ 0 9
[t length            % t [ 0 9 [ length
4 div dup            % t [ 0 9 [ length/4 length/4
ceiling              % t [ 0 9 [ length/4=height width
2 copy]              % t [ 0 9 [height width height width]
{%forall             % t [ 0 9 ... x y height_or_width
  cvi                % t [ 0 9 ... x y height_or_width_integer
  {2 copy}           % t [ 0 9 ... x y height_or_width_integer {2 copy}
  repeat             % t [ 0 9 ... x y .. x y
  exch neg           % t [ 0 9 ... x y .. y -x
}forall]             % t [0 9 ... -9 0]
9 9 moveto/Courier 9 selectfont
xyshow

神聖なバジーエズを+1。レベル2以上の知識が非常に不足しています。
luserはドローグ

という意味xyshowですか?この1つをご紹介できてうれしいです。しばらく前にあなたが私を紹介してくれましたkshow
トーマスW.

@luserdroog:ところで:現在のGolfScriptエントリにはバイナリエントリよりも10%以上多くの文字が含まれていることを非常に誇りに思っていますが、ASCIIバージョンはRubyでの描画から1文字離れている(実際、3つでも、 Rubyコードをさらにゴルフすることができるからです)。さらに最適化するためのアイデアはありますか?
トーマスW.

@ThomasW。現在、私のGolfScriptエントリはバイナリより24%短くなっています;-)そして、さらに1文字または2文字短くする可能性があると思います。
ハワード

@ハワード:ああ!!! だれでもGolfScriptに勝つことができますか?
トーマスW.

7

ルビー112 100

私はRubyが初めてで、これが私の最初のコードゴルフです。私はmemoweのperl実装を参考にして、Rubyバージョンを作成しようとしました。これは112 100文字で、xに文字列を割り当てることを前提としています。他の人に会えるのを楽しみにしています。

l=x.size
puts x[0..w=l/2-h=l/4]
1.upto(h-1){|i|puts x[-i]+' '*(w-1)+x[w+i]}
puts x[w+h..l-h].reverse

提案を実装するために編集されました。今は100文字だと思います。みんなありがとう!


いいね!5行目に2つの文字を保存できます(スペースを削除します)。
トーマスW.

私はそれが好きです。ありがとう。Rubyの文字列は配列のようにアクセスできるので、見た目がいいので、自分で1つ作成しなければなりませんでした。:)
メモ

あなたは置き換えることができますx.lengthx.size(2つの文字を保存します)
クヌート

1
そしてさらに8を使用しputs x[0..w=l/2-h=l/4]ます。
ハワード

5

Perl(124 118 109 + 3 = 112)

これは以前は非常に簡単でした。すべてのコマンドラインオプションをそれぞれ1文字としてカウントしました。

-nlE
$w=(@s=split//)/2-($h=int@s/4);say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]

例:

$ perl -nlE '$w=(@s=split//)/2-($h=int@s/4);say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]'
abcdefghijklmnopqrstuvwxyz
abcdefgh
z      i
y      j
x      k
w      l
v      m
utsrqpon

これは圧縮することができる:(1)(@s-$h*2)/2 == @s/2-$h(2)$wのように表すことができ、$w=(@s=split//)/2-($h=int@s/4);したがって、2つのセミコロンを節約
アモン

コードを更新しました。
メモ

さらに興味深いもの:(1)スペースは、配列補間var $"–saves 1 char のデフォルト値です。(2)$w+$h == @s/2– 1文字を保存します。(3)$wが1つ小さい場合、を単純化でき$"x($w-1)ます。このために$_は、1を増やす必要があります。3文字節約できます。(4)最後のセミコロンはüberflüssigで、1文字節約されます。これはコードフラグメントにつながりますsay@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]+楽しみのためにいくつかありますので、1つのスペースは残っていません)。
アモン

@amon、素晴らしいゴルフ化、私の投稿で編集してください。そうすれば、世界は誰がそれをしたかを見ることができます。:)
メモ

5

Brainfuck - 194 187

+>,[>+[>+<-],]
>-->++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>[-]>[<<+<<+>>>>-]<<<<
[[<]>+[>]<-]<[<]>-
[>.[-]<[>+<-]>-]>[>]
++++++++++.<.[-]
>[>+++>>+<<<-]>++>--[<.>-]<<<<[<]>.[-]>[>]>>>>.
<<<<<[.<]

良い試みですが、動作しません。一番下の行は、1を支配するために、間違った方向に反対であり、それだけ3.ルールに反して固定された高さ、有する
VSZ

なぜ最後の行を反転したのか分かりません。私はそれを書いていたときの正しい方法を完全に念頭に置いていました。修正により、実際には7つのコマンドが保存されます。私は固定高さのものを捜索しましたが、それはあなたが話した些細な2行の場合ではありません。たぶん私はそれを将来的に改善するでしょう。
captncraig

4

Mathematica 156 199 344

編集:これは以前のコードの主要な書き直しです。基本的には同じように機能しますが、入力として長さが120文字未満の文字列を取り、正方形のサイズを自動的に変更します。

まだ少しゴルフはできますが、以前のバージョンやバグの多いバージョンのサイズに達することはありません。

f@s_ := ({a, t, w, q} = {Automatic, Text, Quotient[StringLength@s, 2],
 Quotient[StringLength[s], 4] + 1};z = StringSplit[StringInsert[s <> ConstantArray[" ", 0],
 "*", {q, 2 q, 3 q}], "*"];
Graphics[{t[z[[1]], {0, q}],t[z[[2]], {q, 0}, a, {0, -1}],t[z[[3]], {0, -q}, a, {-1, 0}],
t[z[[4]], {-q, 0}, a, {0, 1}]},ImageSize -> 500,BaseStyle -> {FontFamily -> "Courier", 21},
PlotRange -> 34,ImagePadding -> 22])

f["Hello Code Golf World!"]
f["January, February, March,April, May, June, July"]
f["This text is normal, this goes downwards,this is upside-down, and this is upwards"]

pic1

pic2

pic3


ねえ、文字列の配列?それは本当にルールを曲げていますよね?
トーマスW.

@ThomasW。答えのコメントは、それが最終的な解決策ではないことを示しています。
小次郎

ああ、分かった!私は...挑戦を取るとPostScriptに似た何かをしようとするかどうかワンダー
トーマス・W.

今の見た目が好きです!
トーマスW.

@Thomas W.ありがとう。幅広い文字列の長さに対して形式を正しく表示するには、多くのバイトが必要です。
DavidC

2

Perl +正規表現:104(101 + 3)

(カウントコード+スイッチ)

素敵な正規表現と少しのPerlを使用したソリューションを次に示します。

perl -plE'$w=($l=length)/2-($h=int$l/4);s/..{$w}\K.*/"\n".reverse$&/e;$"x=--$w;s/.\K(.*)(.)$/$"$2\n$1/while--$h'

これは、1つの入力行でのみ正しく動作します。

memoweに触発されましたが、基本的に配列はありません。


愚かな質問でごめんなさい:どうすればこれを試すことができますか?コードをコマンドラインに貼り付けてから、何かを入力してEnterキーを押すと、何かが表示されます。しかし、それは箱ではありません。私は何を間違っていますか?
トーマスW.

@ThomasW。私にとっては、任意の偶数の文字数で動作するようです。上記のコードは、bashおよびperlバージョン5.12+で動作することが保証されています。入力はSTDINを介して受け入れられ、最初の行のみが正しく処理されます。cmd.exeのコードを正しく引用する方法がわかりません。
アモン

1
ああ、おそらく私の間違いだった。私はおそらく奇数の長さの文字列を使用しました。この作品:echo thisworksgreat | perl -plE'$w=($l=length)/2-($h=int$l/4);s/..{$w}\K.*/"\n".reverse$&/e;$"x=--$w;s/.\K(.*)(.)$/$"$2\n$1/while--$h'
トーマス・W.

2

PostScript(106)

これは、男のMathematicaソリューションに触発されています

0{= =
4 add dup
t length mod 4
lt{-90 rotate}if}0[0 3 -3 0 9 9]concat
0 moveto/Courier 5 selectfont
t kshow

Ghostscriptではこれを次のように呼び出します

gs -st=hello! boxtext.ps

次のような出力を生成します。

Hello_Code_Golf_World!

1月、2月、3月、4月、5月、6月、7月

kshowグリフを1つずつ表示するために使用します。片側に十分なグリフが表示された後、残りのグリフを続行する前に、すべてが-90度回転します。

サイドに十分なグリフが表示されたことを知るために、グリフが表示されるたびにカウンターを4ずつ増やします。文字列の長さを法とするカウンタ値が4未満の場合、回転する必要があることがわかります。

char  counter  mod 6  compared to 4
 h       4       4          =
 e       8       2          <   => rotate
 l      12       0          <   => rotate
 l      16       4          =
 o      20       2          <   => rotate
 !      24       0          <   => rotate

ここに画像の説明を入力してください

コメント付きおよびゴルフなしのソースコード:

0                      % n
{%kshow                % n char1 char2
  = =                  % n
  4 add dup            % n' n'
  t length mod         % n' (n' mod t_length)
  4 lt                 % n' bool
  {-90 rotate}if       % n'
}                      % n kshowProc
% First 0 for moveto. We add it here to take 
% advantage of the surrounding self delimiting tokens.
0                      % n kshowProc 0
% We change the graphics state so that the drawn
% text is at a nice size and not off screen.
[0 3 -3 0 9 9]concat   % n kshowProc 0
0                      % n kshowProc 0 0
moveto                 % n kshowProc
/Courier 5 selectfont  % n kshowProc
t                      % n kshowProc text
kshow                  % n

1

Python 2.x:137

私はゴルフをコーディングするのは初めてで、これを改善できると確信しています…

def s(t):c=len(t);w=1+c/4;h=(c-w-w)/2;u=w+h;n='\n';print t[:w]+n+n.join(map(((w-2)*' ').join,zip(t[:w+u-1:-1],t[w:u])))+n+t[w+u-1:u-1:-1]

ビジュアルテストコード:

from itertools import chain
from string import letters
for i in range(8,101,2):
    t = ''.join(chain(letters))[:i]
    print '%d: %s' % (i, t)
    s(t)
    print '-----'

興味深いこと:この解決策は整数演算に依存しています。数学的にシンボリックに行うと、それがわかりますがh=(c-w-w)/2 => h=w-2、その結果を代入すると、他のすべての結果に左下の2つの文字が欠落します。


1

K、84

{-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}

k){-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}"HelloWorld"
Hell
d  o
lroW

k){-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}"Hellooooooooooooooo Worlddddd!"
Hellooooo
!       o
d       o
d       o
d       o
d       o
d       o
lroW oooo

1

スカラ(135)

次のスニペットは、xフォーマットする文字列が含まれていることを想定しており、scala REPLに貼り付ける必要があります。

val (h,w)=((x.size+3)/4,println(_:Any));val s=x.grouped(h)toSeq;w(s(0));for((l,r)<-s(1)zip(s(3)reverse))w(r+" "*(h-2)+l);w(s(2)reverse)

scalaがインストールされていない場合は、オンラインのScalaインタープリターhttp://www.simplyscala.com/を使用して簡単に確認できます。次のテキストを貼り付けて、評価を押します:

val x="HelloWorld"
val (h,w)=((x.size+3)/4,println(_:Any));val s=x.grouped(h)toSeq;w(s(0));for((l,r)<-s(1)zip(s(3)reverse))w(r+" "*(h-2)+l);w(s(2)reverse)

1

Python 3(120)

s=input()
n=len(s)
h=n//4
q=(n+2)//4-1
p=print
p(s[:q+2])
for i in range(1,h):p(s[n-i]+' '*q+s[q+1+i])
p(s[n-h:q+h:-1])

テスト

入力:

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

出力:

abcdefghijklmn
z            o
y            p
x            q
w            r
v            s
u            t
t            u
s            v
r            w
q            x
p            y
o            z
nmlkjihgfedcba

0

PHP(149)

印刷するテキストは、という名前の変数にある必要があります$x

@$s=substr;echo$s($x,-$w=($l=strlen($x)/2)-$h=$i=$l-2>>1).'
';while($i--)echo$x[$l+$i].str_repeat(' ',$w-2).$x[$h-$i-1].'
';echo$s(strrev($x),$l,$w);

0

Python2.7(99)

t=''.join(raw_input().split())
u=len(t)/2-1
print t[:u]+"\n"+t[-1]+" "*(u-2)+t[u]+"\n"+t[-2:u:-1]

編集:それは明らかに内部の最大領域を包含するルールに違反しています。


0

ジャワ-320

public class A{
public static void main(String[] a){
String s=a[0];
int l=s.length(),h=l/2,f=h-1,i=0;       
for(i=0;i<f;i++)
System.out.print(s.charAt(i));
System.out.print("\n"+s.charAt(l-1));
for(i=0;i<f-2;i++)
System.out.print(" ");
System.out.println(s.charAt(h-1));
for(i=l-2;i>h-1;i--)
System.out.print(s.charAt(i));}}

注意 : -入力はコマンドラインから取得されます

入力:-HelloWorld

出力:-

Hell
d  o
lroW

入力:-abcdefghijklmnopqrstuvwxyz

出力:-

abcdefghijkl
z          m
yxwvutsrqpon

特にルールを注意深く読んでください。3.
vsz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.