Beberapa angka seperti: 6, 12, 20, 30, 42, 56, 60, 90, 120 dan seterusnya seperti yang dapat dinyatakan sebagai produk angka integer berurutan seperti yang ditunjukkan di bawah ini.
6 = 2 * 3
12 = 3 * 4
30 = 5 * 6
60 = 3 * 4 * 5
90 = 9 * 10
120 = 4 * 5 * 6
Tulis program atau fungsi yang menampilkan daftar bilangan bulat berturut-turut yang produknya sama dengan angka yang ditentukan.
Contoh angka yang tidak cocok untuk logika ini adalah:
99 = 9 * 11 (Product of non-consecutive numbers)
121 = 11 * 11 (Same numbers)
2 = 1 * 2 (Product of itself and 1)
13 = 13 (Product of only one number)
Harap perhatikan bahwa untuk kasus 2 = 2 * 1
, kami tidak menganggapnya sebagai hasil yang valid, karena bilangan bulat dikalikan dengan 1 memberikan hasil yang sama. Untuk pertanyaan ini, kami hanya akan mempertimbangkan bilangan bulat> = 2 dalam produk.
Memasukkan
Integer positif 32-bit yang valid. Dapat dari input standar, argumen fungsi, dll.
Keluaran
Daftar angka integer berurutan> = 2 (dalam urutan naik atau turun). Jika ada beberapa kombinasi bilangan bulat berturut-turut, cukup berikan satu contoh yang akan dilakukan. Jika Anda memberikan lebih banyak, tidak apa-apa.
Batasan
Kode harus mengambil jumlah waktu yang wajar (<5 menit) untuk dijalankan pada komputer standar untuk semua input yang valid (bilangan bulat 32-bit positif). Jika ada produk integer berturut-turut, kode harus menampilkan satu atau lebih dalam batas waktu. Selain itu, kode harus berakhir tanpa output dalam batas waktu.
Ini adalah kode golf, jadi kode terpendek dalam byte menang.
30=5*6
.Jawaban:
Jawa - 124
Mulai dari 2, ini loop sampai angka awal> akar kuadrat dari target (atau target tercapai dengan tepat). Jika produk rendah, itu dikalikan dengan jumlah tinggi dan menambahnya. Jika tinggi, itu dibagi dengan angka awal dan menambahnya.
Misalnya, untuk 30, ia akan memeriksa:
Menghasilkan serangkaian faktor yang dipisahkan ruang dalam urutan menaik.
Dengan jeda baris:
sumber
Python -
104 97 9592 cobalahJika
n
, misalnya, diatur ke 120 sebelumnya, program mengeluarkan dua solusi:sumber
+=
. Tapi aku rindu++
dengan Python ...if s>=n
danif s/n
setara, sehingga Anda dapat memberikan semua solusi dalam jumlah karakter yang sama.s=s*(i+c)
kes*=i+c
.Clojure -
127109 byteContoh:
Penjelasan:
Ini adalah pendekatan fungsional dasar, yang cukup tidak dioptimalkan. Saya membuat daftar malas dari semua kemungkinan menggunakan loop sederhana di atasnya (tidak melewati semua kombinasi yang akan memberikan angka terlalu besar, mencegah overflow) dan mengambil yang pertama. Jika tidak ada kemungkinan, ia mengembalikan nihil.
Paling mudah untuk menguji di http://tryclj.com/ .
Saya juga sekarang memperhatikan bahwa saya dapat mengembalikan semua kemungkinan:
120 byte102 byte , tetapi memberikan hasil dalam daftar bersarang.Contoh:
sumber
CJam, 31 byte
Ini adalah pendekatan brute-force, tetapi waktu eksekusi hanya beberapa detik menggunakan penerjemah resmi Java .
Jika Anda ingin menguji kodenya menggunakan penerjemah online , Anda harus menjaga inputnya tetap rendah. Apa pun yang kurang dari 26 masih berfungsi di mesin saya.
Contohnya
Bagaimana itu bekerja
sumber
Jawa, 162
mengembalikan array bilangan bulat, atau
null
jika tidak ada angka berurutan yang ada.ungolfed:
sumber
C 105
110mencobanya144 dengan bonus: yang ini berulang melalui setiap nomor dan menemukan produk yang cocok
sumber
k < n
terlalu tinggi karenak *= l++
. saya bisa menambahkan lama yang tidak ditandatangani pada awal tapi ... itu akan merusak kehidupanPHP 258 karakter, 201 tidak termasuk fungsi faktorial.
Cara paling sederhana untuk mengekspresikan secara matematis "faktor-faktor berurutan yang sama dengan angka" adalah
X!/Y!
Di manaX
adalah angka tertinggi danY
terendah minus. Sayangnya saya berhenti mengambil kalkulus sebelum saya belajar untuk menyelesaikannyaZ = X!/Y!
, jadi saya harus sedikit memaksa.Versi berantakan dan tidak diserami:
Contoh output:
Golf:
Keluaran:
Saya tidak mengharapkan waktu lari secepat ini!
sumber
Pyth , 35
Catatan: Kode saya benar-benar menemukan representasi input terpendek sebagai representasi bilangan bulat berurutan> = 2, sehingga pada input yang tidak valid akan mencetak daftar elemen 1, mungkin setelah waktu yang sangat lama. Karena pernyataan masalah mengatakan input akan valid, saya menganggap ini OK.
Penjelasan singkat:
Pada dasarnya, program menyimpan batas atas dan bawah rentang, menghitung produk dari angka dalam rentang menggunakan pengurangan, menyesuaikan titik akhir yang diperlukan, dan mengulangi hingga produk sama dengan input.
Penjelasan panjang:
Untuk setiap potongan kode, saya akan memberikan python yang setara, serta penjelasan dan alasan yang lebih rinci.
Jvw
=>J=eval(input())
Cara standar untuk mengambil input dalam Pyth.
Kr2 4
=>K=range(2,4)
=>K=[2,3]
Inilah bagian aneh pertama: Alih-alih menyimpan titik akhir sebagai variabel terpisah, saya menyimpannya sebagai elemen daftar. Alasannya akan segera jelas. Selain itu, alih-alih melakukan tugas sederhana, yang dalam Pyth akan
K[2 3)
, saya menggunakan rentang untuk menyimpan karakter.W-ZJ
=>while Z-J
=>while Z!=J
Pada titik ini, Anda mungkin bertanya, "Apa itu Z? Anda belum mendefinisikannya." Dalam Pyth, semua variabel sudah ditentukan sebelumnya. Z akan dimulai sebagai 0. Namun, Z akan ditetapkan ke nilai produk nanti, jadi pemeriksaan ini akan berfungsi untuk mengakhiri loop sementara setelah daftar berada pada nilai yang benar.
~@K>JZ1
=>K[J>Z] += 1
Inilah mengapa saya menyimpan nilai dalam daftar, bukan dalam variabel terpisah: Saya ingin menambah satu dari dua titik akhir, tergantung pada apakah produk saat ini terlalu tinggi atau terlalu rendah. Itu akan menjadi syarat yang agak panjang jika titik akhir adalah variabel yang terpisah, tetapi dengan keajaiban pengindeksan daftar, itu menjadi pendek. Juga, fakta bahwa pemeriksaan ini datang sebelum produk, dan fakta bahwa Z diinisialisasi ke 0, memastikan bahwa K akan
[2,4]
pada saat kami pertama kali mengambil produk, yang merupakan titik akhir yang tepat.=YurGHK
=>Y=reduce(lambda G,H: range(G,H),K)
=>Y=range(K[0],K[1])
Sekarang, saya perlu daftar aktual bahwa produk akan diambil alih, dan itu akan dicetak jika kita berhasil. Jelas, kami akan menggunakan fungsi rentang. Trickiness terletak pada mendapatkan input ke fungsi rentang. Cara yang jelas untuk melakukan ini, dengan mengindeks daftar, adalah
=Yr'K@K1
. Namun, dengan menggunakan fungsi pengurangan pada daftar dua elemen ini, kita dapat mempersingkatnya dengan karakter.=Zu*NTY
=>Z=reduce(lambda N,T: N*T,Y)
Dan sekarang, untuk seluruh titik urusan ini, operasi pengurangan untuk menemukan produk dari daftar.
)
=> Akhiri sementaraY
=>print(Y)
Jika berhasil, cetak daftar.
Contoh dijalankan:
sumber
Jawa - 115
Sedikit kurang golf:
sumber
System.out.println
keSystem.out.print
dan titik koma pada akhirfor(int k=1,x=j;(x*=j+k)<i;k++)
tidak hanya perlu tetapi juga menyebabkan kesalahan.x
,j
,k
Berada di luar ruang lingkup dalam terakhirif/for
blok karena;
. Jika saya menghapus;
, itu tidak mencetak apa pun.print
berarti dia harus menambahkan karakter spasi untuk menghindari angka berjalan bersama.Matlab (88)
Kode mengharapkan nomor untuk disimpan
x
dan dikeluarkanl
.Karena
13! > 2^32
kode ini hanya mencari produk dengan panjang 2 hingga 12. Kode ini memiliki runtime konstan sekitar 0,001s.sumber
Scala - 86
Kode ini sangat tidak efisien tetapi mengoptimalkannya hanya akan menambah beberapa karakter. Ini menggunakan pendekatan fungsional untuk memeriksa produk dari semua kemungkinan urutan berturut-turut. (urutan bilangan bulat berturut-turut direpresentasikan sebagai objek Range di Scala)
ungolfed:
sumber
CJam saat ini tidak berfungsi untuk jumlah besar karena waktu perhitungan yang lama
Ini adalah kode CJam terpendek saya. Tes di http://cjam.aditsu.net/ . Ini bekerja dengan: mendefinisikan input sebagai A; membuat array semua angka dari 0 hingga A-1; Menendang 0; menendang angka terkecil hingga mengalikan semua angka dalam array tidak lebih besar dari A; memeriksa apakah lebih besar dari A; jika tidak, membuat array dari 0 hingga A-2; dan ulangi sampai jawabannya ditemukan. Jika tidak ada yang ditemukan, pengecualian dilemparkan. Saya tidak mempertimbangkan bahwa spasi antara angka diperlukan sehingga mereka termasuk dalam kode kedua yang panjangnya 32 karakter.
sumber
Dart - 102 karakter
Ini adalah implementasi yang lambat. Itu dapat dibuat lebih cepat tetapi itu membutuhkan lebih banyak karakter (seperti melakukan loop hanya sampai
i*i<n
)(102 karakter tanpa jeda baris dan ruang terkemuka).
Untuk menggunakannya, lakukan sesuatu seperti:
sumber
Javascript, 88
Kode golf:
Lebih mudah membaca kode (spasi baik):
Untuk setiap angka dari 2 ke nomor input, ia menemukan produk bilangan bulat berturut-turut dari angka saat ini kembali ke 2. Jika produk ini sama dengan nomor input, maka seri angka berurutan, bersama dengan nomor input asli, adalah output .
Ini mengeluarkan nomor input diikuti oleh bilangan bulat berturut-turut yang produknya adalah nomor input.
Misalnya f (120) menghasilkan peringatan dengan teks "120,5,4,3,2" dan kemudian peringatan kedua dengan teks "120,6,5,4".
sumber