Golfscript-26个字节
{:i.)+.,{;10*i%.}%i>|,}:f;
编辑:1
如果小数结束,则更新为输出,而不是小数表示的长度。
一个相当有效的版本。值67890在大约10秒内运行,而99991在20秒左右运行。它比以前慢了一点(大约快了一半),因为迭代的范围已加倍,但忽略了前一半。
备用,也是26个字节
{:i.)+.n*{*i%.}%i>)^^,}:f;
这是通过遍历string来工作的"\n"*(2*i+1)
,i
传递给函数的值在哪里。每次传递给块的值都是的序数值"\n"
,即10。
这)^^
是一个变通办法。如上所述,当您从字符串中取消对字符的约束时,结果是删除的字符的序数值。但是,重新附加该值将附加该数字的字符串表示形式,而不是字符(相当不对称的行为),并且在我看来是设计缺陷。如果您确实想这样做,则首先进行字符串化只会花费一个字节。
最终值的额外副本已经在堆栈上,因此我再次删除了最终值)
,将其与字符串进行异或,然后再次对其进行异或,以便恢复由第一个异或添加或删除的所有字符。如果int op string
被视为字符,而不是字符串表示形式,则)^^
可以替换为|
。
请注意,虽然字符串(在Golfscript中存储为int数组)将显示每个字符mod 256的值,但是每个字符的值本身可能超出此范围。在测试唯一性(通过设置操作)或包含性(通过?
)时,将比较的是实际值,而不是显示值。
当前Golfscript解释器的补丁文件:
61c61
< to_gs
---
> Gstring.new([self])
以上只会影响的行为string op int
(反之亦然),其中op
是之一
+-|&^
。其他所有内容(包括的行为)均不受影响Gint`
。
以下24字节解决方案将变为有效:
{:i.)+.n*{*i%.}%i>|,}:f;
这也解决了许多其他非常丑陋的解决方法。
Python-48个字节
f=lambda n:len(set(10**-~i%n for i in range(n)))
不是最有效的解决方案,但是对于小于100000的值是合理的。
FWIW,核心元素与我的生成十进制循环数的解决方案相同。
相同代码的更有效版本(70字节):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
值99991需要一秒钟以内。