这个问题的灵感来自这个答案。碰巧的是,我小时候曾经使用埃塞俄比亚乘法,但直到最近才知道该方法的名称。
埃塞俄比亚乘法是仅使用加法,加倍和减半对整数进行乘法的方法。
方法:
- 取两个数字相乘,然后将其写下两列的顶部。
- 在左列中,将最后一个数字重复减半,舍弃所有余数,然后将结果写在同一列中的最后一个下面,直到写入值1。
- 在右侧栏中,重复将最后一个数字加倍,然后将结果写在下面。将结果添加到与左列显示1相同的行时停止。
- 检查生成的表,并丢弃左列中的值是偶数的任何行。将右侧列中的值相加,得出将原始两个数字相乘得到的结果。
例如:17 x 34
17 34
将第一列减半:
17 34
8
4
2
1
将第二列加倍:
17 34
8 68
4 136
2 272
1 544
删除第一个单元格为偶数的行,我们将这些数字放在方括号中的右边,以实现此目的:
17 34
8 [68]
4 [136]
2 [272]
1 544
将右侧栏中的剩余数字相加:
17 34
8 [68]
4 [136]
2 [272]
1 544
=====
578
因此,用埃塞俄比亚方法乘以17乘以34得出578。
任务:
包含两个介于1和1000之间的数字并且执行相同布局和算法的Golf代码,并在下面显示产品。
输入法:但是您选择...
输入示例:
19 427
结果输出:
19 427
9 854
4 [1708]
2 [3416]
1 6832
======
8113
请注意数字的对齐方式。这在布局中最重要。另请注意,以等号布置的双线必须比整体答案长两个字符,并且必须居中对齐。
测试中
您将如何测试呢?通过使用两个数字来运行程序。这些号码可以从您的用户ID号码中提取出来(可以通过将光标悬停在顶部窗口的头像上来获得)。取您的数字并取最后三位数字,这将是数字B,取前面剩下的其他任何东西,即数字A。然后测试A乘以B。
测试示例:
我的用户ID号是8555,所以我的数字是8和555。因此我的输出应如下所示:
8 [555]
4 [1110]
2 [2220]
1 4440
======
4440
限制条件:
如算法中所述,除使用“加倍”外,不允许任何本机乘法运算符。换句话说,如果您使用*等运算符,则只能将其乘以2。
不遵守此规定的条目将不予考虑,用户将被装满装满物品的纸板箱护送离场。每个条目都有代码,并根据您的用户ID号进行测试。
这是代码高尔夫。最短的字节数将得到同龄人的奖赏,荣耀和钦佩……(也许还有兰博基尼……我说“也许”!)
*
或x
),但是无法检测是否使用了乘法。除了那部分,挑战很有趣。