関数の引数を独自の行に揃える


16

関数定義を表す文字列の入力が与えられたら、関数の引数が改行で区切られて整列されるように、改行とスペースが挿入された文字列を出力します。

入力文字列は次のパターンに従います。

  • まず、プレフィックスで始まります。プレフィックスは常に少なくとも1文字の長さで、文字は含まれません,()

  • 開き括弧(()は、引数リストの始まりを示します。

  • その後、ゼロ個以上の引数のリストが続きます。これらは文字列", "(コンマとスペース)で区切られます。引数には文字は含まれません,()

  • 閉じ括弧())は、引数リストの終わりを示します。

  • 最後に、0個以上の文字であり、文字を含むことがある接尾辞が見つかる 場合があります,()

入力文字列は、印刷可能な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)

回答:


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>>" "本当に賢い
...-アクタークラビリス

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$* 

両方の行の末尾のスペースに注意してください。

その^([^(])*\([^)]*,前に正規表現があるすべてのスペースを置き換えます。置換文字列は改行であり、キャプチャの数に([^(])*プラス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

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あなたが見ることができるように"、私はそれが1つのスペースオフだと思った理由のthatsを。したがって、削除
-andlrc

@ dev-nullそれは私にいつも起こります。
edc65

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