Golfscript - 26 bayt
{:i.)+.,{;10*i%.}%i>|,}:f;
Düzenle: 1
ondalık gösterimin uzunluğu yerine ondalık sona ererse çıktı olarak güncellenir .
Oldukça verimli bir versiyon. 67890 değeri yaklaşık 10 saniye ve 99991 yaklaşık 20 saniye içinde çalışır. Öncekinden biraz daha yavaş (kabaca yarısı kadar hızlı), çünkü yinelenen aralık iki katına çıktı, ilk yarısı yok sayıldı.
Alternatif, ayrıca 26 bayt
{:i.)+.n*{*i%.}%i>)^^,}:f;
Dize üzerinde yineleme ile gerçekleştirilen bu bir eser "\n"*(2*i+1)
, nerede i
işleve geçirilen değerdir. Her seferinde bloğa iletilen değer, sıra değeri "\n"
olan 10'dur .
)^^
Bir iş çevresinde bir parçasıdır. Bir dizeden bir karakteri çözdüğünüzde , sonuç yukarıda belirtildiği gibi kaldırılan karakterin sıralı değeridir. Bununla birlikte, bu değerin tekrar eklenmesi , karakterden ziyade bu sayının dize temsilini ekleyecektir - oldukça simetrik olmayan davranış ve bence bir tasarım hatası. Bunu gerçekten yapmak istediyseniz, önce dizgi yapmak yalnızca bir bayta mal olur.
Nihai değerin fazladan bir kopyası zaten yığın üzerindedir, bu yüzden ilk değeri yeniden )
ekler veya kaldırır, böylece ilk değeri yeniden ekler veya kaldırır. int op string
Dize temsilinden ziyade bir karakter olarak ele alınırsa , onun )^^
yerini alabilir |
.
Dizelerin (Golfscript'te bir dizi girişi olarak saklandığı) her karakter modunun 256 değerini görüntülerken, her karakterin değerlerinin kendisinin bu aralığın dışında olabileceğini unutmayın. Teklik (ayarlanmış işlemler aracılığıyla) veya içerme (aracılığıyla ?
) için test edilirken , görüntüleme değeri yerine karşılaştırılan gerçek değerdir.
Geçerli Golfscript yorumlayıcısı için bir yama dosyası :
61c61
< to_gs
---
> Gstring.new([self])
Yukarıda anlatılanlar sadece davranışını etkileyecektir string op int
(tam tersi ve yardımcısı), op
biri
+-|&^
. Davranışı da dahil olmak üzere her şey etkilenmez Gint`
.
Aşağıdaki 24 baytlık çözüm geçerli olur:
{:i.)+.n*{*i%.}%i>|,}:f;
Ve bu aynı zamanda birçok başka çirkin çözümü de düzeltir .
Python - 48 bayt
f=lambda n:len(set(10**-~i%n for i in range(n)))
En verimli çözüm değil, ancak 100000'den küçük değerler için makul .
FWIW, temel eleman Ondalık döngüsel sayılar üretme çözümümle aynı .
Aynı kodun daha verimli bir sürümü ( 70 bayt ):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
99991 değeri bir saniyeden az sürer.