对齐函数参数


16

给定代表函数定义的字符串输入,输出带有换行符和空格的字符串,以使函数的参数以换行符分隔并对齐。

输入字符串将遵循以下模式:

  • 首先,它将以前缀开头,该前缀始终至少一个字符长,并且不包含任何字符,()

  • (然后,括号()将标记参数列表的开始。

  • 然后是零个或多个参数的列表。这些由字符串", "(逗号,然后是空格)分隔。所有参数均不包含任何字符,()

  • 圆括号())将标记参数列表的结尾。

  • 最后,可以找到一个后缀,该后缀的长度为零个或更多,并且 可能包含字符,()

输入字符串将仅由可打印的ASCII组成(这意味着它绝不会包含换行符)。

输出必须是:

  • 前缀(逐字向下复制)和右括号。

  • 参数列表,这次不是用", "逗号,换行符分隔,而是垂直对齐每个参数的第一个字符所需的空格。

  • 封闭括号和后缀(如果存在)逐字记录。

由于这是,因此以字节为单位的最短代码将获胜。

测试用例(格式:单行输入,然后是输出,然后是双换行):

def foo(bar, baz, quux):
def foo(bar,
        baz,
        quux):

int main() {
int main() {

fn f(a: i32, b: f64, c: String) -> (String, Vec<i32>) {
fn f(a: i32,
     b: f64,
     c: String) -> (String, Vec<i32>) {

function g(h) {
function g(h) {

def abc(def, ghi, jkl, mno)
def abc(def,
        ghi,
        jkl,
        mno)

x y z(x, y, z) x, y, z)
x y z(x,
      y,
      z) x, y, z)

Answers:


7

Haskell,115个字节

import Data.Lists
f x|(a,b:c)<-span(/='(')x,(d,e)<-span(/=')')c=a++b:intercalate(",\n "++(a>>" "))(splitOn", "d)++e

用法示例:

*Main> putStrLn $ f "fn f(a: i32, b: f64, c: String) -> (String, Vec<i32>) {"
fn f(a: i32,
     b: f64,
     c: String) -> (String, Vec<i32>) {

怎么运行的:

bind
  a: everything before the first (
  b: the first (
  c: everything after the first (
  d: everything of c before the first )
  e: everything of c from the first ) to the end

construct the output string by concatenating
  a
  b
  splitting d at the argument separator ", " and rejoining it with ",\n " followed by (length a) spaces    
  e

a>>" "真的很聪明……
Actorclavilis '02

4

Japt,23个字节

¡Y?X:Xr',",
"+SpUb'(}')

在线测试!

怎么运行的

               // Implicit: U = input string
¡        }')   // Map each item X and index Y in U.split(")") to:
Y?X            //  If Y is non-zero, X. This keeps e.g. "(String, Vec<i32>)" from being parsed.
:Xr',",\n"+    //  Otherwise, X with each comma replaced with ",\n" concatenated with
SpUb'(         //  U.indexOf("(") spaces.
               // Implicit: re-join with ")", output

3

Perl,62 52 + 2 = 54字节

s/\(.*?\)/$a=$"x length$`;$&=~s|(?<=,)[^,]+|\n$a$&|gr/e

需要-p标志:

$ echo "x y z(x, y, z) x, y, z)
fn f(a: i32, b: f64, c: String) -> (String, Vec<i32>) {" | \
perl -pe's/\(.*?\)/$a=$"x length$`;$&=~s|(?<=,)[^,]+|\n$a$&|gr/e'
x y z(x,
      y,
      z) x, y, z)
fn f(a: i32,
     b: f64,
     c: String) -> (String, Vec<i32>) {

怎么运行的:

# '-p' reads first line into $_ and will also auto print at the end
s/\(.*?\)/             # Match (...) and replace with the below
  $a=$"x length$`;     # $` contains all the content before the matched string
                       # And $" contains a literal space 
  $&=~s|               # Replace in previous match
    (?<=,)[^,]+        # Check for a , before the the string to match
                       # This will match ' b: f64', ' c: String'
  |\n$a$&|gr/e         # Replace with \n, [:spaces:] and all the matched text

3

视网膜,31字节

(?<=^([^(])*\([^)]*,) 
¶ $#1$* 

注意两行末尾的空格。

我们替换^([^(])*\([^)]*,前面有正则表达式的每个空格。替换字符串将是一个换行符,并且捕获的数量与([^(])*加上一个空格。

稍后会有更连贯的解释。

在这里在线尝试。


3

ES6,68 67个字节

s=>s.replace(/\(.*?\)/,(s,n)=>s.replace/, /g, `,
 `+` `.repeat(n)))

这是通过从原始字符串中提取参数列表,并将每个参数分隔符替换为根据原始字符串中参数列表的位置计算出的缩进来实现的。

编辑:由于@ETHproductions,节省了1个字节。


我想知道你为什么这样做.split`, `.join(...),而不是.replace(...)。事实证明另一个短了一个字节:s=>s.replace(/\(.*?\)/,(s,n)=>s.replace(/, /g,`,\n `+` `.repeat(n)))
ETHproductions's

2

Pyth,35 30字节

+j++\,b*dhxz\(c<zKhxz\)", ">zK

在这里尝试!

说明:

+j++\,b*dhxz\(c<zKhxz\)", ">zK    # z = input()

                 Khxz\)           # Get index of the first ")"
               <z                 # Take the string until there...
              c        ", "       # ...and split it on the arguments
 j                                # Join the splitted string on...
  ++                              # ...the concatenation of...
    \,b                           # ...a comma followed by a newline...
       *dhxz\(                    # ...followed by the right amount of spaces = index of the first "(" + 1
+                         >zK     # Concat the resulting string with the postfix

2

Groovy,137 89 95字节

Groovy 不是 “正确的工作工具”™。编辑:当您有大脑的人使用它时,它的工作原理就很好了...

f={s=(it+' ').split(/\0/)
s[0].replace(',',',\n'+(' '*it.indexOf('(')))+')'+s[1..-1].join(')')}

测试:

println f("def foo(bar, baz, quux):")
println f("int main() {")
println f("fn f(a: i32, b: f64, c: String) -> (String, Vec<i32>) {")
println f("function g(h) {")
println f("def abc(def, ghi, jkl, mno)")
println f("x y z(x, y, z) x, y, z)")

有点不符合要求:

f = {String it ->
    def str = (it + ' ').split(/\)/)
    return (str[0].replace (',', ',\n'+(' ' * it.indexOf('('))) + ')' + str[1])
}


1

JavaScript(ES6),85

s=>s.replace(/^.*?\(|[^),]+, |.+/g,(x,p)=>[a+x,a=a||(p?`
`+' '.repeat(p):a)][0],a='')

测试

f=s=>s.replace(/^.*?\(|[^),]+, |.+/g,(x,p)=>[a+x,a=a||(p?`
`+' '.repeat(p):a)][0],a='')

console.log=x=>O.textContent+=x+'\n'

;['def foo(bar, baz, quux):',
  'int main() {',
  'fn f(a: i32, b: f64, c: String) -> (String, Vec<i32>) {',
  'function g(h) {',
  'def abc(def, ghi, jkl, mno)',
  'x y z(x, y, z) x, y, z)']
.forEach(t=>console.log(t+'\n'+f(t)+'\n'))
<pre id=O></pre>


抱歉,我很误会,正在控制台中运行代码,并且输出是这样的:"x y z(x正如您所看到的,"这就是为什么我认为这是一个空白。因此,删除
andlrc '16

@ dev-null一直发生在我身上。
edc65 '16

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.