背景
许多深奥的编程语言都没有在文字上内置数字,因此您必须在运行时进行计算。在许多情况下,数字表示可能会很有趣。在表示欠载数字时,我们已经遇到了挑战。这个挑战是关于在模块化SNUSP中表示数字。(请注意,您不需要学习SNUSP即可完成此挑战-所需的所有信息都在规范中-但您可能会发现背景很有趣。)
任务
出于此挑战的目的,模块化SNUSP数字是由字符@,+和组成的字符串=,除了最后一个字符是#,并且倒数第二个字符必须为+或=(不能为@)。例如,有效号码包括@+#,==#,和@@+@=#; 无效号码的例子包括+=,@@#,和+?+#。
模块化SNUSP编号的值递归计算如下:
#的值为0(这是基本情况)。- 如果数字具有形式
=x,则对于任何字符串x,其值都等于的值x。 - 如果数字具有形式
+x,对于任何字符串x,其值等于的值x加1。 - 如果数字具有形式
@cx,则对于任何单个字符c和任何字符串x,其值等于的值x加上的值cx。
对于这个挑战,您必须编写一个程序,该程序将一个非负整数作为输入,并输出一个字符串,该字符串是可能的最短Modular SNUSP数字,其值等于输入。
澄清说明
- 完全可能存在多个具有相同值的字符串,尤其是对于某些整数,该值与最短的模块化SNUSP编号会有关系。在这种情况下,您可以输出涉及平局的任何数字。
- 查找数字的算法没有限制;例如,强制使用字符串并对其进行求值是一种合法策略,但这样做会更聪明以减少搜索空间。
- 像在PPCG上一样,您的提交可以是完整程序也可以是函数(选择使用您的语言更简洁的那个)。
- 这不是处理输入和输出格式的问题,因此您可以使用任何合理的方式输入非负整数并输出字符串。有上元一个完整的指南,但最常用的法律手段包括函数参数/返回,命令行参数和标准输入/标准输出。
测试用例
以下是前几个数字的最短表示形式:
- 0:
# - 1:
+# - 2:
++# - 3:
+++#或@++# - 4:
++++#或+@++#或@=++# - 5:
@+++#或@@++# - 6:
+@+++#或+@@++#或@=+++#或@=@++#或@@=++# - 7:
@++++#或@+@++# - 8:
@@+++#或@@@++# - 9:
+@@+++#或+@@@++#或@+++++#或@++@++#或@+@=++#或@@=+++#或@@=@++# - 10:
@=@+++#或@=@@++#或@@@=++#(这是一个非常重要的测试用例,因为所有可能的答案都包括在内=) - 11:
@+@+++#或@+@@++#或@@++++#或@@+@++# - 12:
+@+@+++#或+@+@@++#或+@@++++#或+@@+@++#或@=+@+++#或@=+@@++#或@=@=+++#或@=@=@++#或@=@@=++#或@@=++++#或@@=+@++#或@@=@=++# - 13:
@@@+++#或@@@@++# - 14:
+@@@+++#或+@@@@++#或@=@++++#或@=@+@++#或@@+++++#或@@++@++#或@@+@=++# - 15:
@+@++++#或@+@+@++#或@@=@+++#或@@=@@++#或@@@=+++#或@@@=@++#
作为更大的试验情况下,从输入输出40应当是@@@=@@+++#,@@@=@@@++#,@@@@=@+++#,或@@@@=@@++#。
胜利条件
作为代码高尔夫球挑战,获胜者是最短的参赛作品,以字节为单位。
=最好只会出现为@=,对吗?