Tulis fungsi yang mengambil bilangan bulat positif tunggal n dan mengembalikan periode representasi desimal 1 / n .
Kasus uji:
1 -> 1 # 1/1 = 1.0000...... = 1._0
2 -> 1 # 1/2 = 0.5000...... = 0.5_0
3 -> 1 # 1/3 = 0.3333...... = 0._3
7 -> 6 # 1/7 = 0.14285714.. = 0._142857
13 -> 6
14 -> 6
123 -> 5
345 -> 22
654 -> 108
12345 -> 822
67890 -> 120
Ini adalah kode-golf . Built-in atau perpustakaan yang mengembalikan periode secara langsung tidak diizinkan. Jumlah hingga setidaknya 100.000 harus berfungsi dalam waktu yang wajar (paling tidak beberapa menit).
code-golf
number-theory
Howard
sumber
sumber
1.00000000000000000000000000000000000
Jawaban:
APL, 19 karakter / byte *
Nars2000 . Versi sebelumnya salah pada beberapa angka, ini seharusnya benar. Saya memeriksanya secara manual pada semua nomor hingga 50.
Sekali lagi, kredit pergi ke Ben Reich untuk gagasan melihat periode
10^i (mod x)
Tampilan meledak
Contohnya
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL dapat ditulis dalam charset byte tunggal (lama) yang memetakan simbol APL ke nilai 128 byte atas. Oleh karena itu, untuk tujuan penilaian, program karakter N yang hanya menggunakan karakter ASCII dan simbol APL dapat dianggap sebagai panjang N byte.
sumber
20
. Bisakah Anda memverifikasi?4
Sepertinya itu akan memberikan jawaban yang salah juga, karena10 != 100 (mod 4)
.GolfScript (
4227)Waktu benchmark: 5 detik. Kode pembandingan:
Penghargaan untuk Ben Reich untuk ide inti melihat periode
10^i (mod x)
.Penjelasan
Periode
p
didefinisikan sebagai bilangan bulat positif terkecil sehingga untuk semua yang cukup besar yangi
kita milikifrac(10^i * 1/x) = frac(10^(i+p) * 1/x)
. Kita bisa menyederhanakannya menjadi sedikitfrac(10^i / x) = frac(10^(i+p) / x)
. Sekarang,frac(a / x) = frac(b / x)
jika dan hanya jikaa == b (mod x)
, jadi kami sedang mencari bilangan bulat positif terkecil sehingga untuk semua cukup besari
:10^i == 10^(i+p) (mod x)
.Misalkan
10^i == 10^(i+p) (mod x)
. Lalu10^(i+1) == 10 * 10^i == 10 * 10^(i+p) == 10^(i+p+1) (mod x)
; jadi begitu kita mendapatkan pengulangan, kita berada dalam siklus yang tidak bisa dipecahkan.Hanya ada
x
nilai-nilai yang berbeda(mod x)
, sehingga dengan prinsip mengesampingkan kita harus mendapatkan pengulangan pertamax + 1
nilai-nilai10^i (mod x)
.Jadi yang dilakukan oleh kode di atas adalah menghitung
x + 2
nilai10^i (mod x)
*. Kemudian yang terakhir dijamin akan menjadi pengulangan, dan dengan membalik daftar dan mencarinya, saya dapat menemukan kejadian terbaru. Selain itu, karena saya hanya melakukan pencarian satu kali ini adalah waktu pseudolinear.* Yang ekstra adalah menangani kasus khusus
x = 1
, karena saya tidak mengurangi10^0 (mod x)
dan jadi saya akan mencari0
di[1]
.sumber
Golfscript - 26 byte
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
Yang ini bekerja dengan mengulangi string
"\n"*(2*i+1)
, di manai
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. Jikaint 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 :
Di atas hanya akan mempengaruhi perilaku
string op int
(dan sebaliknya), di manaop
salah satunya+-|&^
. Segala sesuatu yang lain tetap tidak terpengaruh, termasuk perilakuGint`
.Solusi 24 byte berikut akan menjadi valid:
Dan ini juga memperbaiki banyak cara kerja yang benar - benar jelek .
Python - 48 byte
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 :
Nilai 99991 membutuhkan waktu kurang dari satu detik.
sumber
or
adalah array ke string kosong. Karena ini adalah operasi yang ditetapkan secara bijak, semua duplikat dihapus sebelumnya..|
.string int +
akan merusak banyak program. Saya tidak yakin seberapa sering op lainnya digunakan pada pasangan tipe itu.[]+''+
vs''+
. Append int, char, string:[]++
vs+
. Apend int, sebagai representasi string, ke string:+
vs`+
. Dalam implementasinya saat ini,int''+
identik denganint`
, yang tampaknya boros mengingat verbositas harus memaksa ke array, dan kemudian memaksa ke string jika Anda ingin char ascii.GolfScript,
484746Terima kasih kepada @PeterTaylor karena telah memangkas dua karakter.
Saya mencoba menggunakan J, tetapi terus memberi saya segala macam hasil yang aneh.
Tes online
Ini pada dasarnya membagi 2 dan 5 dari angka (2 dan 5 adalah faktor utama 10, dan timbal baliknya berakhir, dan mengisi algoritma), maka bilangan bulat terendah n sehingga jumlah yang dihasilkan membagi 10 ^ n - 1 adalah periode.
sumber
{...}:d;...d
Anda menyimpan 1 char dengan...{...}:d~
f
di tumpukan, saya perhatikan Anda juga melakukannya. Anda harus benar-benar menambahkan;
ke pop fungsi untuk perbandingan yang adil dengan bahasa lain.int array ,)\;
dapat disingkat menjadiint array +,
.Perl, 52 karakter
Ini adalah implementasi langsung dari pendekatan yang tidak rumit. (Untungnya pendekatan langsung juga cukup efisien: berkat modulo aritmatika, matematika tidak harus berurusan dengan angka lebih dari 10 kali nilai input.)
Karena tantangan menentukan fungsi, saya merasa harus (menginisialisasi) variabel saya, sesuatu yang saya tidak mau lakukan untuk program yang lengkap. Demikian juga,
~~
dalam pernyataan akhir tidak perlu jika fungsi dapat dipastikan akan dipanggil dalam konteks skalar.sumber
20
yang menghasilkan hasil yang salah.Clojure,
102, 117, 115, 106belum dibentuk:
diformat:
Menjalankan skala waktu dengan periode. Hampir seketika di komputer saya untuk nilai sampel.
Pada dasarnya, ini menghitung hasil pengurangan setelah setiap langkah dalam pembagian panjang. Siklus terdeteksi jika pada titik mana pun jumlah itu sama dengan yang telah dihitung sebelumnya.
sumber
20
. Bisakah Anda memverifikasi?(Non-bersaing) Pyth
Menggunakan algoritme penyu dan kelinci ( informasi lebih lanjut ).
Saksikan lulus setiap tes.
sumber