Kepadatan digit angka kuadrat (SNDD) dari suatu angka - diciptakan sendiri - adalah perbandingan jumlah angka kuadrat yang ditemukan dalam digit berurutan dengan panjang angka. Misalnya, 169 adalah angka 3 digit yang mengandung 4 angka kuadrat - 1, 9, 16, 169 - dan dengan demikian memiliki kepadatan angka angka kuadrat 4/3, atau 1,33. Angka 4 digit 1444 memiliki 6 kotak - 1, 4, 4, 4, 144, 1444 - dan dengan demikian rasio 6/4, atau 1,5. Perhatikan pada contoh sebelumnya bahwa kotak diizinkan untuk diulang. Juga, 441 tidak diperbolehkan, karena tidak dapat ditemukan secara berurutan di dalam nomor 1444.
Tugas Anda adalah menulis program yang mencari rentang A - B (inklusif) untuk angka dengan kepadatan digit angka kuadrat tertinggi. Program Anda harus mematuhi spesifikasi berikut:
- Ambil input A, B dalam kisaran 1 hingga 1.000.000.000 (1 miliar). Contoh:
sndd 50 1000
- Hasilnya adalah nomor dengan SNDD terbesar. Dalam kasus seri, kembalikan nomor terkecil.
- 0 tidak dihitung sebagai kotak dalam bentuk apa pun, 0, 00, 000, dll. Kotak juga tidak dimulai dengan 0, seperti 049 atau 0049.
- Perhatikan bahwa seluruh angka tidak harus berupa angka kuadrat.
Contoh:
sndd 14000 15000
Output: 14441
sndd 300 500
Output: 441
Bonus: Berapa angka dengan SNDD terbesar antara 1 dan 1.000.000.000? Bisakah Anda membuktikan apakah ini adalah yang terbesar, atau mungkin ada yang lebih besar dalam kisaran yang lebih tinggi?
Skor saat ini:
- Ruby: 142
- Windows PowerShell: 153
- Scala: 222
- Python: 245
Sekarang setelah jawaban telah dipilih, berikut ini adalah implementasi referensi saya (tidak diunggah) dalam JavaScript: http://jsfiddle.net/ywc25/2/
sumber
$ ruby1.9 sndd.rb 14000 15000 => 14441
.x[0]>?0
memeriksa kotak yang dimulai dengan 0.ruby sndd.rb 14000 15000
dari Windows, saya mendapatkan 14000.?0
adalah Fixnum, sedangkan di Ruby 1.8 adalah string, jadi perbandingan yang saya sebutkan memiliki arti yang berbeda tergantung pada versi Ruby (sebenarnya ia harus mengeluarkan pengecualian di 1,8). Itu sebabnya saya secara eksplisit menyebutkan versi 1.9 dalam judulnya.Menjawab bonus: skor terbaik untuk angka <1e9 adalah 5/3 = 1.666 ..., dihasilkan oleh 144411449 (dan mungkin yang lain?).
Tetapi Anda dapat melakukannya dengan lebih baik dengan jumlah yang lebih besar. Umumnya jika n memiliki skor x, maka Anda dapat menggabungkan dua salinan n dan mendapatkan skor yang sama x. Jika Anda beruntung dan n memiliki angka pertama dan terakhir yang sama, maka Anda dapat menjatuhkan salah satu dari angka-angka itu dalam rangkaian dan meningkatkan skor Anda sedikit (satu kurang dari dua kali lipat jumlah kotak dan satu kurang dari dua kali lipat jumlah digit) .
n = 11449441 memiliki skor 1,625 dan memiliki angka pertama & terakhir yang sama. Dengan menggunakan fakta itu, kita mendapatkan urutan skor berikut:
yang memberikan urutan angka tak terbatas yang secara ketat (meskipun semakin menurun) lebih baik dari angka sebelumnya, dan semua kecuali 2 pertama lebih baik daripada skor terbaik untuk angka <1e9.
Namun, urutan ini mungkin bukan yang terbaik secara keseluruhan. Konvergen ke skor terbatas (12/7 = 1.714) dan mungkin ada angka lain dengan skor lebih baik dari batas.
Sunting : urutan yang lebih baik, konvergen ke 1,75
sumber
Windows PowerShell, 153
154155164174Berkat Ventero untuk pengurangan satu byte saya terlalu bodoh untuk menemukan diri saya sendiri.
Versi 154-byte menjelaskan:
sumber
Python, 245
256Ini bisa menjadi jauh lebih pendek jika rentang dibaca dari yang
stdin
bertentangan dengan argumen baris perintah.Edit:
Sehubungan dengan bonus, percobaan saya menyarankan yang berikut:
Dugaan 1 . Untuk setiap n ∈ ℕ , angka dalam ℕ ≤ n dengan SNDD terbesar harus berisi hanya angka 1, 4, dan 9.
Dugaan 2. ∃ n ∈ ℕ ∀ i ∈ ℕ ≥ n : SNDD ( n ) ≥ SNDD ( i ).
Sketsa bukti . Himpunan kotak dengan angka 1, 4, dan 9 kemungkinan terbatas . ∎
sumber
range(*map(int,sys.argv[1:]))
Scala, 222
(Diperlukan Scala 2.9.)
sumber
Mempertimbangkan pertanyaan bonus: Di luar kisaran SNDD tertinggi yang mungkin tak terbatas.
Setidaknya, jika saya membaca pertanyaan dengan benar, kuadrat seperti 100 (10 * 10) tidak masuk hitungan.
Jika Anda mempertimbangkan angka 275625, skornya adalah 5/6, karena 25, 625, 5625, 75625 dan 275625 semuanya persegi.
Menambahkan 2 nol memberi: 27562500, yang memiliki skor 10/8. Batas urutan ini adalah 5/2 = 2.5
Di sepanjang garis yang sama, Anda dapat menemukan kotak yang berakhir dengan jumlah kotak yang lebih kecil yang diinginkan. Saya bisa buktikan ini, tetapi Anda mungkin mendapatkan ide.
Diakui, ini bukan solusi yang sangat bagus, tetapi ini membuktikan tidak ada batas atas SNDD.
sumber
Clojure - 185 karakter
Mungkin bisa dioptimalkan lebih lanjut tetapi begini:
Digunakan sebagai fungsi dengan dua parameter:
sumber
Jelly , 21 byte, tantangan tanggal kiriman bahasa
Cobalah online!
Penjelasan
Fungsi pembantu (menghitung kerapatan digit inputnya):
Program utama:
Program ini bisa dibilang lebih menarik tanpa
Ḣ
- dengan cara itu, ia mengembalikan semua angka kepadatan maksimal daripada hanya satu - tetapi saya menambahkannya untuk memenuhi spesifikasi.sumber