背景
许多深奥的编程语言都没有在文字上内置数字,因此您必须在运行时进行计算。在许多情况下,数字表示可能会很有趣。在表示欠载数字时,我们已经遇到了挑战。这个挑战是关于在模块化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应当是@@@=@@+++#
,@@@=@@@++#
,@@@@=@+++#
,或@@@@=@@++#
。
胜利条件
作为代码高尔夫球挑战,获胜者是最短的参赛作品,以字节为单位。
=
最好只会出现为@=
,对吗?