Objektif
Diberikan input r
dan n
temukan n
bilangan asli pertama x
sehingga jika kita memutar digit pertama ke tempat terakhir yang kita peroleh x/r
.
Anda dapat menganggap itu 2 <= r <= 9
dan 1 <= n <= 65535
.
Anda dapat menulis sebuah program yang mengambil input dari argumen stdin atau baris perintah; atau Anda dapat menulis fungsi yang mengambil r
dan n
sebagai parameter. Output, bagaimanapun, harus stdout. Output harus satu baris per nilai x
, diformat sebagai x/r=y
, dalam urutan meningkat x
.
Solusi Anda harus dapat menangani semua kasus yang valid dalam satu menit di komputer desktop yang masuk akal.
Uji kasus
Input: 4 5
Keluaran:
102564/4=25641
205128/4=51282
307692/4=76923
410256/4=102564
512820/4=128205
Input: 5 1
Keluaran:714285/5=142857
Ini adalah kode-golf, jadi paling tidak byte menang. Jawaban yang menang akan diterima 4 minggu dari sekarang (2014-09-19).
Kredit untuk pertanyaan ini diberikan kepada kolega saya, yang mengizinkan saya untuk mengirim pertanyaan ini di sini :)
sumber
gprof
, satu kasus input untuk program saya menghabiskan kurang dari setengah detik dalam kode saya, tetapi membutuhkan total sekitar 80 detik, yang saya anggap sebagian besar harus memblokir output.printf
.Jawaban:
Haskell,
182179Versi kedua, mungkin golf lebih lanjut, tetapi dengan algoritma "tepat" kali ini. Secara khusus, ini selesai dalam beberapa menit dengan
r=4
dann=65535
, tapi sekali lagi komputer saya tidak masuk akal atau desktop, jadi kemungkinan ini tetap dalam satu menit pada mesin lain.Ini didasarkan pada gagasan bahwa
x=10^k*a + m
, di mana digit pertama0≤a≤9
dipindahkan ke akhir untuk mendapatkany=10*m+a
. Sebuah matematika sedikit mengungkapkan bahwam
dapat diperoleh sebagaia*(10^k-r)/(10*r-1)
, jadi kami hanya memindaia
lebih[1..9]
untuk setiapk
dari 0 hingga tak terbatas, dan menjaga dan mencetak pertaman
hasil yang ekspresi di atas untukm
adalah integral.Hal
fromIntegral
ini diperlukan karenaread
daftar dengann
sebagai salah satu elemen dalammain
, dalam kombinasi dengan penggunaann
dalamtake
, akan memaksar
untukInt
keseluruhan, yang menghasilkan luapan yang tidak menyenangkan dengan jumlah besar yang dipertanyakan. Saya bisa menggunakangenericTake
, tetapi itu membutuhkanimport
.Kode ini juga memiliki manfaat yang hampir sepele untuk diperluas ke basis selain 10.
Input dibaca dari
stdin
, dua nilai dapat dipisahkan oleh spasi putih apa pun.sumber
r = 5; n = 65535
dalam satu menit?y`mod`10
denganmod y10
, yang lebih singkat charPure Bash (tidak ada utilitas eksternal), 80 byte
Catatan bash hanya bilangan bulat aritmatika dan bukan floating point, jadi kami memeriksa jika
x == y * r
bukanx / r == y
. Multiplikasi juga seharusnya lebih cepat. Namun, ini belum memenuhi persyaratan kinerja.Keluaran:
sumber
C 468
(Beberapa baris baru yang tidak dihitung dalam jumlah byte telah ditambahkan di atas untuk menghilangkan bilah gulir. Ya, baris akhir terakhir dihitung.)
Mengharapkan argumen pada baris perintah, dan mengasumsikan output standar menerima ASCII. Runtime adalah O (jumlah byte keluaran) = O (n * n).
Tidak, saya tidak bisa menggunakan
printf
. Itu membutuhkan terlalu banyak waktu dan mendorong program melebihi batas menit pada desktop saya. Karena itu, beberapa kasus uji memerlukan waktu sekitar 30 detik.Algoritma memperlakukan output sebagai string, bukan angka, karena mereka dengan cepat menjadi sangat besar, dan ada pola yang kuat dalam output.
Agak tidak terserang:
Bukti
bahwa program menyelesaikan masalah:
(Dalam buktinya, anggap semua operator dan fungsi sebagai fungsi matematika yang sebenarnya, bukan operasi komputer yang memperkirakannya.
^
Menunjukkan eksponensial, bukan bitwise xor.)Untuk lebih jelasnya, saya akan menggunakan fungsi
ToDec
untuk menggambarkan proses biasa menulis angka sebagai urutan angka desimal. Kisarannya adalah himpunan tupel yang dipesan{0...9}
. Sebagai contoh,Untuk bilangan bulat positif
n
, tentukanL(n)
menjadi jumlah digit dalam representasi desimaln
; atau,Untuk bilangan bulat positif
k
dan integer non-negatifn
denganL(n)<k
, menentukanRep_k(n)
untuk menjadi nomor nyata diperoleh dengan menambahkan angka nol di depan angka desimaln
, jika perlu untuk mendapatkank
angka total, dan kemudian jauh mengulangi merekak
digit setelah titik desimal. MisalnyaMengalikan
Rep_k(n) * 10^k
memberi angkan
sebelum titik desimal, dan (nol-empuk) angkan
diulang tak terbatas setelah titik desimal. BegituDiberikan bilangan bulat positif
r
, anggaplahx
solusi untuk masalah, dandimana
x_1 != 0
dank = L(x)
.Untuk menjadi solusi,
x
adalah kelipatan darir
, danMenerapkan
Rep_k
fungsi memberikan persamaan yang bagus:Menggunakan formulir tertutup dari atas,
x_1
harus di set{1 ... 9}
.r
ditentukan berada di set{2 ... 9}
. Sekarang satu-satunya pertanyaan adalah, untuk nilai apak
rumus di atas untukx
memberikan bilangan bulat positif? Kami akan mempertimbangkan setiap nilai yang mungkin secarar
individual.Ketika
r
= 2, 3, 6, 8, atau 9, masing-masing10r-1
adalah 19, 29, 59, 79, atau 89. Dalam semua kasus, penyebutnyap = 10r-1
prima. Dalam pembilang, hanya10^k-1
bisa kelipatanp
, yang terjadi saatHimpunan solusi ditutup dengan penambahan dan pengurangan yang tidak menghasilkan angka negatif. Jadi himpunan terdiri dari semua kelipatan dari beberapa faktor umum, yang juga merupakan solusi paling positif untuk
k
.Kapan
r = 4
dan10r-1 = 39
; atau kapanr = 7
dan10r-1 = 69
, penyebutnya 3 kali prima yang berbedap=(10r-1)/3
.10^k-1
selalu merupakan kelipatan 3, dan sekali lagi tidak ada faktor lain dalam pembilang yang bisa kelipatanp
, jadi sekali lagi masalahnya berkurang menjadidan sekali lagi solusinya adalah kelipatan dari solusi paling tidak positif untuk
k
.[Belum selesai...]
sumber
Python -
9190Ini foto pertama:
Sunting: Oke, ini mungkin cara lambat untuk memenuhi batas waktu 1 menit yang diperlukan untuk angka 65 ribu.
sumber
JavaScript - 145
tidak golf:
sumber
(5,4)
. Alasannya tidak akan berhasil adalah bahwa jumlahnya tumbuh sangat besar. a) Jauh lebih besar dari angka di JS dapat mewakili secara akurat dan b) terlalu besar karena layak untuk diulang melalui semua angka untuk sampai ke sana.Python 3 -
223179 byteImplementasi Python dari solusi TheSpanishInquisition:
Lari:
python3 <whatever you named it>.py
Keluaran:
Temuan:
https://oeis.org/A092697 adalah nilai pertama untuk setiap r.
Tampaknya hanya nilai-nilai k tertentu yang menghasilkan jawaban, dan intervalnya teratur. Misalnya untuk r = 4:
Intervalnya adalah:
Formulir ini https://oeis.org/A094224 .
Menggunakan nilai-nilai ini, versi yang lebih efisien dapat dibangun:
Namun, saya tidak dapat (belum) membuktikan bahwa ini berlanjut secara matematis.
Hasil untuk r = 5:
sumber
9 65535
?unsigned long long
untuk itu, dan membuatnya multicore untuk melakukannya dalam satu menit.unsigned long long
64 bit, itu tidak cukup besar.