挑战:
在社交网络上流传着一个愚蠢的谜题,上面写着:
8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?
实现一个功能或操作给定两个正整数时,x
和y
这样x > y > 0
,得到的正确答案为整数,如果回答的数字是数字x * y
后跟数字的x + y
后面的数字x - y
。很简单的。
规则:
- 不允许出现标准漏洞。
- 这是代码高尔夫球,因此以字节为单位的最短代码获胜。
- 输入数据验证不是必需的。当输入无效时,该程序可能崩溃或返回垃圾。
- 您可以使用数字函数和运算符(包括整数和浮点数,数学库函数以及其他接受和返回数字的函数)。
- 如果适用,您可以使用返回数字位数的函数。
- 你不是允许使用字符串或任何类型的代码中的级联的任何地方。
- 结果可能会被返回或推入堆栈,无论哪种语言都适用。结果必须是整数,而不是字符串。
样例代码:
以下代码创建一个名为的二元运算符X
。
X←{(⍺-⍵)+((⍺+⍵)×10 * 1 +⌊10⍟⍺-⍵)+⍺×⍵×10 *(2 +⌊10⍟⍺+⍵)+⌊10⍟⍺- ⍵}
说明:
在APL中,您从右到左求值。
⍺ and ⍵
分别是左和右操作数⌊10⍟⍺-⍵
读取:floor of log10(⍺-⍵)
。首先执行减法,然后对数,然后求底。从右到左。进行log10以便计数的位数⍺-⍵
(之后必须加1)。⍺×⍵×10*(...)
读取:10 to the (...)th power, multiplied by ⍵, multiplied by ⍺
因此,
⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵
是乘积之和向左移动了总和与差之和的位数。乘以10的幂将使整数向左移动。((⍺+⍵)×10*1+⌊10⍟⍺-⍵)
是总和,向左移动差值的位数。(⍺-⍵)
就是区别。此处无需移动。X←{...}
是您在APL中定义运算符的方式。
例子:
8 X 2
16106
5 X 4
2091
9 X 6
54153
GNU DC:
以下代码创建一个名为的宏a
:
[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa
说明:
sx
并sy
从堆栈中弹出一个元素,并将其分别保存在寄存器x
和中y
。lx
和ly
来自寄存器加载元件x
和y
分别并将其推到堆栈中。d
复制堆栈中的最后一个元素。^
计算两个数字的幂。Z
弹出一个数字并返回其数字位数。这样做是因为dc
没有对数功能。[...]sa
将宏存储在寄存器中a
。la
加载它。x
在堆栈顶部执行宏。
例子:
8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153