テキストをセンタリング!


40

テキストをセンタリング!

この課題では、さまざまな線を中央に配置します。

Foo
barbaz

 Foo
barbaz
Hello
World

Hello
World
Programming Puzzles
&
Code Golf

Programming Puzzles
         &
     Code Golf

仕様書

各入力行には常に少なくとも1つの非空白文字が含まれます。空白文字はスペース()と改行のみであると想定できます。各入力行には、末尾の空白や先頭の空白はありません(改行を除く)。出力の末尾の空白許可されません

入力の最も長い行の中央に配置する必要があります。その行の長さが偶数の場合、プログラム/関数は左に中央揃えすることを選択する必要があります。行の最大長は言語で処理できるものであれば何でもかまいませんが、プログラムは少なくとも500行の行で機能する必要があります。


リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


これはので、バイト単位の最短コードが勝ちです!


複数の内部空間はありませんか?

そこになることはありません@cat 任意の行に先頭の空白または末尾の空白(存在する場合は改行を期待)
Downgoat

はい、私は意味インナー単語間-spaces、のような、

1
@catああ、単語の間に複数の空白があるかもしれません。例えば、foo(space)(space)(space)bar完全に許容入力される
Downgoat

常に複数の行があると仮定できますか?
GamrCorps

回答:


15

Pyth、19 17バイト

ジャクベのおかげで2バイト

V.ztr+1.[l.T.zNd6

デモンストレーション

センターパッド機能.[が有用になったのはこれが初めてだと思います。最も長い行の長さは、非切り捨て転置(.T)を使用して検出されます。

後続のスペースは、スペース以外の文字を前面に追加し、スペースを削除してから追加した文字を削除することにより削除されます。


1
おそらく配列の最大長が必要です。頻繁に発生します。+1
マルティセン

仕様では、「出力の末尾の空白は許可されていません」とあります。これは、出力の各短い行に末尾の空白があるように見えるため、カウントされるかどうかはわかりません。
ポテト

@potato Thanks-私が答えてから追加されました。
isaacg

31

vim、43 36 35バイト

VGrx:sor
G:let &tw=col("$")
uu:%ce

投稿しないでください。末尾の改行に注意してください。それは重要です。

キャラクターを保存してくれた@Marthに感謝します!

vimに適した形式:

VGrx:sor<cr>G:let &tw=col("$")<cr>uu:%ce<cr>

説明:

VGrx                   replace every character with an "x"
:sor<cr>               sort (since all chars are now same, sorts by line length)
G                      go to the very last line
:let &tw=col("$")<cr>  set &tw to column number of last char on this line
                         "let &tw" is equivalent to "set tw"
                         tw is short for textwidth, used in :center
uu                     undo the sort, and the replacing-with-x too
:%ce<cr>               center over entire file (%), using textwidth set earlier

1
確かに、これはすべて挿入モードで行う必要がありますよね?
アレックスA.

9
@AlexA。挿入モードでは実行されません。ಠ_ಠ
ドアノブ

を使用sor!して並べ替え順序を逆にする場合、を使用するcol("$")代わりにを使用してG$、最初の行の長さを取得できます(現在は順序が逆になっているため最長です)。編集:または、ソート順を維持してG:let &tw=col("$")代わりに使用できます。
マース

@マースありがとう!後者を選択しました(特別な理由はありません)。
ドアノブ

見てみると:h :sort、正規表現を渡して並べ替えで一致するテキストをスキップできるので:sor /./、長さ(+4バイト)で並べ替えることができ、VGrx(-4バイト)と2番目の元に戻す( -1バイト)。また、コマンドを連結する|代わりに区切り文字<cr>を使用して、:let(-1バイト)をスキップできます(sor!ソリューションを使用する必要があることに注意してくださいG、exコマンドではありません)。だから、:sor! /./|let &tw=col("$")|u|%ce (末尾では<CR>)2つのバイトを保存する必要があります。
マース

23

Mathematica、96バイト

StringRiffle[#~StringPadLeft~Floor[Max@(l=StringLength)@a/2+l@#/2]&/@(a=#~StringSplit~"
"),"
"]&

どのように機能したのかを聞かないでください。正しい出力が生成されるまで、いじりました。


27
以下のための+1「それは正しい出力生産されるまで、私はちょうどそれをいじっ働いたか私に聞かないでください」
猫を

4
@catそれは私がすべてのゴルフをする方法です。
リトシアスト

11

機能、非競争的

この課題は、レイジーシーケンスの「最大値」(および最小値)関数が非常に不足していることを強調しているため、...コアライブラリに追加しました(それぞれ⊤およびcalledと呼ばれます)。したがって、これをゴルフの答えとして提出することはありませんでした(有効にするためには⊤関数宣言を含める必要があります)ので、ここにメインプログラムのみを示します。

(function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})()ブラウザコンソールで実行して、レンダリングを改善します。

   ╓───╖         ╔════╗  ┌───╖  ╔═══╗
 ┌─╢ ‡ ╟─┐       ║ 10 ╟──┤ ǁ ╟──╢   ║
 │ ╙───╜ │       ╚════╝  ╘═╤═╝  ╚═══╝
 │ ┌───╖ │  ┌──────────────┴──────────────────┐
 └─┤ ‼ ╟─┘┌─┴─╖ ┌───╖ ┌───╖ ┌───╖ ┌───╖       │     │
   ╘═╤═╝  │ ɱ ╟─┤ ⊤ ╟─┤ + ╟─┤ ~ ╟─┤ ℓ ╟───┐ ┌─┴─╖ ┌─┴─╖ ╔════╗
     │    ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╘═══╝ ╘═══╝   │ │ ɱ ╟─┤ ʝ ╟─╢ 10 ║
    ┌───╖ ╔═╧═╕ ╔═══╗ ┌─┴──╖ ┌───╖ ╔════╗ │ ╘═╤═╝ ╘═══╝ ╚════╝
  ┌─┤ ℓ ╟─╢   ├─╢ 1 ║ │ >> ╟─┤ … ╟─╢ 32 ║ │   │
  │ ╘═══╝ ╚═╤═╛ ╚═╤═╝ ╘═╤══╝ ╘═╤═╝ ╚════╝ │ ╔═╧═╕ ╔═══╗
  └─────────┘     └─────┘      │   ┌───╖  ├─╢   ├─╢ 0 ║
                               └───┤ ‡ ╟──┘ ╚═╤═╛ ╚═══╝
                                   ╘═╤═╝      │
                                     └────────┘

説明

これは、このサイトでラムダ式を使用する最初のFuncitonの回答になると思います。

  • まず、ǁ入力文字列を改行(ASCII 10)で分割するために使用します。これは遅延シーケンスを返します。
  • そのシーケンスをɱ(map)に渡して、各文字列の長さを計算するラムダを渡し、最後のシーケンスを渡して最長の行の長さを取得します。
  • 我々はまた、別のを通してその配列を渡しɱ、2は(1、実際に右シフト)は、多くのスペースを生成することが、以前計算された最大の行の長さから減算して、それを分割し、各文字列の長さを算出するラムダを与える、(ASCII 32)そして、それらのスペースに文字列を連結します。(幾何学的な理由から、パラメーターを逆にして(string concatenate)を呼び出す関数を宣言しました。)
  • 最後に、ʝ区切り文字として改行(ASCII 10)を使用して、すべての文字列を元に戻します。

これがどれほど素晴らしいか、そして「それ
cat

9

網膜54 52バイト

+m`^(.)+$(?<=(?=[^\t]*^..(?<-1>.)+(?(1)^))[^\t]*)
 $0 

\tsが実際のタブに置き換えることができますが、私は使用していた\tそうSEは、タブをスペースに変換されますので、ここに。2行目に先頭のスペースがあることに注意してください。

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

説明

基本的な考え方は、(より2つの文字短いまたは技術的に、少なくとも2つの文字最も長い行よりも短くなっている行と一致している任意の他のライン)、および2つのスペースでそれを囲みます。これは、そのような行が見つからなくなるまで繰り返されます。つまり、すべての行が最大長の1文字内にあることを意味します(1文字はパリティの不一致を考慮し、これらの行が左にずれることを保証します。センター)。

実際の正規表現に関して:

^(.)+$

1各文字のグループに1つのキャプチャをプッシュしながら、任意の1行に一致します。

(?<=...[^\t]*)

右から左に一致する後読みで、カーソルを文字列の先頭に移動して、内部の先読みで文字列全体をチェックできるようにします。アンカーがないため、先読みは他のどこからでも適用できますが、追加の一致は作成されません。空白に関する限り、入力にはスペースとラインフィードのみが含まれることが保証されているため、文字列内の任意の文字[^\t]と常に一致することがわかっています。

(?=[^\t]*^..(?<-1>.)+(?(1)^))

この先読みは、現在一致している行より少なくとも2文字長い行を見つけようとします。[^\t]*任意の行に一致できるように、文字列内を移動します。^行の先頭から開始するようにします。..次に、長い行に必要な2つの追加文字に一致します。今(?<-1>.)+グループからポップしながら、そのライン内の個々の文字に一致1(注.これは1行に制限されるように、改行と一致することはできません)。最後に、(?(1)^)グループ全体を空にしたと断言し1ます。行が必要な長さより短い場合、グループ1からポップするのに十分な文字が行を空にするのに十分でないため、これは不可能です。


7

Jolf、3バイト

非競合、更新後日に関する質問。

ここで試してみてください!

pci
pc  center
  i  string input

¯\ _(ツ)_ /¯便利な機能だと思いました。


1
これは標準的な抜け穴であり、明示的に禁止されていませんが、作成した言語ではなく、見つけた言語に組み込まれていない限り、その悪い形式です。
エリアスベネベデス

3
@EliasBenevedesコンテストの前に機能を追加しました。コードが関連するようになるまで、コードを頻繁に更新しません。
コナーオブライエン

7

JavaScript(ES6)、93 91バイト

s=>(m=l=s.split`
`).map(x=>(v=x.length/2)<m?v:m=v).map((x,i)=>" ".repeat(m-x)+l[i]).join`
`

@ edc65のおかげで2バイト節約!

説明

s=>(
  m=                // m = max line length (divided by 2)
    l=s.split`
`)                  // l = array of lines
.map(x=>            // for each line
  (v=x.length/2)    // v = current line length / 2
    <m?v:m=v        // set m to the max line length and return v
)
.map((x,i)=>        // for each line length / 2
  " ".repeat(m-x)   // add spaces before
    +l[i]           // add line text
)
.join`
`                   // return lines as a newline-separated string

テスト


.repeatあなたが必要としないので、非整数値を受け入れ、切り捨て|0
edc65

7

CJam、26 23 19バイト

qN/_z,f{1$,m2/S*\N}

初めてCJamを使用する!MartinBüttnerのおかげで4バイト節約されました。オンラインでお試しください。

説明

qN/    e# Read input and split each line
_z,    e# Transpose a copy and get its length to find the longest line
f{     e# For each line...
  1$,- e# Subtract its length from the longest length
  2/   e# Divide by two to get just the spaces to add to the left
  S*\  e# Add a string with that many spaces to the beginning
  N    e# Add a newline to go on to the next line
}

1
ここにいくつかの提案があります:)qN/_z,f{1$,m2/S*\N}
マーティンエンダー

6

LabVIEW、3または35のLabVIEWプリミティブ

行がなくなるまで行を検索し、追加するスペースの数を計算して、すべてをまとめます。

代わりに、文字列インジケータに組み込みの中央揃えを使用することもできますが、ちょっと不正行為のように感じます。


6

Python 2、83 81バイト

def f(s):
 t=s.split('\n')
 for y in t:print(max(len(f)for f in t)-len(y))/2*' '+y  

2文字を保存してくれた@xnorに感謝

入力例:

f("""Programming Puzzles
&
Code Golf""")

出力例:

Programming Puzzles
         &
     Code Golf

そして、str.center()とstr.rstripを使用して84バイトで2位で終了します(@JFに感謝)。

def f(s):
 t=s.split('\n')
 for y in t:print y.center(max(len(f)for f in t)).rstrip()

len2回使用する変数に割り当てる文字は保存されません。5文字でも壊れます(などrange)。また、mapリストのコンプにも使用できます。
XNOR

@Willem、str.rstrip()呼び出し後に使用しcenterて末尾のスペースを取り除くことができます。
JF

あなたは完全なプログラムで7つのバイトを保存し、使用することができlen(max(a,key=len))これを参照してください
ბიმო

5

TeaScript、24バイト

£p.R((aßln)¯-ln)/2)+l,§)

行をループfloor((max line length - line length) / 2)し、先頭にスペースを追加します。

非ゴルフ

£   p.R((aß  ln)¯  -ln)/2)+l,§   )
xl(#p.R((am(#ln)X()-ln)/2)+l,`\n`)

xl(#    // Loops through newlines
    p.R(   // Repeats spaces
      (
       am(#ln)    // Map all line lengths
              X() // Get largest line length
       -ln)       // Subtract current line length
      /2)  // Divide by two
      +l,  // Add current line text
`\n`)

オンラインで試す


5
どうして私の答えが落ち着かないのですか?ユーザー名/アバターを変更する時が
来たと思う

2016-07-27現在修正済み。:P
user48538

5

PowerShell、58 67バイト

@mazzyのコメントのおかげで、58バイトになりました。

param($a)$a|%{$_|% *ft(($a|% le*|sort)[-1]/2+$_.length/2)}


# It takes an array of strings as input
PS C:\Temp> .\center.ps1 'aaa','bb','c'
aaa
bb
 c


# Or here, read from a file
PS C:\Temp> .\center.ps1 (gc t.txt)
info0:info1:info2:info3
      info0:info1
          ttt
          tt
           t
  • として文字列の配列を取り、$aで各文字列をループします|%{...}
  • ショートカットstring.padleft()を介して各文字列のメソッドを呼び出し% -memberます。これは、パラメーターとして必要な最終行の長さを取ります。
    • 私たちは必要です array_longest_line_length/2 + current_line_length/2
    • 最後の部分はcurrent_line_length/2->$_.length/2
    • もう1つの部分は、ループを通るたびに配列の最大行長を再計算し、行長の配列を作成するネストされたループで再計算し、並べ替えてから最後のものを取得します。

あなたが使用できる短縮プロパティ名要素の長さを取得するために58バイト
mazzy

1
@mazzyそれは良いです!あなたが回答として投稿しなかったので、私はそれをクレジットで編集して回答に入れました。
TessellatingHeckler

3

Emacs Lisp、203バイト

(let((f 0)(l 0))(dolist(s(split-string(buffer-string)"\n"))(set'l(string-width s))(when(> l f)(set'f l)))(let((fill-column f))(goto-char(point-min))(while(<(point)(point-max))(center-line)(next-line)))))

ゴルフをしていない:

(let ((f 0) (l 0))
  (dolist (s (split-string(buffer-string) "\n"))
    (set 'l (string-width s))
    (when (> l f)
      (set 'f l)))
    (let ((fill-column f))
      (goto-char (point-min))
      (while (< (point) (point-max))
        (center-line)
        (next-line)))))

中央揃え:

               (let ((f 0) (l 0))
 (dolist (s (split-string(buffer-string) "\n"))
           (set 'l (string-width s))
                 (when (> l f)
                  (set 'f l)))
             (let ((fill-column f))
            (goto-char (point-min))
         (while (< (point) (point-max))
                 (center-line)
                (next-line)))))

3

HTML、40バイト

<xmp style=float:left;text-align:center>

</xmp>コードスニペットビューアーは、タグのバランスを取ることを望んでいるため、スニペットにはタグが含まれています。


2

MATL、22 31バイト

`jtYz~]xXhc4X4H$ZuZ{Zv

各行には、末尾の行(つまり、enterキーストローク)が入力されます。空行(2回のenterキーストローク)は、入力の終わりを示します。

>> matl `jtYz~]xXhc4X4H$ZuZ{Zv
> foo
> barbaz
> 
 foo
barbaz

説明

`          % do...
  j        % input one string
  tYz~     % is it not empty?
]          % ...while
x          % delete last input (empty string)
Xh         % concatenate all inputs into a cell array
c          % convert to char (2D array). This fills with spaces to the right
4X4H$Zu    % center justify
Z{         % convert to cell array of strings
Zv         % remove trailing blanks of each string

2

ルビー、76 68 61バイト

->t{(s=t.split$/).map{|l|l.center(s.map(&:size).max).rstrip}}

サンプル実行:

2.1.5 :001 > puts ->t{(s=t.split$/).map{|l|l.center(s.map(&:size).max).rstrip}}["Programming Puzzles\n&\nCode Golf"]
Programming Puzzles
         &
     Code Golf

53バイト:->t{(s=t.split$/).map{|l|l.center s.map(&:size).max}}
daniero

私もcenter最初にこの方法を試しましたが、理解したように、それだけでは「出力内の空白の追跡は許可されていません」という規則を破ります。&:sizeパートをありがとう-私もそれを試してみましたが、私は確かに構文の周りに何かを打ちました。
マナトワーク

2

Haskell、111 81 77バイト

l=length
f s|q<-lines s=unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q]

f関数への入力、出力は印刷されません。

使用法:インタープリターghci center.hsでロードし、指定された文字列にfの出力を出力する場合putStr$f"Programming Puzzles\n&\nCode Golf"

編集:34バイトのnimiのおかげで、素晴らしい仕事です!:D


さらに2つのこと:Preludeの最新バージョンには、map:の中間挿入バージョンが含まれています<$>replicate(...)' 'に置き換えることができます[1.. ...]>>" "。全体として:unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q]
nimi

ああ、私はあなたが私が以前に提出した新しい地図の挿入物について言及したことを覚えています。レプリケートトリックはどのように機能しますか?
バジルヘンリー

l1 >> l2l2の(長さl1)のコピーを作成し、それらを連結します。例"abcd" >> [1,2]-> [1,2,1,2,1,2,1,2](<-4つの1つのリストにある1,2のコピー)。私たちの場合、[1..n]>>" "それはスペースのn個のコピーであり、何replicateが同じであるかです。
nimi

いいね、説明ありがとう!:)
バジルヘンリー

2

R、126バイト

コード

for(z in 1){l=scan(,"");m=sapply(l,nchar);t=max(m[m==max(m)]);for(i in 1:length(m))cat(rep(" ",(t-m[i])/2),l[i],"\n", sep="")}

食べない

for(z in 1){                          # any way to get rid of this?
  l=scan(,"")
  m <- sapply(l,nchar)
  t <- max(m[m==max(m)])
  for(i in 1:length(m)){
    cat(rep(" ",(t-m[i])/2),l[i],"\n", sep="")
  }
}

おそらくこれを行うためのより良い方法があり、まだそれに取り組んでいます。


1

Gema、160バイト

\L<T>=@push{i;$0}@set{m;@cmpn{@length{$0};${m;};$m;$m;@length{$0}}}
?=
\Z=@repeat{@sub{@line;1};@set{o;@right{@div{@add{$m;@length{$i}};2};$i}\n${o;}}@pop{i}}$o

適切な配列構造と適切なループ命令なしで言語で何ができるかを見るという私の好奇心のために書かれました。

サンプル実行:

bash-4.3$ gema '\L<T>=@push{i;$0}@set{m;@cmpn{@length{$0};${m;};$m;$m;@length{$0}}};?=;\Z=@repeat{@sub{@line;1};@set{o;@right{@div{@add{$m;@length{$i}};2};$i}\n${o;}}@pop{i}}$o' <<< $'Programming Puzzles\n&\nCode Golf'
Programming Puzzles
         &
     Code Golf

1

Perl 6、61バイト

$/=(my@l=lines)».chars.max;for @l {put ' 'x($/-.chars)/2~$_} # 61 bytes

使用法:

$ perl6 -e '$/=(my@l=lines)».chars.max;for @l {put " "x($/-.chars)/2~$_}' <<< \
'Programming Puzzles
&
Code Golf'
Programming Puzzles
         &
     Code Golf

Perl 5 for @l {では、2バイトのシェービングなどでスペースを削除put " "put" "、別のバイトのシェービングに変更できます。Perl 6についても同様ですか?(Perl 6は知りません。)また、ここに表示される出力は、必要な出力と一致しません。それはタイプミスですか?
msh210

@ msh210 Perl 6は、構文が少し制限されています。しかし、それは他の分野でそれを補います。
ブラッドギルバートb2gills

1

ジャプト、28 25

¡V=VwXl}R;¡Sp½*(V-Xl¹+X}R

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

使い方

¡     V=VwXl}R;¡     Sp½*(V-Xl¹ +X}R
UmXYZ{V=VwXl}R;UmXYZ{Sp½*(V-Xl) +X}R

           // Implicit: U = input string, V = 0
UmXYZ{  }  // Map each item X in U through this function,
         R // splitting U at newlines beforehand:
  V=VwXl   //  Set V to max(X, Y.length).
           // V is now set to the length of the longest line.

UmXYZ{  }  // Map each item X in U with this function,
         R // again splitting U at newlines beforehand:
 ½*(V-Xl)  //  Take V minus X.length, and multiply by 1/2.
Sp         //  Repeat a space that many times.
        +X //  Concatenate X to the end.

0

PHP、98バイト

function($s){foreach($a=explode("
",$s)as$l)echo str_pad($l,max(array_map(strlen,$a)),' ',2),"
";}

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

ゴルフをしていない:

function str_center( $s ) {
    $a = explode( PHP_EOL, $s );
    $m = max( array_map( 'strlen', $a ) );
    foreach( $a as $l ) {
        echo str_pad( $l, $m, ' ', STR_PAD_BOTH ), PHP_EOL;
    }
}

出力:

Programming Puzzles
         &         
     Code Golf   


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