Golfscript - 26 byte
{:i.)+.,{;10*i%.}%i>|,}:f;
Sunting: diperbarui ke keluaran 1
jika desimal berakhir, daripada panjang representasi desimal.
Versi yang cukup efisien. Nilai 67890 berjalan dalam waktu sekitar 10 detik, dan 99991 sekitar 20 detik. Ini sedikit lebih lambat daripada sebelumnya (kira-kira setengah lebih cepat), karena rentang yang diulang telah dua kali lipat, setengah pertama diabaikan.
Alternatif, juga 26 byte
{:i.)+.n*{*i%.}%i>)^^,}:f;
Yang ini bekerja dengan mengulangi string "\n"*(2*i+1)
, di mana i
nilai dilewatkan ke fungsi. Nilai yang diteruskan ke blok setiap kali adalah nilai ordinal "\n"
, yaitu 10 .
Ini )^^
adalah sedikit masalah. Saat Anda membuka karakter dari string, hasilnya adalah nilai ordinal karakter yang dihapus, seperti yang disebutkan di atas. Namun, menambahkan nilai itu kembali akan menambahkan representasi string angka itu, daripada karakter - perilaku yang cukup tidak simetris, dan menurut saya cacat desain. Jika Anda benar-benar ingin melakukan itu, pengerasan terlebih dahulu hanya membutuhkan biaya satu byte.
Salinan tambahan dari nilai akhir sudah ada di tumpukan, jadi saya menghapus nilai akhir lagi )
, xor dengan string, dan kemudian xor lagi, sehingga setiap karakter yang ditambahkan atau dihapus oleh xor pertama dikembalikan. Jika int op string
diperlakukan sebagai karakter, bukan representasi stringnya, )^^
bisa diganti dengan |
.
Perhatikan bahwa sementara string (yang dalam Golfscript disimpan sebagai array int) akan menampilkan nilai setiap karakter mod 256 , nilai-nilai masing-masing karakter itu sendiri mungkin berada di luar kisaran ini. Saat menguji keunikan (melalui operasi yang ditetapkan) atau isi (melalui ?
), itu adalah nilai aktual yang dibandingkan, bukan nilai tampilan.
File tambalan untuk penerjemah Golfscript saat ini :
61c61
< to_gs
---
> Gstring.new([self])
Di atas hanya akan mempengaruhi perilaku string op int
(dan sebaliknya), di mana op
salah satunya
+-|&^
. Segala sesuatu yang lain tetap tidak terpengaruh, termasuk perilaku Gint`
.
Solusi 24 byte berikut akan menjadi valid:
{:i.)+.n*{*i%.}%i>|,}:f;
Dan ini juga memperbaiki banyak cara kerja yang benar - benar jelek .
Python - 48 byte
f=lambda n:len(set(10**-~i%n for i in range(n)))
Bukan solusi yang paling efisien, tetapi masuk akal untuk nilai di bawah 100000 .
FWIW, elemen inti identik dengan solusi saya untuk Menghasilkan angka siklik dalam desimal .
Versi kode yang sama ( 70 byte ) yang lebih efisien :
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
Nilai 99991 membutuhkan waktu kurang dari satu detik.