Saya sedang mengerjakan soal matematika dengan seorang teman saya, dan kami memutuskan untuk menulis naskah yang menemukan jawabannya. Pertanyaan aslinya adalah sebagai berikut:
Perbedaan dari dua bilangan asli adalah 2010 dan penyebut umum terbesarnya adalah 2014 kali lebih kecil dari kelipatan umum terendahnya. Temukan semua solusi yang mungkin.
Kami mulai menulis program secara independen satu sama lain, dan ketika itu berhasil kami memutuskan untuk menambahnya hingga mendapatkan jumlah byte terkecil yang bisa kami kelola. Kami berakhir dengan garis kode yang indah ini dengan 89 byte yang luar biasa.
from fractions import*;print[i for i in range(10**6)if i*(i+2010)/gcd(i,i+2010)**2==2014]
Kami ingin melihat apakah ada yang berhasil menulis kode yang lebih pendek, yang menyebutkan 1 juta i pertama. Jika Anda cukup berani untuk bersaing, Anda dapat menggunakan bahasa apa pun yang Anda suka, tetapi kami lebih suka Python 2 untuk dapat membandingkan kode Anda dengan kami.
Aturan biasa berlaku, byte terpendek menang. Lubang kode golf standar berlaku. Standar "celah" yang tidak lagi lucu
Selamat bersenang-senang!
Jawaban:
Mathematica, 8 byte
Bukti bahwa 4 dan 5092 adalah satu-satunya solusi: Masalah aslinya dapat ditulis ulang sebagai
Mari kita menulis x sebagai 2 a 2 3 a 3 5 a 5 ... dan x + 2010 sebagai 2 b 2 3 b 3 5 b 5 ... Kemudian persamaannya menjadi
Sejak 2014 = 2 × 19 × 53, kita miliki
Jadi
Jadi
Hanya ada 8 pilihan yang mungkin, dan kami dapat dengan mudah memeriksa bahwa 4 dan 5092 adalah satu-satunya solusi bilangan bulat positif.
Tunggu, saya mendengar orang-orang menjerit celah standar ...
Mathematica, 45 byte
sumber
Pyth
2725Cobalah online.
Ini menggunakan algoritme Anda dengan cukup naif ... Saya mungkin dapat menemukan sesuatu yang lebih baik ...
Pada dasarnya memfilter nilai yang tidak memenuhi kriteria dari
range(10**6)
Terima kasih kepada @xnor karena menunjukkan obrolan itu
gcd(x,x+2010)==gcd(x,2010)
sumber
Python 3, 84 byte
FryAmTheEggman sudah menyarankan cara membuat solusi Anda 88 byte jadi saya tidak akan memposting itu. Tapi saya pikir saya akan menunjukkan bagaimana Anda bisa mendapatkan byte lebih sedikit di Python 3:
(Terima kasih untuk FryAmTheEggman untuk tipnya)
Ini tidak berfungsi di Python 2 karena
print
itu bukan fungsi.Saya tidak yakin apakah kami diizinkan, tetapi jika kami bisa menggunakan itu
9**9
bukan10**6
byte lain.sumber
and
/or
... tidak akan pernah memikirkan python 3;) Lebih lanjut tentang topik: Jika pesanan tidak penting, saya pikir pengaturanx=10**6
dan melakukanwhile x:x-=1;...
adalah satu byte lebih pendek.R, 75 karakter
Dengan jeda baris:
sumber
GolfScript (41 byte)
Panggil nomor
am
dan dibm
managcd(a, b) = 1
serta logb > a
. Maka perbedaannya adalahm(b-a) = 2010
, danlcm(am, bm) = abm = 2014m
sebagainyaab=2014
.Faktor 2014 adalah
dan mereka yang memiliki perbedaan yang membagi ke dalam 2010 adalah
Karena saya beroperasi dalam bahasa yang tidak memiliki GCD atau LCM bawaan, saya pikir analisis ini mungkin mempersingkat program:
di mana
44
adalahfloor(sqrt(2014))
.Dimungkinkan untuk mendapatkan cukup dekat menggunakan loop naif:
sumber
Perl6
6158565452Terjemahan yang cukup langsung dari sumber Anda berikan
gcd
adalah infix op di Perl6.^10**6
adalah kependekan0 ..^ 10**6
, di mana^
cara mengecualikan angka ini dari kisaran.Tentu saja
i gcd (i+2010)
samai gcd 2010
sehingga saya dapat menyimpan 3 karakterJika saya menggunakan
$_
alih-alih,i
saya dapat menyimpan beberapa karakter. (.say
kependekan dari$_.say
)Saya dapat menyimpan beberapa karakter dengan menggunakan
... && .say
alih-alih.say if ...
, karena saya tidak memerlukan ruang di kedua sisi&&
seperti yang saya lakukanif
.Karena saya melakukan kedua "optimasi" sebelumnya saya dapat menggunakan bentuk pernyataan pengubah
for
, yang berarti saya dapat menghapus{
dan}
.Saya pikir itu sesingkat saya bisa pergi tanpa menggunakan algoritma yang berbeda.
sumber
J, 26 byte
Kata kerja 2-byte terkutuk itu ... :)
sumber
Dyalog APL, 29 karakter
sumber
PARI / GP, 42 byte
Saya merasa bahwa ada solusi yang sangat elegan menggunakan
fordiv
konstruksi GP tetapi tidak dapat bersaing dengan solusi ini untuk keringkasan belaka.sumber
Racket, 72 karakter
sumber
λ
dihitung sebagai 1 byte.Haskell, 52 karakter
Bekerja di lingkungan interaktif Haskell, GHCi.
sumber