Rumus
Ambil contoh angka 300
- Faktor prima 300 adalah
[2, 3, 5]
(angka unik yang merupakan faktor 300 dan prima) - Mengkuadratkan masing-masing angka itu akan memberi Anda
[4, 9, 25]
- Menyimpulkan daftar itu akan memberi Anda
4 + 9 + 25 = 38
- Akhirnya kurangi jumlah itu (38) dari nomor asli Anda
300-38 = 262
(ini hasilnya)
Memasukkan
Input Anda akan menjadi bilangan bulat positif lebih besar dari 2. Anda harus memeriksa semua angka dari 2 hingga nilai input (inklusif) dan menemukan angka yang menghasilkan hasil terbesar dengan rumus di atas.
Keluaran
Output Anda akan menjadi dua angka yang dipisahkan oleh spasi, koma, baris baru atau apa pun bahasa Anda memungkinkan (pemisahan diperlukan untuk membedakan dua angka). Ini bisa berupa output ke file, stdout, atau apa pun yang digunakan bahasa Anda. Tujuan Anda adalah menemukan angka dalam rentang yang menghasilkan output maksimum saat dijalankan melalui rumus di atas. Angka pertama yang ditampilkan harus berupa angka awal (seperti 300) dan angka kedua harus menjadi output yang dihasilkan formula (seperti 262)
Uji Kasus
Input: 3 Output: 2, -2
Input: 10 Output: 8, 4
Input: 50 Output: 48, 35
Input: 1000 Output: 1000, 971
Input: 9999 Output: 9984, 9802
Bekerja Melalui Contoh
Pertimbangkan input 10, kita harus menjalankan rumus untuk semua angka dari 2-10 (termasuk)
Num PrimeFacs PrimeFacs^2 SumPrimeFacs^2 Result
2 [2] [4] 4 -2
3 [3] [9] 9 -6
4 [2] [4] 4 0
5 [5] [25] 25 -20
6 [2, 3] [4, 9] 13 -7
7 [7] [49] 49 -42
8 [2] [4] 4 4
9 [3] [9] 9 0
10 [2, 5] [4, 25] 29 -19
Seperti yang Anda lihat, hasil terbesar adalah 4
, yang merupakan hasil dari memasukkan nilai 8
ke dalam rumus. Itu berarti output untuk input 10
seharusnya8, 4
Penilaian & Aturan
Aturan default untuk input dan output berlaku: Default untuk Code Golf: Metode input / Output
Celah
lubang standar dilarang: Celah yang dilarang oleh
Pengajuan standar dapat berupa fungsi atau program penuh
Kode terpendek dalam byte menang
50
:35, 48
?Jawaban:
Pyth,
1715 byteSuite uji.
sumber
Java 8 lambda,
247239233225224219198161 karakterSaya pikir itu mungkin di bawah 300 karakter karena ... Anda tahu ... Jawa!
Dan memang mungkin bahkan di bawah 200 karakter!
Saya tidak tahu apakah penggunaan impor ini sah tetapi saya berasumsi, bahwa itu boleh saja.Berikut adalah lambda yang tidak diolah menjadi kelas:Temuan utama didasarkan pada jawaban ini . Kode menggunakan fungsionalitas set karena mereka hanya menyimpan setiap nilai sekali, jadi saya tidak perlu peduli dengan duplikat tambahan nanti. Sisa kode cukup mudah, hanya mengikuti pertanyaan.
Pembaruan
Menghapus baris baru dari output.
Terima kasih kepada @ogregoire karena bermain golf Integer.MIN_VALUE ke 1 << 31!
Setelah melihat kode lagi saya menemukan beberapa tempat di mana hal-hal bisa golf.
Terima kasih kepada @Blue untuk trik == 0 hingga <1!
Menghapus beberapa spasi putih yang tersisa. Juga untuk pemisahan hanya satu char yang diperlukan sehingga tidak perlu membuang satu char.
Terima kasih lagi kepada @ogregoire karena menunjukkan bahwa saya dapat mengembalikan nilai alih-alih mencetaknya dan menyusun deklarasi! Ini banyak menghemat!
Mengetahui saya bisa menggunakan ternary bukan yang kedua jika untuk menyimpan satu char lagi.
Terima kasih kepada @AstronDan untuk penggunaan array yang mengagumkan yang menyimpan impor. Itu juga memberi saya kemungkinan untuk mempersingkat yang pertama jika menjadi terner.
sumber
Integer.MIN_VALUE
dapat disingkat menjadi1<<31
.int
di tempat yang sama untuk menghindari pengulanganint
beberapa kali, dan berikan nilainya di sana jika memungkinkan.System.out.println(...)
dan kembalikan nilai alih-alih mencetaknya: begitu OP menyebutkan, metode I / O standar sedang digunakan.Sebenarnya, 21 byte
Cobalah online!
Penjelasan:
sumber
Actually Programming Language
dan tidak menemukan apa-apa bahkan setelah browsing halaman 5 hasil google. Bahasa apakah ini?MATL , 18 byte
Cobalah online!
Kasing terakhir terlalu lama untuk kompiler online, tetapi menghasilkan hasil yang benar (dibutuhkan sekitar 11 detik di komputer saya, berjalan di Matlab):
Penjelasan
Penerapan langsung dari prosedur yang dijelaskan.
sumber
C #, 194 byte
Golf Code pertama saya :). Saya menggunakan bahasa favorit saya meskipun sangat jelas. Saya memulai ini sebagai port fungsi C # dari Java @ Frozn tetapi menemukan beberapa cara untuk mengecilkan kode lebih lanjut dengan optimisasi.
Ini menggunakan array untuk menyimpan faktor prima. Karena diindeks oleh faktor itu akan menggantikan faktor yang diulang dengan salinan faktor. Ini memungkinkan fungsi tidak memiliki impor. Ini bahkan tidak memerlukan Sistem.
sumber
Utilitas Bash + GNU, 74
seq
menghasilkan semua bilangan bulat 2 ke nfactor
memberikan nomor diikuti oleh titik dua, lalu daftar yang dipisahkan ruang dari semua faktor utama, termasuk duplikat. misalnya hasil untuk 12 adalah12: 2 2 3
sed
menghilangkan titik dua dan faktor duplikat, kemudian menghasilkan ekspresi aritmatika yang diperlukan. misalnya untuk 12:12- 2* 2- 3* 3
bc
mengevaluasi ininl
awalan dan kembali (mulai dari 2)sort
oleh kolom kedua, secara numerik, dalam urutan menurunseq
mencetak baris pertama dan berhenti.Ideone.
sumber
Brachylog , 48 byte
Penjelasan
sumber
Jelly , 13 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
05AB1E,
191716 byteKode:
Penjelasan:
Cobalah online
sumber
Julia, 56 byte
Cobalah online!
Bagaimana itu bekerja
Diberi masukan n , untuk setiap bilangan bulat k sehingga 2 ≤ k ≤ n , kita menghasilkan tupel (f (k), k) , di mana f (k) adalah perbedaan antara k dan jumlah kuadrat dari faktor perdana .
f (k) sendiri dihitung dengan
k-sumabs2(k|>factor|>keys)
, faktor mana k menjadi Dict dari kunci utama dan nilai eksponen, mengekstrak semua kunci (faktor utama), mengambil jumlah kuadratnya dan mengurangi bilangan bulat yang dihasilkan dari k .Akhirnya, kami mengambil maksimum leksikografis tupel yang dihasilkan dan membalikkannya dengan mengaksesnya pada indeks 2 dan 1 .
sumber
Clojure, 215 byte
Ikuti saja aturannya. Hitung faktor prima dari setiap angka, masukkan ke kotak dan jumlahkan. Setelah itu buat daftar vektor dari 2 elemen: angka awal dan hasilnya dan temukan elemen dengan nilai maksimum elemen kedua.
Anda dapat melihatnya online di sini: https://ideone.com/1J9i0y
sumber
R 109 byte
Saya curang dan menggunakan paket
gmp
,.sumber
CJam, 32 byte
Cobalah online!
sumber
Pyke, 17 byte
Coba di sini!
sumber
PowerShell v2 +,
124120117 byteBaris pertama menghitung nilainya, yang kedua hanya keluaran.
Kami mulai dengan membuat rentang dari
2
hingga argumen baris perintah kami$args[0]
dan mengulanginya|%{...}
. Setiap loop yang kami tetapkan variabel pembantu sama dengan nilai kami saat ini dengan$y=$z=$_
. Kami kemudian mengulangi setiap nomor dari2
hingga nomor kami saat ini. Setiap loop batin kita periksa apakah angka itu adalah pembagi!($z%$_)
dan apakah itu prima('1'*$_-match'^(?!(..+)\1+$)..')
, dan jika keduanya kita kurangi kuadrat dari$y
(cek dilakukan dengan menggunakan perkalian Boolean).Setelah kami melewati semua pembagi utama dan mengurangi kuadrat, jika jumlah yang tersisa adalah yang terbesar yang kami lihat sejauh ini
$y-gt$o
, kami menetapkan variabel output kami$o=$y;$p=$_
. Setelah kami mengulang seluruh rentang, kami cukup menampilkan dengan spasi di antaranya.sumber
Haskell, 91 byte
Contoh penggunaan:
f 50
->[48,35]
.Fungsi faktor utama hanya tersedia melalui
import Data.Numbers.Primes
yang biaya byte terlalu banyak, jadi saya menggunakan pemeriksa utama @ Lynn . Sisanya adalah lurus ke depan: untuk inputm
lingkarann
melalui[2..m]
dan dalam loop batinp
melalui[2..n]
. Simpan semuap
yang prima dan bagin
, kuadrat dan jumlah.sumber
Python 2,
108105100 byteUji di Ideone .
sumber
JavaScript (ES6),
111105 byteTidak tahu mengapa saya tidak berpikir untuk melakukan ini secara rekursif sebelumnya.
sumber
J, 44 byte
Pendekatan lurus ke depan. Juga mengembalikan semua nilai
n
yang menghasilkan nilai maksimum.Pemakaian
sumber