Ini adalah tantangan golf kode yang saya pikir dengan bengkok matematika. Tantangannya adalah untuk menulis kode sesingkat mungkin sehingga merupakan pertanyaan terbuka apakah kode tersebut berakhir atau tidak. Sebuah contoh dari apa yang saya maksud bisa menjadi potongan kode berikut python, diadaptasi dari sebuah anwser ke ini cs pertanyaan stackexchange.
def is_perfect(n):
return sum(i for i in range(1, n) if n % i == 0) == n
n = 3
while not is_perfect(n):
n = n + 2
Matematikawan mengira bahwa tidak ada angka sempurna yang ganjil, tetapi belum pernah terbukti, jadi tidak ada yang tahu jika kode ini akan berakhir. Bisakah Anda membuat potongan kode lain (mungkin mengandalkan masalah terbuka lainnya seperti dugaan Collatz, atau dugaan kembar prima) yang lebih pendek, tetapi yang tidak diketahui apakah mereka berakhir atau tidak?
Sunting: Beberapa orang telah mengemukakan aturan tambahan yang bagus - Solusi untuk pertanyaan harus bersifat deterministik. Meskipun mungkin lebih menarik jika Anda dapat menemukan solusi yang lebih pendek menggunakan nondeterminisme. Dalam hal ini, aturannya adalah menemukan cuplikan yang kemungkinan pemutusannya tidak diketahui.
n=3
while sum(k*(n%k<1)for k in range(1,n))-n:n+=2
.Jawaban:
Jelly , 7 byte
Cobalah online!
Latar Belakang
Ini akan berakhir setelah ia menemukan solusi keempat untuk masalah Brocard , yaitu solusi n! +1 = m² dengan (n, m) ≠ (4, 5), (5, 11), (7, 71) di atas bilangan bulat positif. Implementasinya tidak menggunakan aritmatika floating point, jadi itu hanya akan berakhir jika tidak menemukan solusi keempat atau jika n! tidak dapat lagi direpresentasikan dalam memori.
Masalah Brocard pertama kali digunakan dalam jawaban ini oleh @xnor.
Bagaimana itu bekerja
sumber
Jelly ,
119 byteIni akan berakhir setelah perdana Fermat keenam ditemukan.
Cobalah online!
Bagaimana itu bekerja
sumber
Pyth, 10 byte
Menggunakan dugaan bahwa semua nomor Fermat
2^(2^n)+1
merupakan gabungan untukn>4
.sumber
Python, 36 byte
Menggunakan masalah Brocard :
Hitung faktorial yang berurutan dan periksa apakah ada kuadrat dan miliki
k>7
. Terima kasih kepada Dennis untuk 2 byte!Ini mengasumsikan Python terus memiliki aritmatika yang akurat untuk jumlah besar yang sewenang-wenang. Dalam implementasi aktual, ia berakhir.
sumber
-~n**.5
bekerja di tempat(n+1)**.5
?~
, sehingga hanya akan meningkatkan TypeError untuk mencoba meniadakan float bitwise.Perl,
5038363433 bytePenjelasan: 196 adalah nomor Lychrel yang mungkin - angka yang tidak membentuk palindrom dengan berulang kali menambahkan kebalikannya ke dirinya sendiri. Loop berlanjut hingga $ n sama dengan kebalikannya, yang belum diketahui untuk nilai awal 196.
yang tidak valid
jadi tidak ada angka dalam urutan ini yang valid.
Sunting: Dipotong dengan menggunakan loop sampai alih-alih for loop (entah bagaimana). Juga, saya memiliki byte lebih sedikit dari yang saya kira (saya mungkin harus melihat bytecount saya lebih hati-hati di masa depan).
Sunting: Diganti
$n
dengan$_
untuk menyimpan 2 byte untuk argumen tersirat direverse
. Saya pikir ini sama golfnya dengan implementasi ini.Sunting: Saya salah. Alih-alih menggunakan
until($%=reverse)==$_
aku bisa pergi sementara perbedaannya adalah nol (yaitu benar):while($%=reverse)-$_
.sumber
MATL, 11 byte
Mengakhiri jika dugaan Goldbach salah. Yaitu, program berhenti jika menemukan bilangan genap lebih besar dari
2
itu tidak dapat dinyatakan sebagai jumlah dari dua bilangan prima.sumber
05AB1E , 8 byte
Akan berakhir ketika perdana Fermat ke-6 ditemukan.
Penjelasan
sumber
Python,
3028 byteProgram ini akan berhenti jika dan hanya jika ada bilangan bulat n lebih besar dari 1 sehingga 2 ^ (n-1) -1 dapat dibagi dengan n ^ 3. Sepengetahuan saya, tidak diketahui apakah ada nomor dengan properti ini (jika nomor yang memuaskan properti ini prima, itu disebut prima Wieferich pesanan 3 ke basis 2, dan terbuka apakah ada perdana semacam itu).
sumber
(n-1)
dengan~-n
Haskell, 47 byte
Mencari angka kuasi sempurna pertama , yang merupakan angka
n
dengan jumlah pembagi2*n+1
. Alih-alih menambahkan 1, saya mengecualikan 1 dari daftar pembagi.sumber
Brain-Flak,
212208204 byteProgram ini menggunakan algoritma multiplikasi yang ditulis oleh MegaTom dan non-square checker yang ditulis oleh 1000000000
Cobalah secara Online
Program ini dimulai pukul 8 dan menguji setiap angka untuk melihat apakah n! +1 adalah angka kuadrat. Keluar ketika menemukan satu. Ini dikenal sebagai Masalah Brocard dan ini merupakan masalah terbuka dalam matematika.
sumber
Brachylog (v2), 3 byte dalam penyandian Brachylog
Cobalah online! (akan keluar tanpa melakukan sesuatu yang terlihat, untuk alasan yang jelas)
Program lengkap; jika dijalankan tanpa input, cari perdana Smarandache pertama , dan hasilkan
true.
jika dan ketika ditemukan. Ini pertanyaan terbuka, apakah ada bilangan prima Smarandache. (Perhatikan bahwa algoritme pengujian-utama Brachylog, meskipun bekerja secara teori dalam jumlah besar yang sewenang-wenang, cenderung berjalan lambat pada mereka; dengan demikian, jika Anda tertarik untuk menemukan sendiri Smarandache membanggakan, saya sarankan menggunakan bahasa yang berbeda.)Penjelasan
Brachylog beroperasi pada angka desimal angka setiap kali Anda mencoba memperlakukannya seperti daftar, jadi "rentang" diikuti oleh "concatenate" adalah cara yang sangat singkat untuk menghasilkan urutan angka Smarandache (dan kemudian kami memfilternya berdasarkan primality; Brachylog's perilaku program penuh default kemudian akan memaksa elemen pertama dari generator yang dihasilkan). Rentang memiliki nol di depan, tetapi untungnya, dengan pola aliran ini, Brachylog menghapus nol daripada gagal.
Berikut adalah contoh yang menemukan nomor Smarandache pertama yang sama dengan 6 (mod 11), sebagai demonstrasi dari program serupa yang berakhir dalam 60 detik daripada memiliki status penghentian yang tidak diketahui:
Cobalah online!
Ini akan dicetak
true.
sebagai program penuh, tapi saya melemparkanZ
argumen baris perintah untuk benar-benar mencetak nomor yang bersangkutan, memberikan demonstrasi yang lebih baik bahwa pendekatan umum ini berfungsi.sumber
Python 2, 88 byte
Kode ini akan berakhir jika 10223 adalah nomor Sierpiński. 10223 saat ini adalah kandidat terkecil yang mungkin atau mungkin bukan nomor Sierpiński, pada Desember 2013.
Angka Sierpiński adalah angka
k
di mana semua angka dari formulir tersebut(k * 2^n) + 1
adalah gabungan.sumber
10223*2^31172165 + 1
ditemukan . Sejak saat itu,21181
menjadi angka terkecil yang tidak diketahui apakah itu Sierpiński atau bukan.Pyth, 16 byte
Mengembalikan nilai pertama yang tidak dimiliki oleh dugaan Collatz. Karena tidak diketahui apakah dugaan berlaku untuk semua angka, tidak diketahui apakah kode ini akan berakhir.
sumber
Sebenarnya , 16 byte
Cobalah online!
Kode ini berakhir jika ada beberapa nomor komposit
n
yangtotient(n)
membagin-1
( masalah total Lehmer ).Penjelasan:
sumber
Jelly ,
98 byte-1 byte terima kasih kepada @Dennis! (gunakan eksponensial alih-alih multiplikasi untuk menghindari
Æṣ(0)
)Akan mengembalikan daftar nol dan angka sempurna ganjil terkecil , jika ada.
Bagaimana?
sumber
Haskell, 46 byte
Hentikan jika menemukan solusi ke-4 untuk masalah brocard .
sumber
Python, 92 byte
Ini bukan memenangkan kompetisi golf kode apa pun, dan ini membutuhkan memori tak terbatas dan kedalaman rekursi, tetapi ini adalah kesempatan yang hampir sempurna untuk memasukkan masalah menarik yang saya tanyakan pada matematika stackexchange dua tahun lalu, bahwa tidak ada angka Fibonacci lebih besar dari 8 yang merupakan jumlah dua kubus positif . Cukup lucu, itu dimulai sebagai ide kode tantangan golf, jadi saya kira saya sudah datang lingkaran penuh.
sumber
Python 2,
1239892 byteKode ini akan berakhir jika dugaan Goldbach tidak berlaku untuk semua bilangan genap (yaitu jika semua bilangan genap dapat dinyatakan sebagai jumlah dari dua bilangan prima). Saat ini telah diuji untuk angka hingga 4 * 10 ^ 18.
Terima kasih banyak kepada @ Pietu1998 yang telah mempersingkat kode saya!
EDIT: Terima kasih kepada @JonathanAllan karena telah mencukur 6 byte dari kode saya!
sumber
g=lambda n:[p(b)*p(n-b)for b in range(n)]and g(n+2)
. Saya juga berpikir ini harus dibaca "akan berakhir jika dugaan Goldbach tidak berlaku".JavaScript (ES6),
104101 byteMenggunakan metode yang sama dengan jawaban Perl: set n ke 196, lalu berulang kali menambahkan n ke basis 10 terbalik sampai menjadi palindrom di basis 10. Ini akan lebih pendek jika JS mendukung angka presisi sewenang-wenang, tetapi oh well.
sumber
Python, 80 byte
Berakhir jika dugaan Collatz terbukti salah. Lihat pertanyaan ini .
sumber
Python 2, 64 byte
Tidak ada angka Lychrel yang terbukti ada di basis sepuluh. 196 adalah kandidat nomor sepuluh basis Lychrel terkecil. Telah ditunjukkan bahwa jika palindrom ada (membuat 196 bukan angka Lychrel), itu akan memiliki setidaknya satu miliar (10 ^ 9) digit, karena orang telah menjalankan algoritma yang lama.
sumber
Jelly , 7 byte
Cobalah online! (mencetak dua elemen, bukan 4, sehingga Anda benar-benar dapat melihatnya berhenti)
Penjelasan
sumber
R, 30 byte, dapat diperdebatkan apakah itu deterministik
Generator angka acak default R memiliki distribusi kesetaraan dalam 653 dimensi berurutan tetapi tidak diketahui dalam 654 dimensi. Dengan demikian mungkin ada atau mungkin tidak ada urutan nomor pseudorandom yang sampel elemen terendah dari vektor yang diberikan 654 kali berturut-turut (di sini vektor
1:2
).Sejak R RNG periodik (meskipun dengan waktu yang sangat lama), saya menyatakan bahwa ini adalah deterministik karena akhirnya akan loop putaran ke awal. Pendapat Anda mungkin berbeda, tentu saja.
sumber
Python 3, 101 byte
Saya tahu ini lebih lama daripada yang lain, tetapi saya menghabiskan banyak waktu melihat betapa singkatnya saya bisa bermain golf ini.
Upaya ini untuk menyangkal dugaan Sum of Powers Euler untuk
k=6
(tidak ada solusi bilangan bulat positif untuk persamaan DiophantineA^6+B^6+C^6+D^6+E^6==F^6
), yang tidak ditemukan sampel tandingan.Dalam Python 2 (104 byte):
Kurang bermain golf:
Versi matematika tanpa eval:
Referensi alternatif: Euler's Sum of Powers Conjecture - MathWorld
sumber
Python, 68 byte
Cobalah online
Mencoba menjawab salah satu Pertanyaan Gelfand .
sumber
Clojure, 154 byte
Cek apakah ada angka di atas 82.000 yang hanya berisi 0 dan 1 untuk basis 2 sampai ke basis 5. Dengan kata lain, memeriksa apakah ada nomor lain dalam urutan ini .
Dalam kelompok khusus, hanya ada 3 nomor:
0
,1
dan82,000
. Tidak ada lagi angka yang mengikuti aturan yang kurang dari kira-kira3*10^19723
.sumber
Pyt , 14 byte
Pelabuhan jawaban mbomb007 .
sumber