難解なプログラミング言語Curlyでは、プログラムは中括弧{}
とセミコロンのみで構成されます;
。この謙虚なツールセットにもかかわらず、Curlyには任意の非負整数を表すことができるリテラルがあります。ただし、この形式は初心者にとっては読みにくいため、変換を行うためのコードを作成してみましょう。
数字の形式
カーリー番号は、次の規則に従って構成されます。
- セミコロンを追加すると、番号に1が追加されます。
- 中括弧で囲まれた数値は4倍されます。
- 中括弧グループはネストできますが、連結できません。ブレースは適切に一致する必要があります。
- 中括弧のセットの外側のセミコロンは、前ではなく後でなければなりません。
- 解析のあいまいさを避けるため、数字は常に中括弧で始まる必要があります。
いくつかの例:
{;;} 2*4 = 8
{{;};}; (1*4+1)*4+1 = 21
{};;; 0*4+3 = 3
(ルール5では、0から3までの数字は中括弧の空のペアで始まる必要があることに注意してください。)
そして、いくつかの無効な例:
{{;}{;;}} Curly brace groups side-by-side, not nested
{;}} Unmatched brace
{;{;}} Semicolon before curly-brace group
;;; Number does not start with curly brace
カーリー数のBNF文法は次のとおりです。
<number> ::= "{" <inner> "}" <semis>
<inner> ::= <semis>
| <number>
<semis> ::= ";" <semis>
| ""
同様の番号{;;;;}
(行における3つの以上セミコロン)または{{};}
(不要空ブレース基)が呼び出される不適切カーリー番号。これらは上記の文法に従い、通常の方法で評価できますが、より短い表現も可能です(上記の例、{{;}}
および{;}
それぞれ)。
チャレンジ
文字列を入出力するプログラムまたは関数を作成します。文字列が非負の10進整数である場合、その整数の適切な(可能な限り短い)Curly表現を出力または返します。文字列がカーリー数の場合、その10進表現を出力/返します。
入力は、STDIN、コマンドライン引数、または関数パラメーターを介して受け取ることができます。それはしなければならない文字列です。つまり、Curly数値の文字列を受け入れ、10進数の整数を受け入れる関数を作成することはできません。
出力は、STDOUTに出力するか、関数から返すことができます。関数は、必要に応じて整数を返したり、すべての状況で文字列を返したりする場合があります。
プログラムは、不正な入力(フォーマット規則に違反するカーリー数、浮動小数点数、負の整数、ランダムテキスト)を処理する必要はなく、不適切なカーリー数を処理する必要はありません(以下を参照)。入力は、印刷可能なASCII文字のみで構成されます。
得点
バイト単位の最短コードが優先されます。プログラムが次の両方を実行できる場合:
- 不適切なカーリー数を正しく処理し、
- カーリー番号が与えられた場合、そうでない余分な文字は無視します
{};
次に、スコアから10%を引きます。(整数入力には、ボーナスであっても無関係な文字が含まれることはありません。)
テストケース
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
ボーナスの場合:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
注:Curlyはまだ実装されていません。しかし、この質問がうまくいけば、さらに発展させるかもしれません。