将文本居中!


40

将文本居中!

在此挑战中,您将以各种线条为中心。

例子

Foo
barbaz

 Foo
barbaz
Hello
World

Hello
World
Programming Puzzles
&
Code Golf

Programming Puzzles
         &
     Code Golf

技术指标

每个输入行将始终至少包含一个非空白字符,您可以假设唯一的空白字符是空格()和换行符。每个输入行都没有尾随和/或前导空格(换行符除外)。尾随在输出空白是不是允许。

您应该在输入中最长的线中间居中。如果该行的长度相等,则您的程序/功能应偏向左侧居中。最大行长是您的语言可以处理的,但您的程序应在至少500条长度的行上运行。


排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

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

您还可以将语言名称设置为链接,然后该链接将显示在页首横幅代码段中:

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


这是因此以字节为单位的最短代码胜出!


永远不会有一个以上的内部空间?
2015年

@cat一行上绝不会有任何前导空格或尾随空格(如果有换行符,请期待换行符)
Downgoat

是的,但我的意思是 -spaces一样,字与字之间

1
@cat哦,单词之间可能有多个空格。例如foo(space)(space)(space)bar,一个完全可以接受的输入
Downgoat 2015年

我们可以假设总会有多于1条线吗?
GamrCorps

Answers:


15

Pyth,19个 17字节

2字节感谢Jakube

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

示范

我认为这是中键垫功能第一次.[有用。使用非截断的转置(.T)可找到最长行的长度。

通过在前面添加一个非空格字符,删除空格,然后删除添加的字符,可以删除尾随空格。


1
我们可能需要数组中的最大长度。它经常出现。+1
Maltysen 2015年

规范说“不允许在输出中尾随空白”。这似乎在输出的每个短行上都有尾随空格,因此我不确定它是否有用。
土豆

@potato谢谢-自从我回答以来就添加了。
isaacg 2015年

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
当然,这些都应该在插入模式下完成,对吗?
Alex A.

9
@AlexA。它是在插入模式下完成的。ಠ_ಠ–
门把手

如果您用于sor!反转排序顺序,则可以使用col("$")来获取第一行的长度(现在是自从顺序反转以来的最长),而不是使用G$,总共节省了1个字节!编辑:或者您可以保留排序顺序并G:let &tw=col("$")改用。
2015年

@Marth谢谢!我选择了后者(没有特殊原因)。
门把手

翻阅:h :sort一下,我发现您可以传递正则表达式来跳过排序中的匹配文本,因此可以:sor /./按长度(+4个字节)进行排序,从而可以删除VGrx(-4个字节)和第二个撤消( -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代表“不要问我它是如何工作的,我只是在弄弄它直到产生正确的输出”
cat

4
@cat这就是我打高尔夫球的方式。
lirtosiast 2015年

11

功能性,非竞争性

这一挑战凸显了懒序列极缺乏“最大值”(和最小值)功能的问题,因此...我将它们添加到了核心库中(分别称为⊤和))。因此,我不必费心将此作为高尔夫球场答案提交(它必须包含⊤函数声明才有效),因此这只是主程序。

(function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})()在浏览器控制台中执行以获得更好的渲染。

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

说明

我相信这可能是该网站上使用lambda表达式的第一个Funciton答案。

  • 首先,我们使用ǁ换行符(ASCII 10)分割输入字符串。这将返回一个惰性序列。
  • 我们将该序列传递ɱ给(map),给它一个lambda来计算每个字符串的长度,然后传递最终序列以获得最长的线的长度。
  • 我们还将该序列传递ɱ给另一个序列,给它一个lambda来计算每个字符串的长度,从先前计算的最大行长中减去它,将其除以2(实际上是右移1),产生那么多空格(ASCII 32)然后将字符串连接到这些空格上。(出于几何原因,我声明了一个函数,该函数以相反的参数调用(字符串连接)。)
  • 最后,我们使用ʝ换行符(ASCII 10)作为分隔符,将所有字符串放回原处。


9

视网膜54 52字节

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

\tS可与实际的标签取代,但我用\t在这里,因为否则SE将标签转换为空格。请注意,第二行上有一个前导空格。

在线尝试。

说明

基本思想是匹配比最长的行短至少两个字符(或从技术上说,比其他任何行短两个字符)的行,并将其包围在两个空格中。重复此过程,直到我们不再找到这样的行,这意味着所有行都在最大长度的一个字符以内(其中一个字符用于说明奇偶校验不匹配,并保证将这些行向左移-中央)。

至于实际的正则表达式:

^(.)+$

只需匹配任一行,同时将1每个字符的一个捕获推入组。

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

是一个向后匹配,从右到左匹配,并将光标移动到字符串的开头,以便内部的超前查询可以检查整个字符串。请注意,由于缺少锚点,因此可以在其他任何地方应用前瞻功能,但是不会创建其他匹配项。我们知道这[^\t]将始终匹配字符串中的任何字符,因为就空格而言,保证输入仅包含空格和换行符。

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

这种前瞻性尝试找到的行至少比我们当前匹配的行长两个字符。[^\t]*在字符串中移动以便能够匹配任何行。^确保我们从行首开始。..然后匹配更长行所需的另外两个字符。现在(?<-1>.)+,从组中弹出时,匹配该行中的各个字符1(请注意,该字符.不能与换行符匹配,因此只限于一行)。最后,(?(1)^)断言我们设法清空了整个组1。如果该行比要求的短,则这是不可能的,因为该行中没有足够的字符可以从组1中弹出,通常不足以将其清空。


7

Jolf,3个字节

不竞争,请更新发布日期问题。

在这里尝试!

pci
pc  center
  i  string input

¯\ _(ツ)_ /¯我认为这将是一个有用的功能。


1
这是一个标准漏洞,尽管没有明确禁止,但它的格式不好,除非它是您发现的一种语言(而不是您创建的一种语言)内置的。
Elias Benevedes 2015年

3
@EliasBenevedes我在比赛前添加了该功能。直到变得无关紧要,我才经常更新代码。
Conor O'Brien

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,节省了四个字节。在线尝试。

说明

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}
Martin Ender

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  

感谢@xnor节省了2个字符

输入示例:

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

示例输出:

Programming Puzzles
         &
     Code Golf

最后使用str.center()和str.rstrip以84字节结尾(感谢@JF)。

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

分配len给您两次使用的变量不会节省字符-甚至在5个字符时(甚至是range)也无法达到收支平衡。另外,您可以使用maplist comp。
xnor 2015年

@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
为什么我的答案一直落伍?我认为是时候更改用户名/头像了:p
Downgoat 2015年

固定于2016-07-27。:P
user48538 '16

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
  • 它使用一个字符串数组as $a,用循环遍历每个字符串|%{...}
  • string.padleft()通过% -member快捷方式在每个字符串上调用方法,该方法将所需的最终行长作为参数。
    • 我们需要 array_longest_line_length/2 + current_line_length/2
    • 结束部分是current_line_length/2->$_.length/2
    • 另一部分是每次通过循环都重新计算数组的最大行长,它是通过嵌套循环制作一个行长数组,进行排序,然后取最后一个。


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击键)。空行(两次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

Ruby,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贡献–我也尝试过,但是我确实在语法上有些改动。
manatwork

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"

编辑:感谢nimi的34个字节,干得好!:D


还有两件事:最新版本的Prelude包括一个中缀版本map::<$>replicate(...)' '可以替换为[1.. ...]>>" "。总计:unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q]
nimi 2015年

嗯,是的,我记得您在我之前提交的文档中提到了新的地图中缀。复制技巧如何工作?
basile-henry 2015年

l1 >> l2制作l2的副本(长度为l1)并将其连接起来。例如"abcd" >> [1,2]-> [1,2,1,2,1,2,1,2](在单个列表中<-4份1,2)。在我们的例子中,[1..n]>>" "它是一个空间的n个副本,与副本相同replicate
nimi 2015年

很好,谢谢您的解释!:)
basile-henry

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是这样吗?(我不知道Perl6。)此外,此处显示的输出与所需的输出不匹配。那是错字吗?
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   


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.