Tugasnya adalah untuk menghitung jumlah pembagi dari angka yang diberikan factorisation utamanya.
Memasukkan
Dua array (atau sesuatu yang setara) dengan panjang n , satu berisi faktor prima dan lainnya berisi eksponen yang sesuai.
Keluaran
Jumlah semua pembagi (termasuk nomor itu sendiri).
Contoh
Angka 240 memiliki 2, 3, dan 5 sebagai faktor prima dengan 4, 1, dan 1 sebagai masing-masing eksponen. Output yang diharapkan akan menjadi 744.
Input: [2,3,5] [4,1,1]
Output: 744
Mencetak gol
Kode terpendek dalam byte menang!
Jika kompleksitas jangka waktu solusi Anda adalah O (jumlah eksponen) daripada O (produk eksponen), skor Anda dapat dikalikan dengan 0,8.
Ada pertanyaan serupa yang diposting di sini, tapi itu bukan tantangan. Saya pikir masalahnya cukup menarik untuk bisa bermain golf.
Pemenang akan dipilih akhir pekan ini
Jawaban:
Pyth, 13 byte * 0.8 = 10.4
Demonstrasi.
Jawaban ini bekerja agak berbeda dari yang di atas. Untuk menghitung jumlah faktor kekuatan prima dari angka tersebut, alih-alih menggunakan rumus aritmatika, faktor-faktor tersebut secara eksplisit dikonstruksi dan dijumlahkan.
Misalnya, pada pasangan [prima, eksponen]
[2, 4]
, kami memetakan2 ^ x
lebih0, 1, 2, 3, 4
, memberikan[1, 2, 4, 8, 16]
, yang kemudian dijumlahkan untuk 31.Hasilnya kemudian dikalikan bersama dan dicetak.
Jika eksponensial diterapkan dengan benar, atau jika ada caching hasil antara, ini akan menjadi
O(sum of exponents)
.sumber
O(n)
jika kita dapat mengasumsikan basis adalah konstan.CJam, 15 byte * 0.8 = 12
Cobalah online . Urutan input adalah daftar eksponen pertama, kemudian daftar bilangan prima (-3 byte terima kasih kepada @Dennis) .
Untuk setiap pasangan prime-eksponen,
(p, e)
temukankemudian temukan produk dari semua ini. Misalnya untuk 240 ini akan menjadi
Bergantung pada bagaimana eksponensial diterapkan, ini bisa lebih baik daripada
O(sum of exponents)
.sumber
APL,
1813 byte * 0.8 = 10.4Ini menciptakan fungsi fungsi diad yang mengambil berbagai faktor di sebelah kiri dan eksponen di sebelah kanan.
Cobalah online . Perhatikan bahwa ini adalah pendekatan yang sama dengan jawaban CJam yang sangat pintar dari Sp3000 .
Disimpan 5 byte berkat Dennis!
sumber
TI-BASIC, 17 byte * 0.8 = 13.6
Juga menggunakan metode Sp3000, meskipun saya menemukannya secara mandiri. Mengambil satu daftar dari Input dan satu dari homescreen.
Menggunakan prod (dua kali lebih kecil karena memungkinkan kita menggunakan kurung buka secara gratis. Perhatikan bahwa jawaban ini tidak mendukung array kosong, karena tidak ada array kosong di TI-BASIC.
sumber
Haskell, 38 * 0,8 = 30,4
Pemakaian:
Fungsi anonim dibawa
(p,e)
ke jumlah-pembagi untukp^e
melalui jumlah seri geometrik. Menyatukan dua daftar dengan ini sebagai bergabung dan mengambil produk memberikan hasilnya.Saya tidak dapat menemukan sesuatu yang lebih pendek dari ekspresi aritmatika
Mungkin ada cara untuk menghilangkannya
(\p e->_)
.Definisi fungsi infix memberikan panjang yang sama (38):
sumber
C ++,
1118077 byte * 0.8 = 61.6Ini menghitung (p ^ (e + 1) -1) / (p-1) dan secara berulang melipatgandakan semua faktor. Menemukannya sendiri setahun yang lalu.
Terima kasih telah membantu, benar-benar lupa tentang penggunaan boolean c ++ style.
sumber
n==0
menyederhanakan!n
- atau Anda dapat membalikkan hasilnya dan hanya menggunakann
Matlab, 53
Contoh:
sumber
s
dan kemudian menguji semua pembagi mungkin dari1
kes
. Jadi itu (setidaknya) O (s), yang mungkin antara O (jumlah eksponen) dan O (produk eksponen)Python 2,156
Memasukkan
Keluaran
Penjelasan
Program ini menerima daftar 2 daftar: faktor dan eksponen.
Kemudian buat daftar semua kemungkinan kombinasi dari daftar eksponen.
dan zip dengan faktor-faktor:
Hitung faktor dengan kekuatan eksponen:
dan gandakan setiap daftar (ini memberi kita semua pembagi):
Akhirnya, jumlahkan semua daftar dan cetak:
sumber
Python 3,
134120117Input: dua array yang dipisahkan koma, dipisahkan dengan koma.
Contoh:
Dengan NumPy dapat dikurangi hingga 100 byte:
sumber
operator
untuk menggunakanmul
sekali, Anda dapat menggunakanfloat.__mul__
untuk menyimpan banyak byte.Jelly, tidak bersaing
Jawaban ini tidak bersaing, karena tantangan mendahului pembuatan Jelly.
5 byte (tidak ada bonus)
Cobalah online!
Bagaimana itu bekerja
7 byte (5,6 byte setelah bonus)
Bagaimana itu bekerja
Cobalah online!
sumber
APL, 12 byte * 0.8 = 9.6
Ini membaca dua daftar dari keyboard, eksponen pertama, yaitu:
Penjelasan:
⎕
: baca daftar dari keyboard (eksponen)⍳¨
: untuk setiap nomor dalam daftar, buat daftar[1..n]
.⎕*
: baca daftar lain dari keyboard (bilangan prima), dan naikkan setiap prime ke masing-masing eksponen dalam daftar yang sesuai+/¨
: jumlah setiap daftar1+
: tambahkan satu untuk setiap hasil, untuk mengkompensasi yang hilangx^0
di setiap daftar×/
: ambil produk dari hasilsumber
Racket (Skema), 65 * 0,8 = 52 byte
Aritmatika yang sama dengan yang lainnya
Penjelasan:
sumber
Python 2, 80 Bytes * 0.8 = 64
Ini mengasumsikan input datang satu demi satu. Mengikuti formula yang sama seperti yang dijabarkan dalam jawaban CJam Sp3000.
Jika ini tidak diizinkan, maka saya akan menggunakan ini sebagai solusi, yang mendapat skor 84 byte * 0,8 = 67,2. Input harus dipisahkan dengan koma, yaitu
[2,3,5],[4,1,1]
.Psst. Hei! Ini adalah solusi yang mungkin dalam Symbolic, sesuatu yang saya kerjakan:
Ƥ(П([~-(x**-~y)/~-xϝx,yϊʐ(Ί,Ί)],1))
sumber
Mathematica, 40 byte
Tanpa menggunakan inbuilt yang berhubungan dengan pembagi, untuk membedakan dari solusi Mathematica lainnya di utas.
Input adalah (menggunakan contoh)
[{2, 3, 5}, {4, 1, 1}]
sumber
Perl 5, 96 byte
Jelas ini bukan kemenangan, tetapi saya memutuskan untuk menulisnya untuk bersenang-senang.
Ini adalah subrutin:
Lihat dalam aksi sebagai berikut:
Bagaimana itu bekerja:
($b,$e)=@_
membaca input arrayrefs$b
(basis) dan$e
(eksponen).$s=1
menginisialisasi produk.map$s*=$b->[$_]**$e->[$_],0..@$b-1
dikalikan$s
dengan kekuatan basis-eksponen berturut-turut. Sekarang$s
adalah angka gabungan.$_=1x$s
set$_
sama dengan string,$s
panjang.$i
diinisialisasi pada 0.for$j(1..$s){$i+=$j*/^(.{$j})*$/}
mencoba, untuk setiap angka$j
antara 1 dan$s
, untuk memecah$_
sebagai$j
karakter diulang beberapa kali. Jika bisa, maka$j
membagi$s
, dan/^(.{$j})*$/
adalah 1 (kalau tidak 0), dan$i
ditambah dengan$j
. Dengan demikian, kami menambah$i
jumlah partisi dalam partisi berukuran sama$_
. Seperti yang ditunjukkan Omar E. Pol ,$i
adalah angka yang kami cari.$i
pada akhirnya kembali$i
.sumber
J, 14 byte * 0.8 = 11.2
Pemakaian
sumber