更简洁的方法来旋转 J 中数字的数字

More concise way to rotate the digits of a number in J

我写了一个相对简单的动词来旋转数字的数字(按照 Project Euler #35 要求的方式)。所以,如果我从 197 开始,我会得到 197 971 719,也就是说,第一个数字排在最后,直到我们回到开始的地方。

这是我的动词:".@(|.~"1 0 i.@#)@":"0。 (实际上,我的更进一步并添加了 ~. 来删除欺骗,但这不是必需的。)在 J 中是否有更简洁的方法来做到这一点?

它并不短,但我发现它在某种程度上更简洁:

v =: 1&|.^:(<@#)&.":
v 1234
1234 2341 3412 4123
v 197
197 971 719

它使用 1-shift 1&|.^:(幂)而不是变量 shift 和 &.(下)从整数转换为字符串并返回。

一种略有不同的方法是将格式化后的数字制作成一个矩阵,其中包含 n 行 n+1 位数字,其中 n 是数字位数,然后删除最后一列。

   v=. }:"1@($~(,>:)@#)&.": 
   v 1234
1234 2341 3412 4123
   v 197
197 971 719

在这种形式中,它使用了 2 个钩子,弄清楚这总是很有趣。 (,>:) 加一并附加到参数 ($~(,>:)@#) 获取格式化数字并将其整形为 n,n+1 矩阵。 另请注意,它不使用 |.(旋转)