对齐线!


31

对齐线!

给定一个字符和一个多行字符串,您的工作是填充字符串的每一行,以便它们在给定的定界符之间对齐。

例子

输入:

,
Programming, Puzzles
And, Code golf

输出:

Programming, Puzzles
        And, Code golf

输入值

输入将是一个多行字符串和一个字符(您将在其中对齐),您可以按照希望的任何顺序/格式使用它们。字符将每行恰好出现一次。输入的每一行长度可能不同。

输入可以通过函数参数或STDIN。

输出量

输出应以相同的字符串居中。您只能使用一个尾随换行符,而不能尾随空白。

应该用最少的空格填充输出。您不能删除输入中的任何前导空格(如果存在)。

输出可以来自函数返回或STDOUT。


完整程序的输入可以来自命令行参数,还是禁止输入?
DLosc

@DLosc是的,当然
Downgoat

1.对于函数/命令行参数,我们应该读取单个字符串还是每个参数允许一行?2.我们是否必须用最少的间距填充线?
丹尼斯2015年

@Dennis您可以将其放在单个字符串中。或每个参数一行。“您可以按照自己希望的顺序进行处理”。是的,您确实需要用最少的空格填充行。我将编辑规范
Downgoat

@vihan函数可以为每个参数占用一行吗?
xnor

Answers:



13

APL(37)

APL只是不太擅长弦乐处理(或者,我当然也不擅长打高尔夫球)。

{⌽∊R,¨' '/⍨¨(⌈/-+)⍺⍳⍨¨⌽¨R←S⊂⍨S=⊃S←⌽⍵}

这将字符作为其左参数,并将多行字符串作为其右参数。假定多行字符串以换行符结尾(例如,A\nB\nC\n而不是A\nB\nC。)。因为我可以使用“任何格式[希望]”,而且这也是文本文件的常规格式,所以我认为这是合理的。

说明:

  • S←⌽⍵:反转字符串,并将其存储在中S
  • R←S⊂⍨S=⊃S:分割S第一个字符,并将字符串数组存储在中R
  • ⍺⍳¨⌽¨R:反转中的每个字符串R,然后在每个字符串中找到⍺(字符)的索引。
  • (⌈/-+):从最大索引中减去每个索引,得出所需的空间量
  • ' '/⍨¨:对于每个值,生成那么多空格
  • R,¨:在中的每个字符串中添加空格R
  • :将所有字符串连接在一起
  • :将其反转(以恢复原始订单)

例:

      NL←⎕UCS 10 ⍝ newline
      test←'Programming, Puzzles',NL,'And, Code golf',NL
      test ⍝ test string
Programming, Puzzles                
And, Code golf                      

      ⍝ run the function
      +X←','{⌽∊R,¨' '/⍨¨(⌈/-+)⍺⍳⍨¨⌽¨R←S⊂⍨S=⊃S←⌽⍵}test
Programming, Puzzles                        
        And, Code golf                      

      ⍴X ⍝ result is really a string with newlines, not a matrix
44

9

CJam,23 22 20字节

感谢Dennis节省了2个字节。

ea_rf#_:e>\fm.{S*\N}

这将从命令行参数读取行,并从STDIN读取字符。

在线解释器不支持命令行参数,但是您可以在此处测试等效版本。

说明

ea    e# Get the lines from ARGV.
_rf#  e# Duplicate input, read the character and find index of character in each line.
_:e>  e# Duplicate indices and find maximum.
\fm   e# Subtract each index from the maximum index.
.{    e# Apply this block to each pair of line and (max_index - index).
  S*  e#   Get a string with the right amount of spaces.
  \N  e#   Swap spaces with line and push a line feed.
}

9

22 20 18 +1 = 19字节

Y_@?qMgsX(MXy)-y.g

将字符串用作STDIN的命令行参数和定界符(该构想是从Martin的CJam答案中借​​用的)。使用-n标志在单独的行上打印输出值。

                    g is list of cmdline args; s is space (implicit)
    q               Read the delimiter from stdin
 _@?                Construct a lambda function that takes a string and returns
                       the index of the delimiter in it
     Mg             Map that function to each remaining item in g
Y                   Yank the resulting list of indices into the variable y

         (MXy)-y    Take the max of y minus each element in y
       sX           Space, repeated that many times...
                .g  ... concatenated to each item in g
                    Print, newline-separated (implicit, -n flag)

并运行一个示例:

C:\Users\dlosc> pip.py -ne Y_@?qMgsX(MXy)-y.g "Programming, Puzzles" "And, Code golf"
,
Programming, Puzzles
        And, Code golf

7

JavaScript ES 2015,113个字节

f=(c,s)=>s.split`
`.map((e,_,a)=>' '.repeat(a.map(j=>j.indexOf(c)).reduce((g,h)=>g>h?g:h)-e.indexOf(c))+e).join`
`

不像到目前为止发布的高尔夫语言那么短。将输入作为两个函数参数,例如f(',','Programming, Puzzles\nAnd, Code golf')。下面的代码段是不完整的,包括一种简单的测试方法。

f=function(c,s){
  return s
    .split('\n')
    .map(function(e,_,a){
      return ' '.repeat(
        a.map(function(f){
          return f.indexOf(c)
        }).reduce(function(g,h){
          return g>h?g:h
        })-e.indexOf(c)
      )+e
    })
    .join('\n')
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('char').value,document.getElementById('string').value)};document.getElementById('run').onclick=run;run()
<label>Character: <input type="text" id="char" value="," maxlength="1" /></label>
<textarea id="string" rows="4" cols="30" style="display:block">
Programming, Puzzles
And, Code Golf</textarea><button id="run">Run</button><br />
<pre id="output"></pre>



5

朱莉娅,117个字节

f(c,t)=(s=[split(l,c)for l=split(t,"\n")];join(map(i->lpad(i[1],maximum(map(i->length(i[1]),s))," ")*c*i[2],s),"\n"))

取消高尔夫:

function f(c::String, t::String)
    # Create an array of arrays by splitting on newlines and
    # then on the given delimiter
    s = [split(l, c) for l in split(t, "\n")]

    # Find the maximum length on the left side of the delimiter
    m = maximum(map(i -> length(i[1]), s))

    # Rejoin on the delimiter and pad each line with spaces,
    # and rejoin this with newlines
    join(map(i -> lpad(i[1], m, " ") * d * i[2], s), "\n")
end

5

Python 3,85(IDLE 3.2.2,Windows)

c,*s=input().split('\n')
for x in s:print(' '*(max(z.find(c)for z in s)-x.find(c))+x)

非常简单。这将两次查找字符在字符串中的位置:一次查找最大值(每行一次),一次查找偏移量。我尝试将它们组合在一起,但是时间更长。

Python 3用于输入解包。MY IDLE似乎将多行字符串作为输入。


@DLosc在多行字符串的IDLE粘贴中对我有效。
xnor

嗯 当我这样做时(IDLE 3.3.4,Windows 7),c获取分隔符并s获取一个空列表。随后的调用input()将其余行一一返回。
DLosc 2015年

@DLosc奇怪。我将字符串直接从浏览器复制粘贴到“空闲”提示中。你也一样吗 空闲3.2.2,Windows 7以防万一。
xnor 2015年

相同。这是屏幕截图 ...
DLosc

@DLosc仍然对我有用(截图)。尽管我不了解发生了什么,但我要说的是编译器或环境特定的行为,并且我编辑以尝试指定相关信息。功能版本是较长的3个字符在Python 2
XNOR

3

果冻,12 字节

Ỵ©w€µạṀ⁶ẋż®Y

在线尝试!

完成与golfed 凯尔德coinheringaahingĴ伊丽^ h yper 牛逼下雨(JHT) ,我们的果冻做法聊天室。

怎么运行的

第三个命令行参数(第一个输入)应该是多行字符串,而字符应该是第四个命令行参数(第二个输入)。

是〜完整程序。

Ỵ〜用换行符分隔字符串。
 ©〜将结果复制到寄存器。
  w〜〜获取每行上字符首次出现的索引。
      Ṁ〜取最大。
    µạ〜并将其从每个索引中减去,取绝对值。
       ⁶ẋ〜重复一个空格多次(向量化)。
         〜®〜交错存储在寄存器中。
           是〜通过换行符连接并隐式打印。

我不确定是否允许将输入作为行列表,因此这需要多行字符串作为输入。如果允许:

10字节

w€µạṀ⁶ẋż³Y

在线尝试!


1
就是在那时,您知道您已经成功创建了一个房间
Erik the Outgolfer

2

Matlab /八度,106字节

该函数对字符,字符串和字符串使用三个单独的参数;并在stdout中给出结果:

function f(c,s,t)
p=find(s==c)-find(t==c);disp([repmat(32,1,max(-p,0)) s]),disp([repmat(32,1,max(p,0)) t])

Matlab中的示例:

>> f(',', 'Programming, Puzzles', 'And, Code golf')
Programming, Puzzles
        And, Code golf

或者使用Octave解释器在线尝试


2

朱莉娅,80字节

f(c,s)=(t=split(s,'
');u=[search(i,c)for i=t];join([" "].^(maxabs(u)-u).*t,'
'))

取消高尔夫:

function f(c,s)
  # converts multiline string to array of single-line strings
  t=split(s,'\n')

  # creates array of positions of delimiter
  u=[search(i,c)for i=t]

  # Appends appropriate number of spaces to each line
  # (uses elementwise operations to achieve this result)
  v=[" "].^(maxabs(u)-u).*t

  # Recombines array of strings to multiline string and returns
  return join(v,'\n')
end

2

JavaScript(ES6),105

使用模板字符串,两条换行符很重要并已计数。

测试在任何与EcmaScript 6兼容的浏览器中运行的代码段(即FireFox。Chrome不支持默认参数)

f=(s,c,p=(s=s.split`
`).map(r=>m<(v=r.indexOf(c))?m=v:v,m=0))=>s.map((r,i)=>' '.repeat(m-p[i])+r).join`
`

// Ungolfed
f=(s,c)=>{
  s=s.split('\n')
  p=s.map(r=>r.indexOf(c))
  m=Math.max(...p)
  s=s.map((r,i)=>' '.repeat(m-p[i])+r)
  return s.join('\n')
}  

// TEST
out=x=>O.innerHTML+=x+'\n'

out(f(`Programming, Puzzles
And, Code golf`,','))
<pre id=O></pre>


2

Python 2,93字节

def f(x,y,z):
 p=y.index(x)-z.index(x)
 if p<0:y=" "*abs(p)+y
 else:z=" "*p+z
 print y+'\n'+z

这样称呼:

f(',','Programming, Puzzles','And, Code Golf')

2

C#4.0,329个 320 307字节

using System;class P{static void Main(){Func<char,dynamic>f=(d)=>Console.ReadLine().Split(d);var c=f(' ')[0][0];var m=0;var l=new string[9999][];var z=0;for (l[z]=f(c);l[z].Length==2;l[z]=f(c)){m=Math.Max(l[z][0].Length,m);z++;}for(var i=0;i<z;i++){Console.WriteLine("{0,"+m+"}"+c+"{1}",l[i][0],l[i][1]);}}}

非高尔夫版本:

using System;
class P
{
    static void Main()
    {
        // lamba to to read a line and split on a char, returns an array of 
        Func<char,dynamic>f=(d)=>Console.ReadLine().Split(d); 
        // read the separator char by taking the first char of the first string 
        // in the array
        // use our lambda
        var c=f(' ')[0][0];
        var m=0; // max position where char is found
        var l=new string[9999][]; // hold all input
        var z=0; // count valid entries in l
        // loop until the input doesn't contain an
        // array with 2 elements
        // here we use our lambda agian, twice
        for (l[z]= f(c);l[z].Length==2;l[z] = f(c))
        {
            // calculate max, based on length 
            // of first element from the string array
            m=Math.Max(l[z][0].Length,m);
            z++; // increase valid items
        }
        // loop over all valid items
        for(var i=0;i<z;i++)
        {
        // use composite formatting with the padding option
        // use the max to create a format string, when max =4 
        // and seperator char is , this will give
        // "{0,4},{1}"
            Console.WriteLine("{0,"+ m +"}"+c+"{1}",l[i][0],l[i][1]);
        }
    }
}

它确实接受最多9999行...


2

Dyalog APL22 20 16字节

-4感谢ngn。

如果允许使用数组,APL实际上在字符串处理方面还不错。在此挑战中,我们可能选择最合适的格式,对于APL而言,它意味着将文本向量的向量作为左参数,将定界符作为标量右参数。这甚至可以处理每行多个定界符,并对齐每行的第一个。

⊣,¨⍨' '⍴¨⍨⌈.⍳-⍳¨

⊣,¨⍨ 在每行前面加上

' '⍴¨⍨ 尽可能多的空间

⌈.⍳ 行中字符最右边的索引

- 减去

⍳¨ 每行中字符的索引

在线尝试APL!添加到垂直打印输出中)

奖金? 适用于任意数量的字符串和定界符(最左对齐)。


⊣,¨⍨' '⍴¨⍨⌈.⍳-⍳¨
ngn

当然是。
亚当

1

C#,191

作为功​​能。大致移植了我的JS答案。

using System.Linq;string f(string s,char c){var q=s.Split('\n');int m=0,v;Array.ForEach(q,x=>m=m<(v=x.IndexOf(c))?v:m);return String.Join("\n",q.Select(x=>new String(' ',m-x.IndexOf(c))+x));}

1

Ruby,74个字节

l=lambda{|d,s|s.each{|e|puts ' '*(s.map{|f|f.index(d)}.max-e.index(d))+e}}

并称它为

l.call ',',['Programming, Puzzles','And, Code golf']

1

R,68字节

function(c,x,y,r=regexpr)cat(x,"\n",rep(" ",r(c,x)-r(c,y)),y,sep="")

带有3输入的未命名函数;c是要对齐的字符,x是第一个字符串和y第二个字符串。

在R中,函数regexpr返回字符串中给定模式的位置。该解决方案通过regexpr在两个字符串上都应用并重复等于差异的空白,然后仅打印两个输入并用换行符分隔来工作。


0

Python 2,67 66字节

def a(d,l):
 i=l[0].index(d)
 for e in l:print' '*(i-e.index(d))+e

致电:

a(',', ['Programming, Puzzles', 'And, Code golf'])

0

Moonscript,138个字节

(n)=>
 i=0
 @='
'..@
 l=[b-a for a,b in @gmatch "
().-()"..n]
 m=math.max unpack l
 (@gsub '
',(a)->
  i=i+1
  a..(' ')\rep m-l[i])\sub(2)

这将返回一个带有2个参数的函数。第一个是字符串,第二个是要对齐的字符。这些参数是隐式参数@和n。

首先,我将新行添加到字符串中,以简化处理。

@='
'..@

现在,我使用生成了每个对齐字符位置的列表gmatch。接下来,我用正确的空格数替换每行之前的换行符,然后修剪在开头添加的换行符。


0

Lua,169个字节

function a(d,t)m={}for k,v in pairs(t)do m[#m+1]=string.find(v,d)end o=math.max(unpack(m))for k,v in pairs(t)do print(string.rep(" ",o-(string.find(v,d)or 0))..v)end end

没有其他答案那么短,但这是我的第一个:D


0

视网膜,71字节

+`^((.)(.*¶)*)((.)*\2.*¶)((?<-5>.)*(?(5)\2|(.)\2).*)
$1$#7$* $4$#5$* $6

在线尝试!注意:这将在输出中保留对齐字符;可以删除它,但要花费4个字节。如果只需要对齐两个字符串,则为52个字节:

^(.)¶((.)*\1.*¶)((?<-3>.)*(.)*\1.*)
$#5$* $2$#3$* $4

说明:

^(.)¶

这与对齐字符匹配。

((.)*\1.*¶)

这与第一行匹配,并且还跟踪对齐字符之前有多少个字符。(.NET为每个变量保留一个匹配栈,在这种情况下为$3。)

((?<-3>.)*(.)*\1.*)

这与第二行匹配,试图说明与第一行中找到的字符一样多的字符。?<-3>使匹配项弹出每个字符的堆栈,直到它为空为止,此时匹配失败,(.)*然后将其余字符与对齐字符匹配。此时,我们具有以下变量:

  • $1 包含对齐字符
  • $2 包含第一行
  • $3 包含一个堆栈,其长度为第一行前缀减去第二行前缀
  • $4 包含第二行
  • $5 包含一个堆栈,其长度为第二行前缀减去第一行前缀

$#5$*然后在必要的空格数前面加上前缀,以使第一行与第二行对齐,反之亦然$#3$*

类似的逻辑适用于主要答案,除了这里我们必须找到两条不对齐的线以便我们可以对齐它们(这是输入的地方?(5)),然后在所有行上重复对齐,直到它们均等地对齐为止。


0

Common Lisp,101个字节

(lambda(c l)(dolist(x l)(format t"~,,v@a~%"(-(apply'max(mapcar(lambda(x)#1=(position c x))l))#1#)x)))

第一个参数是字符,第二个参数是要对齐的字符串列表。

在线尝试!

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.