在深奥的编程语言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个分号)或{{};}
(不必要的空括号组)之类的数字称为不正确的 Curly数字。他们遵守上面的语法,并且可以以通常的方式进行评价,但它们也能够缩短表示的(对于上述实例中,{{;}}
和{;}
分别地)。
挑战
编写一个输入或接收字符串的程序或函数。如果字符串是非负十进制整数,则输出/返回该整数的正确(即,最短的)卷曲表示形式。如果字符串是Curly数字,则输出/返回其十进制表示形式。
可以通过STDIN,命令行参数或函数参数接收输入。它必须是一个字符串。也就是说,您可能无法编写一个函数,该函数接受用于Curly数字的字符串,但接受用于十进制数字的整数。
输出可以打印到STDOUT或从函数返回。一个功能可能在适当的时候返回整数,或者在所有情况下都可以返回字符串。
您的程序不必处理错误的输入(违反格式规则的弯曲数字,浮点数,负整数,随机文本),并且它不需要需要处理不当卷毛号(见下文)。输入将仅包含可打印的ASCII字符。
计分
以字节为单位的最短代码获胜。如果您的程序可以执行以下两项操作:
- 正确处理不正确的Curly数字,并且
- 当给定一个Curly数字时,请忽略所有多余的字符
{};
然后从您的分数中减去10%。(即使有奖励,整数输入也不会有多余的字符。)
测试用例
Input Output
{;;} 8
{{;};}; 21
{};;; 3
{{{{;}}};} 260
{} 0
4 {;}
17 {{;}};
1 {};
0 {}
96 {{{;};;}}
对于奖金:
{};;;;; 5
{{;;;;};;} 72
c{u;r;l}y;! 9
42{;} ;;;; 8
注意:尚未实现Curly。但是,如果这个问题解决得当,我可能会进一步发展。