Anda diberi fungsi: h1 (f, * args) dan h2 (f, * args)
Keduanya adalah metode yang sudah ditentukan untuk Anda (di sini tanda bintang menunjukkan sejumlah variabel argumen)
f adalah fungsi, * args adalah daftar parameter yang akan diteruskan ke fungsi itu
h1 mengembalikan nilai boolean: Benar jika fungsi f pernah berhenti ketika dipanggil * args dan False jika tidak (dengan asumsi mesin yang menjalankannya memiliki waktu dan memori yang tak terbatas dan bahwa juru bahasa / kompiler untuk bahasa yang Anda tuliskan tahu bagaimana menangani waktu dan memori tanpa batas).
Jika f (* args) akan membuat panggilan ke h1 atau h2, h1 melempar pengecualian
h2 berperilaku persis seperti h1 kecuali bahwa jika f melakukan panggilan ke h1, maka h2 tidak akan melempar pengecualian
Dalam karakter sesedikit mungkin, tulis sebuah program yang tidak mengambil input dan harus menampilkan:
The Collatz Conjecture is {True/False}
Goldbach's Conjecture is {True/False}
The Twin Primes Conjecture is {True/False}
berdasarkan validitas dari masing-masing dugaan tersebut.
Berikut adalah tautan wikipedia yang menjelaskan masing-masing dugaan:
http://en.wikipedia.org/wiki/Collatz_conjecture
http://en.wikipedia.org/wiki/Goldbach%27s_conjecture
http://en.wikipedia.org/wiki/Twin_prime
Anda dapat mengasumsikan pustaka bilangan bulat besar dalam bahasa apa pun yang Anda pilih untuk digunakan akan berhasil mewakili bilangan bulat besar yang sewenang-wenang. Dengan kata lain, kita akan menganggap bahasa / pustaka apa pun yang mampu mengekspresikan 3**(3**10)
juga mampu mengekspresikan 3**(3**(3**10))
pada mesin yang cukup gemuk.
Jelas karena tidak mungkin menjalankan program Anda, berikan penjelasan tentang cara kerjanya bersama dengan kode
Jawaban:
J, 207
Saya memilih untuk menggunakan
f
dang
menggantikanh1
danh2
, sesuai dengan karunia; dua baris tambahan dengan 10 karakter sebelum cukup untuk beralih:f=:h1
,g=:h2
.Dan logika yang sebenarnya:
Collatz
((-:`>:@*&3)^:(~:&1))^:_
adalah dagingnya; itu pada dasarnya adalah sebuah loop yang tidakwhile (x != 1) x = collatz(x)
. Jika kita sebut kalimat itureduce
:reduce&f
dimaksudkan untuk menjadi kata kerja monadik (lihat akhir), di manareduce&f n
benar iffreduce(n)
berhenti. Bit loop-y lainnya>:^:()^:_
,, pada dasarnya adalah loop infinite (>:
adalah increment,^:
dapat digunakan sebagai kondisional dan iterator) yang terputus saat menemui pengurangan Collatz yang tidak berhenti. Akhirnyag
dipanggil untuk melihat apakah loop tak terbatas pernah berakhir.Goldbach
Logika yang sama, untuk sebagian besar, perbedaan yang jelas menjadi perhitungan inti sekarang
+./@1&p:@(-p:@_1&p:)
.-p:@_1&p:
menghitung perbedaan antara angka dan semua bilangan prima kurang dari angka itu,1&p:
adalahisPrime
fungsi, dan+./
logis ATAU. Oleh karena itu, jika perbedaan antara bilangan dan bilangan prima apa pun yang kurang dari bilangan itu juga bilangan prima, maka dugaan Goldbach terpenuhi, dan loop infinite berlanjut. Sekali lagi,f
digunakan dalam tes akhir apakah loop infinite tersebut benar-benar tidak terbatas.Twin Primes
Sama seperti di atas, kecuali
(4&p:)^:(2&~:@(-~4&p:))
.4&p:
mengembalikan prime terbesar berikutnya setelah angka yang diberikan.-~4&p:
mengembalikan perbedaan antara angka dan prime terbesar berikutnya setelahnya.2&~:
adalah!= 2
. Jadi loop terdalam dianalogikan denganwhile (nextPrimeAfter(p) - p != 2) p = nextPrimeAfter(p)
.Catatan
Mungkin ada kesalahan sintaksis, karena saya belum diuji dengan dummy
f
dang
belum. Juga, saya berasumsi ituf
dang
akan mengambil semacam bentuk yang dapat dikomposisikan dengan kata kerja di sebelah kiri dan kata benda di sebelah kanan, yang saya tidak sepenuhnya yakin mengikuti tata bahasa J dengan cara apa pun. Mereka secara inheren memiliki fungsi urutan yang lebih tinggi, dan saya terlalu lelah untuk mencari konstruksi yang tepat sebagai kata keterangan / konjungsi / apa-apa yang Anda miliki saat ini, jika ada konstruksi yang sesuai.Saya tidak benar-benar menggunakan penggabungan string yang tepat, dan bukannya memilih untuk meninggalkan string individu kotak. Outputnya (dengan asumsi semuanya benar) karena itu akan menjadi tabel 3 kolom, dengan kolom kiri adalah "The Collatz", dll., Kolom tengah adalah "Dugaan adalah", dan kolom kanan "Benar" / "Salah" .
Saya juga cukup yakin J tidak mengubah bilangan bulat ke presisi sewenang-wenang secara default, dan fungsi utilitas bilangan prima yang penting
p:
tidak memiliki domain besar yang sewenang-wenang. Di sisi lain, mengingat J memang mendukung tipe angka presisi arbitrer standar, saya tidak yakin berapa banyak upaya yang diperlukan untuk mendapatkan kode ini secara normal.sumber
Haskell, 242
karena dalam variabel Haskell dapat berisi tidak hanya nilai, tetapi perhitungan (ini disebut kemalasan) saya membiarkan diri saya
h1, h2
mengambil argumen tunggal dan mengembalikan cuaca atau tidak evaluasi itu akan berhenti.kode yang agak tidak dipisahkan:
sedikit penjelasan:
ketika
all
diterapkan ke daftar tak terbatas, itu akan berhenti jika salah satu elemen dari daftar adalahFalse
, karena kemalasan (korsleting, untuk semua orang non-Haskell di luar sana). kami menggunakan ini untuk menghitung dugaan collatz dan dugaan primes kembar.!
paket tipuan ini bersama dengan pencetakan. hasilnya adalahTrue
ketikaf
berakhir pada semua angka4..
. (Ini tidak masalah untuk dugaan collatz atau dugaan prima kembar, karena kita sudah tahu mereka benar untuk jumlah kecil seperti itu).kode untuk dugaan collatz adalah
"The Collatz"!c
. itu mencetak "The Collatz Conjecture is" dan hasilnya, yaitu cuacac
berakhir pada semua angka4..
.kode untuk dugaan goldbach adalah
"Goldbach's"! \n->or[p$n-r|r<-[2..n-2],p r]
.\n->or[p$n-r|r<-[2..],p r,r<n+1]
adalah fungsi yang diberikann
, jika merupakan jumlah dari dua bilangan prima, kembaliTrue
, tetapi sebaliknya loop tanpa batas. dengan demikian, jika berhenti untuk4..
dugaan setiap goldbach adalah benar.kode untuk dugaan bilangan prima kembar adalah
"The Twin Primes"! \n->or[p$r+2|r<-[n..],p r]
.\n->or[p$r+2|r<-[n..],p r]
adalah fungsi yang diberikann
, jika ada bilangan prima kembar lebih besar darin
, mengembalikan True, tetapi sebaliknya loop tanpa batas. dengan demikian, jika berhenti untuk setiap4..
dugaan prime twin adalah benar.sumber
Python (965 karakter)
Karena pertanyaan saya adalah tidak mendapatkan cinta. Saya memposting solusi (non-kode-golf) saya di Python:
Ini cukup sederhana.
numCollatzSteps (n) mengatakan berapa banyak langkah urutan Collatz untuk n tertentu. Ini berjalan tanpa batas jika urutan Collatz tidak berakhir.
findNonHaltingN () menghitung ke atas memeriksa numCollatzSteps yang berakhir untuk setiap n. findNonHaltingN berakhir jika dan hanya jika ada n yang numCollatzSteps tidak berakhir.
Jadi kita dapat memeriksa apakah dugaan Collatz benar dengan memeriksa bahwa findNonHaltingN () tidak berhenti
isPrime (n) memeriksa apakah suatu bilangan prima dengan melihat bahwa tidak ada bilangan bulat positif dari 1 hingga n-1 yang membaginya
isSumOf2Primes (n) mengulangi semua bilangan bulat positif antara 2 dan n-2 dan memeriksa bahwa setidaknya satu bilangan prima bersama dengan pelengkapnya
findNonSum () menghitung bilangan genap ke atas dari 4 hingga mencapai angka pertama yang bukan jumlah 2 bilangan prima dan kemudian mengembalikannya. Jika tidak ada nomor seperti itu, maka itu akan berlanjut tanpa batas.
Kita dapat memeriksa apakah dugaan Goldbach benar dengan melihat findNonSum tidak berhenti.
isSmallTwinPrime (n) mengembalikan true jika dan hanya jika n dan n + 2 keduanya prima
nextSmallTwinPrime (n) mengembalikan angka berikutnya> = n yang isSmallTwinPrime benar
latestTwinPrimes () dihitung dari 2 memeriksa bahwa nextSmallTwinPrime berhenti untuk semua n. Jika nextSmallTwinPrime selanjutnya tidak berhenti untuk beberapa n, maka berarti bilangan prima kembar terbesar adalah n-1 dan n +1 dan kami berhenti di sana
Kemudian kita dapat memeriksa validitas dugaan kembar prima dengan memeriksa bahwaTwinPrimes terbesar tidak pernah berhenti.
sumber
APL (234)
Jelas tidak teruji, tetapi logikanya tampaknya sehat. Semua perintah pencetakan sudah termasuk, output berupa
104
karakter dan logika aktualnya130
.Tidak Disatukan:
sumber
3**(3**10)
(3*3*10
dalam APL), yang memberikan DOMAIN ERROR di tryapl.org.