我已经解决了84个项目Euler问题,主要是在Haskell中。我现在回去试图在J中解决一些我已经在Haskell中解决的问题,作为学习J的练习。
目前,我正在尝试解决Problem 56。让我强调我已经知道正确答案是什么,因为我已经在Haskell中解决了它。这是一个非常简单,微不足道的问题。 我不会在这里给出答案。
这是我在J的解决方案:
digits =: ("."0)@":"0 eachDigit =: adverb : 'u@:digits"0' NB. I use this so often I made it an adverb. cartesian =: adverb : '((#~ #) u ($~ *:@#))' >./ +/ eachDigit x: ^ cartesian >: i. 99
这会产生小于所需结果的数字。换句话说,它在某种程度上是错误的。那里的任何一个人都知道为什么吗?我很困惑,因为它非常简单,完全是暴力。
答案 0 :(得分:3)
原因是你在游戏中应用扩展精度(x:
)太晚了。你做的第一件事就是切换到扩展精度(例如i. x: 99
),你应该全部设定。
关于cartesian
的其他说明。您可能想看一下J的内置"table" adverb (/
):
^/~ >: i.5
1 1 1 1 1
2 4 8 16 32
3 9 27 81 243
4 16 64 256 1024
5 25 125 625 3125
, ^/~ >: i.3
1 1 1 2 4 8 3 9 27