Angka aneh adalah angka dimana jumlah pembagi yang tepat lebih besar dari jumlah itu sendiri dan tidak ada bagian dari pembagi yang tepat jumlah ke nomor itu.
Contoh:
70 adalah angka aneh karena pembagi yang tepat (1, 2, 5, 7, 10, 14, dan 35) berjumlah 74, yang lebih besar dari 70, dan tidak ada kombinasi angka-angka ini yang berjumlah 70.
18 bukan angka aneh karena pembagi yang tepat (1, 2, 3, 4, 6, 9) berjumlah 25, yang lebih besar dari 18, tetapi 3, 6, dan 9 berjumlah 18.
Tugas Anda adalah untuk menulis program terpendek yang input melalui std-in sejumlah n dan menghitung dan mencetak ke file atau std-out pertama n nomor aneh dengan pemisahan baris baru. Tidak ada pengkodean keras atas jawaban yang diizinkan (maaf karena tidak menentukan ini di awal).
Untuk lebih banyak contoh, lihat halaman ini: http://mathworld.wolfram.com/WeirdNumber.html
Jawaban:
Mathematica
999487 87Spasi tidak diperlukan. Lambat!:
Dengan mengorbankan beberapa karakter, ini adalah versi yang lebih cepat yang hanya memeriksa angka genap dan melompati kelipatan
6
yang tidak pernah aneh:masih terlalu lambat untuk tujuan apa pun yang bermanfaat. Menemukan dua yang pertama dalam beberapa detik tetapi menjadi lebih lambat dan lebih lambat karena jumlah pembagi meningkat.
sumber
Haskell - 129
Saya yakin ada banyak golf di sini, tetapi karena kompetisi tampaknya rendah untuk saat ini saya akan memasukkan ini.
Jangan coba-coba menjalankan ini, saya hanya bisa menunggu dua elemen pertama, ketiga akan mulai mengambil menit.
sumber
Python 2.7 (255 byte)
sumber
PHP, 267 byte
Dan inilah kode sumber aslinya:
Anda akan mencatat bahwa butuh beberapa waktu untuk menampilkan angka-angka karena sedang melakukan verifikasi brute-force (Anda harus mencapai 70 dengan sangat cepat).
sumber
R, 164
Versi tidak golf:
Ini membutuhkan waktu karena kekuatan kasar.
sumber
Ruby - 152
Ruby Dengan ActiveSupport - 138
Sangat lambat dan saya hampir yakin masih ada ruang untuk bermain golf ...
sumber
Smalltalk, 143
memasukkan:
keluaran:
sumber
SageMath:
143131 byteLebih dari itu bahkan tidak golf, tidak ada terlalu banyak golf di dalam kode. Yang terbesar adalah Anda harus melakukan tes
2*x>=sum(l)
terlebih dahulu, itu akan menghemat banyak waktu perhitungan. Kita harus menyadari bahwamax
pada boolean adalah yangor
keduaw(x)
adalahFalse
untuk bilangan ganjil danTrue
untuk bilangan non-ganjil. Versi tidak disatukan:sumber
C ++ - 458
Ini bukan semua solusi saya karena saya harus meminta SO untuk membantu menghitung jumlah himpunan bagian, tetapi yang lainnya milik saya:
Versi panjang:
Saat ini hanya menghitung dua yang pertama (70 dan 836). Saya membunuhnya setelah itu.
sumber
Perl, 173
Biarkan saya menambahkan solusi lain yang tidak berguna. Solusi ini sangat lambat sehingga bahkan tidak bisa menghasilkan apa pun melewati angka ganjil pertama. Saya berani mengatakan itu adalah yang paling lambat dari semua solusi di sini.
Demo
Kode yang sama ditulis dalam Java (yang saya lebih nyaman dengan) bahkan tidak dapat mengenali nomor aneh ke-2 (836), dan saya sudah memberi makan nomor langsung ke metode pemeriksaan (alih-alih perulangan dan memeriksa setiap nomor).
Inti dari solusi ini terletak pada regex:
Dan bagaimana string diatur menjadi 3 kali angka yang kita periksa.
Panjang string diatur menjadi 3 kali angka yang kami periksa
i
: 2 pertamai
untuk mencocokkan jumlah faktor dan 1 terakhiri
dicadangkan untuk memeriksa apakah angka merupakan faktori
.(?=(.+)\1{2}$)
digunakan untuk menangkap nomor yang kami periksa.((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
cocok dengan faktor-faktor nomor. Nanti iterasi akan cocok dengan faktor yang lebih kecil dari iterasi sebelumnya.(.+)
dan(?=.*(?=\1$)\3+$)
bersama - sama memilih faktor jumlah yang diperiksa.(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))
memastikan bahwa faktor yang dipilih lebih kecil dari jumlah yang diperiksa dalam iterasi pertama, dan lebih kecil dari faktor sebelumnya dalam iterasi berikutnya.Regex mencoba untuk mencocokkan sebanyak mungkin faktor angka yang ada dalam batas 2
i
. Tapi kami tidak peduli tentang nilai sebenarnya dari jumlah pembagi, kami hanya peduli apakah jumlahnya banyak.Kemudian regex ke-2, yang merupakan regex pertama dengan
\1{2}$
ditambahkan. Akibatnya, regex memastikan jumlah (beberapa) faktor dari jumlah yang diperiksa sama dengan jumlah itu sendiri:Batasan yang ditambahkan akan menyebabkan mesin regex melakukan penelusuran mundur pada semua subset faktor yang mungkin, sehingga akan sangat lambat.
sumber
Perl,
176174 byteJumlah angka aneh diharapkan dalam STDIN dan angka yang ditemukan dicetak ke STDOUT.
Versi tidak disatukan
Keterbatasan
sumber