バックグラウンド
(真実の、心が痛む物語に基づいて)
私の時間の中で、私はLispや同様の言語でよく遊んでいました。私はそれらで書いて、実行して、解釈して、設計して、マシンに私のために書いてもらいました...そして、もし私を悩ますことがあるなら、それは私の特定のフォーマットスタイルに準拠していないLispを見ています。
残念ながら、一部のテキストエディター(咳 XCode 咳)は、コードをコピーして貼り付けるたびに美しいタブとスペースを削除する傾向があります。
(A
(B
(C)
(D))
(E))
(ABCDE
任意の関数はどこにありますか)
一部のテキストエディターは、この素敵なコードを次の目的で処理します。
(A
(B
(C)
(D))
(E))
なんてこった!それは読めません!
ここで私を助けて?
チャレンジ
この課題の目標は、以下で説明する形式で改行で区切られた一連の関数を取得し、読みやすさと優雅さを強調するより美しい配置を返すことです。
入力
F
アリティN
引数の関数を、次のような構成体として定義します。
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
G1, G2, ..., GN
すべての機能はそれ自体でどこにありますか。アリティ0
関数A
は単純(A)
ですが、アリティ2
関数B
の形式は(B (...) (...))
コードは、すべての関数の先頭の括弧(最初の関数を除く)の前に、単一の改行を持つ一連の関数として入力を受け取る必要があります。上記の例は有効な入力です。
あなたは仮定することができます:
- 括弧はバランスが取れています。
- 関数を250回以上インデントする必要はありません。
- すべての機能は括弧で囲まれています。
()
- 関数の名前には、印刷可能なASCII文字のみが含まれます。
- 関数の名前に括弧やスペースが含まれることはありません。
- 入力時にオプションの末尾の改行があります。
出力
コードは同じ関数セットを出力する必要がありますが、変更されるのは、関数の先頭の括弧の前にスペースまたはタブを追加することだけです。出力は次のルールに準拠する必要があります。
- 指定された最初の関数(およびその後のトップレベル関数)には、先行スペースを含めないでください
- 関数の水平位置の引数は、その関数の水平位置の右側にあるタブ1つです。
- タブは実装定義ですが、少なくとも3つのスペースが必要です。
- オプションで、各行の後に最大2つのスペースを印刷できます。
ルール
- これはコードゴルフです:最短のコードが勝ちます!
- 標準の抜け穴は許可されていません。
例
入力:
(A
(B
(C)
(D))
(E))
出力:
(A
(B
(C)
(D))
(E))
入力:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
出力:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
入力:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
出力:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
()
ますか?