Golfscript-26バイト
{:i.)+.,{;10*i%.}%i>|,}:f;
編集:1
10進表現の長さではなく、10進が終了した場合に出力するように更新されました。
かなり効率的なバージョン。値67890は約10秒で実行され、99991は約20秒で実行されます。反復される範囲が2倍になり、前半は無視されるため、以前よりも少し遅くなります(ほぼ半分の速度)。
代替、26バイト
{:i.)+.n*{*i%.}%i>)^^,}:f;
これはstringを反復処理することで機能します。"\n"*(2*i+1)
ここi
で、値は関数に渡されます。毎回ブロックに渡される値は、の序数値であり"\n"
、10です。
これ)^^
は少しの回避策です。文字列から文字をunconsすると、上記のように、結果は削除された文字の序数値になります。ただし、その値を再び追加すると、文字ではなくその数値の文字列表現が追加されます-かなり非対称的な動作であり、私の意見では設計上の欠陥です。実際にそれを実行したい場合、最初に文字列化するのにかかるコストは1バイトだけです。
最終値の余分なコピーが既にスタックにあるため、最終値を再度削除)
し、文字列でxorし、次にxorし、最初のxorで追加または削除された文字が復元されるようにします。int op string
文字列表現で)^^
はなく文字として扱われた場合、に置き換えることができます|
。
文字列(Golfscriptではintの配列として格納されます)が256の modの各文字の値を表示しますが、各文字の値自体がこの範囲外になる可能性があることに注意してください。一意性(集合演算を介して)または包含性(を介して)をテストする?
場合、表示値ではなく実際の値が比較されます。
現在の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、コア要素は、10進数の循環数を生成するための私のソリューションと同じです。
同じコードのより効率的なバージョン(70バイト):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
値99991は1秒未満かかります。