Percaya atau tidak, kami belum memiliki kode tantangan golf untuk tes primality sederhana . Meskipun ini mungkin bukan tantangan yang paling menarik, terutama untuk bahasa "biasa", ini bisa menjadi masalah biasa dalam banyak bahasa.
Fitur kode Rosetta berisi daftar berdasarkan pendekatan idiomatik untuk pengujian primality, satu menggunakan uji Miller-Rabin secara khusus dan lainnya menggunakan divisi uji coba . Namun, "paling idiomatik" sering tidak bersamaan dengan "terpendek." Dalam upaya untuk menjadikan Programming Puzzles dan Code Golf sebagai situs utama untuk golf kode, tantangan ini berupaya menyusun katalog pendekatan terpendek dalam setiap bahasa, mirip dengan "Halo, Dunia!" dan Golf Anda quine untuk kebaikan! .
Selain itu, kemampuan menerapkan tes primality adalah bagian dari definisi bahasa pemrograman kami , jadi tantangan ini juga akan berfungsi sebagai direktori bahasa pemrograman yang terbukti.
Tugas
Tulis program lengkap yang, dengan bilangan bulat positif n sebagai input, menentukan apakah n adalah prima dan mencetak nilai yang benar atau salah .
Untuk tujuan tantangan ini, bilangan bulat adalah prima jika memiliki tepat dua pembagi positif. Perhatikan bahwa ini tidak termasuk 1 , yang merupakan satu-satunya pembagi yang benar-benar positif.
Algoritme Anda harus deterministik (yaitu, menghasilkan output yang benar dengan probabilitas 1) dan harus, secara teori, bekerja untuk bilangan bulat besar yang sewenang-wenang. Dalam praktiknya, Anda dapat mengasumsikan bahwa input dapat disimpan dalam tipe data Anda, selama program bekerja untuk bilangan bulat dari 1 hingga 255.
Memasukkan
Jika bahasa Anda dapat membaca dari STDIN, menerima argumen baris perintah atau bentuk alternatif lain dari input pengguna, Anda dapat membaca integer sebagai representasi desimal, representasi unary (menggunakan karakter pilihan Anda), byte array (besar atau little endian) atau byte tunggal (jika ini adalah tipe data terbesar bahasa Anda).
Jika (dan hanya jika) bahasa Anda tidak dapat menerima segala jenis input pengguna, Anda dapat mengubah kode input dalam program Anda.
Dalam hal ini, integer hardcoded harus mudah ditukar. Secara khusus, ini mungkin hanya muncul di satu tempat di seluruh program.
Untuk tujuan penilaian, kirimkan program yang sesuai dengan input 1 .
Keluaran
Keluaran harus ditulis ke STDOUT atau alternatif terdekat.
Jika memungkinkan, output harus semata-mata terdiri dari nilai truey atau falsy (atau representasi stringnya), secara opsional diikuti oleh satu baris baru.
Satu-satunya pengecualian untuk aturan ini adalah output konstan dari juru bahasa Anda yang tidak dapat ditekan, seperti salam, kode warna ANSI atau lekukan.
Aturan tambahan
Ini bukan tentang menemukan bahasa dengan pendekatan terpendek untuk pengujian prima, ini tentang menemukan pendekatan terpendek dalam setiap bahasa. Karenanya, tidak ada jawaban yang akan ditandai sebagai diterima.
Kiriman dalam sebagian besar bahasa akan dinilai dalam byte dalam pengkodean yang sudah ada sebelumnya, biasanya (tetapi tidak harus) UTF-8.
Bahasa Piet , misalnya, akan diberi skor dalam kode, yang merupakan pilihan alami untuk bahasa ini.
Beberapa bahasa, seperti Folder , agak sulit untuk dinilai. Jika ragu, silakan tanyakan di Meta .
Tidak seperti aturan kami yang biasa, jangan ragu untuk menggunakan bahasa (atau versi bahasa) meskipun itu lebih baru daripada tantangan ini. Jika ada yang ingin menyalahgunakan ini dengan membuat bahasa tempat program kosong melakukan tes primality, selamat untuk membuka jalan bagi jawaban yang sangat membosankan.
Perhatikan bahwa harus ada penerjemah agar pengajuan dapat diuji. Diperbolehkan (dan bahkan dianjurkan) untuk menulis sendiri penerjemah ini untuk bahasa yang sebelumnya tidak diterapkan.
Jika bahasa pilihan Anda adalah varian sepele dari bahasa lain (yang berpotensi lebih populer) yang sudah memiliki jawaban (pikirkan dialek BASIC atau SQL, cangkang Unix atau turunan Brainfuck sepele seperti Headecks atau Unary), pertimbangkan untuk menambahkan catatan ke jawaban yang ada bahwa solusi yang sama atau sangat mirip juga merupakan yang terpendek dalam bahasa lain.
Built-in fungsi untuk pengujian primality yang diperbolehkan. Tantangan ini dimaksudkan untuk membuat katalog solusi terpendek yang mungkin ada dalam setiap bahasa, jadi jika lebih pendek untuk menggunakan built-in dalam bahasa Anda, lakukanlah.
Kecuali jika telah ditolak sebelumnya, semua aturan standar kode-golf berlaku, termasuk http://meta.codegolf.stackexchange.com/q/1061 .
Sebagai catatan tambahan, tolong jangan turunkan jawaban yang membosankan (tetapi valid) dalam bahasa yang tidak banyak memiliki golf; ini masih berguna untuk pertanyaan ini karena mencoba mengkompilasi katalog selengkap mungkin. Namun, lakukan sebagian besar pilihan jawaban dalam bahasa di mana penulis benar-benar harus berusaha kode golf.
Katalog
Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Jawaban:
Halo Dunia! , 13
sumber
Hexagony , 29 byte
Versi kode ini yang dapat dibaca adalah:
Penjelasan: Ini menguji apakah ada angka dari 2 hingga n-1 yang membagi n.
Inisialisasi:
Tulis n di satu sel memori dan n-1 di yang lain:
Kasus Khusus n = 1:
Cetak 0 dan akhiri
Putaran
Hitung n% a dan kurangi a. Hentikan jika a = 1 atau n% a = 0.
Kasus a = 1:
Tambah 0 ke 1, cetak dan hentikan. (Penunjuk instruksi berjalan ke arah NE dan loop dari sudut timur ke sudut barat daya. Dan $ memastikan itu mengabaikan perintah berikutnya)
Huruf a% n = 0:
Cetak 0 dan akhiri (Petunjuk penunjuk sedang menjalankan SW dan loop ke atas ke @
sumber
Hexagony ,
2189258 5855 bytePerhatikan: Jawaban ini telah dipukuli dengan kuat dengan solusi sisi-panjang 4 oleh Etoplay.
Program Hexagony yang non-sepele (non-linear) yang pertama! Ini didasarkan pada pendekatan kuadrat-faktorial yang sama dengan jawaban Labyrinth Sp3000 . Setelah memulai dengan segi enam ukuran 10, saya berhasil memampatkannya ke ukuran 5. Namun, saya dapat menggunakan kembali beberapa kode duplikat dan masih ada banyak no-ops dalam kode, jadi ukuran 4 mungkin saja menjadi mungkin.
Penjelasan
Untuk memahami kode, pertama-tama kita harus membuka lipatannya. Hexagony menempatkan kode sumber apa pun ke angka heksagonal terpusat berikutnya dengan no-ops (
.
), yang mana61
. Kemudian mengatur ulang kode menjadi segi enam reguler dengan ukuran yang sesuai:Ini cukup banyak golf dengan persimpangan dan tumpang tindih jalur eksekusi dan beberapa instruksi petunjuk (IP). Untuk menjelaskan cara kerjanya, pertama-tama mari kita lihat versi yang tidak dikenali di mana aliran kontrol tidak melewati batas, hanya satu IP yang digunakan dan jalur eksekusi sesederhana mungkin:
Catatan sisi: kode di atas dimulai dengan mengeksekusi baris pertama, yang penuh dengan no-ops. Kemudian, ketika IP menyentuh tepi timur laut, ia membungkus ke sudut paling kiri (
)
), di mana kode aktual dimulai.Sebelum kita mulai, sepatah kata tentang tata letak memori Hexagony. Ini agak seperti rekaman Brainfuck tentang steroid. Sebenarnya, ini bukan pita, tapi itu adalah grid heksagonal itu sendiri (yang tak terbatas), di mana setiap sisi memiliki nilai integer, yang awalnya 0 (dan sebagai lawan dari Brainfuck standar, nilai-nilai tersebut bertanda bilangan bulat presisi presisi). Untuk program ini, kami akan menggunakan empat sisi:
Kami akan menghitung faktorial di tepi A , menghitung mundur masukan kami di tepi C dan menyimpan salinan lain dari input (untuk Modulo) di tepi D . B digunakan sebagai tepi sementara untuk perhitungan.
Memory pointer (MP) dimulai pada tepi A dan menunjuk ke utara (ini penting untuk menggerakkan MP sekitar). Sekarang di sini adalah bit pertama dari kode:
)
menambah tepi A menjadi1
dasar faktorial.}
membuat MP berbelok ke kanan, yaitu pindah ke tepi C (menunjuk utara-timur). Di sini kita membaca input sebagai integer?
. Kemudian kita belok kanan lagi ke ujung D dengan}
.=
membalikkan MP, seperti yang menunjuk pada simpul bersama dengan C .&
menyalin nilai dari C (input) ke D - nilai tersebut disalin dari kiri karena nilai saat ini adalah non-positif (nol). Akhirnya, kami membuat MP berbelok ke kiri ke C dengan{
.Berikutnya,
<
secara teknis adalah cabang, tetapi kita tahu bahwa nilai saat ini adalah positif, sehingga IP akan selalu berbelok ke kanan menuju>
. Sebuah cabang memukul dari tindakan sisi sebagai cermin, sehingga IP bergerak horizontal lagi, menuju(
, yang decrements nilai dalam C .Cabang berikutnya,
<
adalah benar-benar cabang sekarang. Ini adalah cara kami beralih darin-1
bawah ke1
. Sementara nilai saat ini dalam C positif, IP mengambil belokan kanan (untuk menjalankan loop). Setelah kami mencapai nol, itu akan berbelok ke kiri.Mari kita lihat loop "tubuh". The
|
adalah cermin sederhana,>
dan<
juga digunakan sebagai cermin lagi. Itu berarti tubuh loop yang sebenarnya bermuara ke}
memindahkan MP ke tepi B ,=
membalikkan arahnya untuk menghadapi titik puncak ABC .)
menambah nilai: ini hanya relevan untuk iterasi pertama, di mana nilai B masih nol: kami ingin memastikan bahwa itu positif, sehingga instruksi berikutnya&
menyalin tetangga yang tepat , yaitu A , yaitu nilai saat ini dari faktorial perhitungan, menjadi B .}
kemudian memindahkan MP ke A ,=
membalikkannya lagi untuk menghadapi titik umum.*
mengalikan kedua tetangga, yaitu tepi B dan C dan menyimpan hasilnya di A . Akhirnya, kami memiliki yang lain}=
untuk kembali ke C , masih menghadap ABC titik .Saya harap Anda dapat melihat bagaimana ini menghitung faktorial dari
n-1
dalam A .Jadi sekarang kita telah melakukan itu, penghitung lingkaran dalam C adalah nol. Kami ingin kuadrat faktorial dan kemudian mengambil modulo dengan input. Itulah yang dilakukan kode ini:
Sejak C adalah nol,
&
salinan tetangga kiri, yaitu faktorial di A .}=*
bergerak ke B dan menyimpan produk dari dua salinan dari faktorial (yaitu alun-alun) di B .{
kembali ke C , tetapi tidak membalikkan MP. Kita tahu bahwa nilai saat sekarang positif, sehingga&
salinan masukan dari D ke C .'
MP mundur ke kanan, yaitu ke A . Ingat, alun-alun dari faktorial adalah di B dan input di C . Jadi%
hitung(n-1)!^2 % n
, persis apa yang kita cari.!
mencetak hasilnya sebagai integer (0 atau 1) dan@
mengakhiri program.Oke, tapi itu versi yang tidak disunat. Bagaimana dengan versi golf? Anda perlu tahu dua hal lagi tentang Hexagony:
]
dan ke yang sebelumnya dengan[
. (Anda juga dapat memilih yang spesifik dengan#
, tetapi itu untuk waktu lain.)Ada juga beberapa perintah baru di dalamnya:
\
dan/
seperti mirror|
, dan~
mengalikan nilai saat ini dengan-1
.Jadi, bagaimana versi yang tidak disunting diterjemahkan menjadi versi golf? Kode pengaturan linier
)}?}=&{
dan struktur loop dasar dapat ditemukan di sini:Sekarang badan loop melintasi tepi beberapa kali, tetapi yang paling penting, perhitungan aktual diserahkan ke IP sebelumnya (yang dimulai di sudut kiri, bergerak ke timur laut):
Setelah memantul cabang ke arah tenggara, IP membungkus tepi ke dua
=
di sudut kiri atas (yang, bersama-sama, adalah no-op), kemudian memantul dari/
. The~
membalikkan tanda dari nilai saat ini, yang penting untuk iterasi berikutnya. IP membungkus tepi yang sama lagi dan akhirnya menyentuh di[
mana kontrol diserahkan ke IP lainnya.Yang ini sekarang dijalankan
~}=)&}=*}
yang menghilangkan negasi dan kemudian hanya menjalankan tubuh loop tanpa tanda (minus the=
). Akhirnya menyentuh]
tangan mana yang mengontrol kembali ke IP asli. (Perhatikan bahwa lain kali, kami mengeksekusi IP ini, ia akan mulai dari tempat IP itu ditinggalkan, jadi itu akan lebih dulu menyentuh sudut. Kami perlu nilai saat ini menjadi negatif agar IP dapat melompat kembali ke tepi barat laut) bukannya yang di tenggara.)Setelah IP asli melanjutkan kontrol, itu memantul
\
, mengeksekusi sisanya=
dan kemudian hits>
untuk dimasukkan ke dalam iterasi loop berikutnya.Sekarang bagian yang benar-benar gila: apa yang terjadi ketika loop berakhir?
IP bergerak timur laut membentuk
<
dan membungkus diagonal timur laut. Jadi berakhir di jalur eksekusi yang sama dengan loop body (&}=*}]
). Yang sebenarnya cukup keren, karena itulah kode yang ingin kita jalankan pada titik ini, setidaknya jika kita menambahkan yang lain=}
(karena}=}
setara dengan{
). Tetapi bagaimana ini tidak benar-benar masuk ke loop sebelumnya lagi? Karena]
perubahan pada IP berikutnya yang sekarang menjadi (sejauh ini tidak digunakan) IP yang dimulai di sudut kanan atas, bergerak ke barat daya. Dari sana, IP terus sepanjang tepi, membungkus ke sudut kiri atas, bergerak ke bawah diagonal, memantul|
dan berakhir pada@
saat menjalankan bit terakhir dari kode linier:(Ini
)(
adalah no-op tentu saja - saya harus menambahkan(
karena)
sudah ada di sana.)Fiuh ... sangat berantakan ...
sumber
1
) . Apa1
yang kamu bicarakan disana?)
digunakan untuk menjadi1
.Pyth, 4 byte
Cetakan
True
atauFalse
.sumber
P_
Retina , 16 byte
Cobalah online!
Mari kita mulai dengan klasik: mendeteksi bilangan prima dengan regex . Input harus diberikan secara unary , menggunakan karakter yang dapat dicetak berulang. Test suite mencakup konversi dari desimal ke unary untuk kenyamanan.
Program Retina yang terdiri dari satu baris memperlakukan garis itu sebagai regex dan mencetak jumlah kecocokan yang ditemukan dalam input, yang akan
0
untuk bilangan komposit dan1
untuk bilangan prima.Lookahead memastikan bahwa input tidak komposit: backtracking akan mencoba setiap kemungkinan substring (minimal 2 karakter) untuk
(..+)
, lookahead kemudian mencoba untuk mencocokkan sisa input dengan mengulangi apa yang ditangkap di sini. Jika ini memungkinkan, itu berarti input memiliki pembagi yang lebih besar dari 1, tetapi yang kurang dari itu sendiri. Jika itu masalahnya, lookahead negatif menyebabkan pertandingan gagal. Untuk bilangan prima tidak ada kemungkinan seperti itu, dan pertandingan berlanjut.Satu-satunya masalah adalah bahwa lookahead ini juga menerima
1
, jadi kami mengesampingkannya dengan mencocokkan setidaknya dua karakter dengan..
.sumber
CJam, 4 byte
CJam memiliki operator bawaan untuk pengujian primality.
sumber
limp
pimp
cjam saya.pimp
secara obyektif lebih germol~mp
q
membaca sebaris input,i
mem- parsingnya sebagai integer, danmp
merupakan bawaannya . CJam memiliki dua kelompok built-in dua-char: yang "diperluas" dimulaie
dan yang "matematis" dimulaim
HTML + CSS, 254 + n maks * 28 byte
Kita dapat memeriksa primality menggunakan ekspresi reguler. Mozilla memiliki
@document
, yang didefinisikan sebagai:Untuk memfilter elemen melalui CSS berdasarkan URL saat ini. Ini adalah satu langkah, jadi kita harus melakukan dua langkah:
1. Mendapatkan Input
Cara terpendek yang dapat saya pikirkan untuk mendapatkan input dan mentransfernya ke URL adalah
GET
formulir dengan kotak centang. Untuk regex, kita hanya perlu beberapa string unik untuk menghitung penampilan.Jadi kita mulai dengan ini (61 byte):
Kami mendapat dua
<p>
s unik untuk menunjukkan apakah angka yang dimasukkan adalah prima (1) atau tidak (0). Kami juga mendefinisikan bentuk dan tindakannya.Diikuti oleh n max checkbox dengan nama yang sama (n max * 28 bytes):
Diikuti oleh elemen kirim (34 byte):
2. Tampilkan Jawaban
Kami membutuhkan CSS (159 byte) untuk memilih
<p>
tampilan (1 atau 0):»Cobalah di codepen.io (hanya firefox)
sumber
Tolong, WarDoq! , 1 byte
Output 1 jika inputnya prima, 0 sebaliknya.
sumber
Hexagony , 28 byte
Karena Etoplay benar-benar mengalahkan saya dalam pertanyaan ini , saya merasa bahwa saya harus mengalahkan satu-satunya jawaban lainnya .
Cobalah online!
Saya menggunakan Teorema Wilson, seperti yang Martin lakukan dalam jawabannya : Diberikan
n
, saya hasilkan(n-1!)² mod n
Ini dia programnya dibuka:
Dan ini adalah versi yang dapat dibaca :
Penjelasan:
Program ini memiliki tiga langkah utama: Inisialisasi , Faktorial dan Output .
Model memori Hexagony adalah kisi heksagonal tak terbatas. Saya menggunakan 5 lokasi memori, seperti yang ditunjukkan dalam diagram ini:
Saya akan merujuk ke lokasi-lokasi ini (dan bilangan bulat disimpan di dalamnya) oleh label mereka pada diagram itu.
Inisialisasi:
Pointer instruksi ( IP ) dimulai di sudut kiri atas, menuju ke Timur. Penunjuk memori ( MP ) dimulai pada IN .
Pertama,
?
baca nomor dari input dan simpan di IN . The IP tetap pada jalur biru, tercermin\
. Urutan"&(
menggerakkan MP kembali dan ke kiri (ke A ), menyalin nilai dari IN ke A dan menurunkannya.The IP kemudian keluar satu sisi segi enam dan re-memasuki sisi lain (ke jalan yang hijau). Dijalankan
'+
yang bergerak MP untuk B dan salinan apa yang ada di A .<
mengalihkan IP ke Barat.Faktorial:
Saya menghitung faktorial dengan cara tertentu, sehingga mengkuadratkannya mudah. Saya menyimpan
n-1!
di B dan C sebagai berikut.Penunjuk instruksi dimulai pada jalur biru, menuju ke Timur.
='
membalikkan arah MP dan bergerak ke belakang untuk C . Ini setara dengan{=
tetapi memiliki=
tempat itu sangat membantu nanti.&{
salinan nilai dari A ke C , kemudian bergerak MP kembali ke A . The IP kemudian mengikuti jalur hijau, melakukan apa-apa, sebelum mencapai jalur merah, memukul\
dan pergi ke jalan oranye.Dengan
(>
, kami mengurangi A dan mengarahkan IP East. Berikut hits cabang:<
. Untuk positif A , kami melanjutkan sepanjang jalur oranye. Kalau tidak, IP akan diarahkan ke Timur Laut.'*
bergerak MP untuk B dan menyimpan A * C di B . Di(n-1)*(n-2)
sinilah input awal beradan
. The IP kemudian memasuki kembali ke loop awal dan terus decrementing dan mengalikan sampai A mencapai0
. (komputasin-1!
)NB : Pada loop berikut,
&
menyimpan nilai dari B dalam C , karena C memiliki nilai positif yang tersimpan di dalamnya sekarang. Ini penting untuk menghitung faktorial.Keluaran:
Ketika A mencapai
0
. Cabang mengarahkan IP di sepanjang jalur biru sebagai gantinya.=*
membalikkan MP dan menyimpan nilai B * C di A . Kemudian IP keluar hexagon dan masuk kembali di jalur hijau; mengeksekusi"%
. Ini menggerakkan MP ke OUT dan menghitung A mod IN , atau(n-1!)² mod n
.Berikut ini
{"
bertindak sebagai no-op, karena mereka membatalkan satu sama lain.!
mencetak hasil akhir dan*+'(
dieksekusi sebelum penghentian:@
.Setelah eksekusi, (dengan input
5
) memori terlihat seperti ini:Gambar-gambar indah dari aliran kontrol dibuat menggunakan Hexagony Coloror Timwi .
Terima kasih kepada Martin Ender karena membuat semua gambar, karena saya tidak bisa melakukannya di PC saya.
sumber
Mornington Crescent , 2448 bytes
Kami kembali di London!
Timwi sangat baik hati untuk mengimplementasikan stasiun aliran kontrol
Temple
danAngel
dalam IDE Esoterik serta menambahkan input dan pengurai integer ke spesifikasi bahasa.Yang ini mungkin lebih baik bermain golf daripada "Hello, World!", Karena kali ini saya menulis skrip CJam untuk membantu saya menemukan jalur terpendek antara dua stasiun. Jika Anda ingin menggunakannya (walaupun saya tidak tahu mengapa ada orang yang mau ...), Anda dapat menggunakan juru bahasa online . Tempel kode ini:
Di sini dua baris pertama adalah stasiun yang ingin Anda periksa. Juga, rekatkan isi pastebin ini ke jendela input.
Output akan menunjukkan kepada Anda jalur mana yang tersedia di dua stasiun, dan kemudian daftar semua stasiun yang menghubungkan keduanya, diurutkan berdasarkan panjang nama stasiun. Ini menunjukkan semuanya, karena kadang-kadang lebih baik menggunakan nama yang lebih panjang, baik karena memungkinkan garis yang lebih pendek, atau karena stasiun itu istimewa (seperti Bank atau Kuil) sehingga Anda ingin menghindarinya. Ada beberapa kasus tepi di mana dua stasiun tidak terhubung oleh stasiun tunggal lainnya (terutama, garis Metropolitan dan Distrik tidak pernah menyeberang), dalam hal ini Anda harus mencari tahu hal lain. ;)
Sedangkan untuk kode MC yang sebenarnya, ini didasarkan pada pendekatan kuadrat-faktorial karena banyak jawaban lain karena MC memiliki perkalian, pembagian, dan modulo. Juga, saya pikir satu loop akan nyaman.
Satu masalah adalah bahwa loop adalah loop do-while, dan decrementing dan incrementing itu mahal, jadi saya tidak bisa dengan mudah menghitung
(n-1)!
(untukn > 0
). Sebagai gantinya, saya menghitungn!
dan kemudian membagin
pada akhirnya. Saya yakin ada solusi yang lebih baik untuk ini.Ketika saya mulai menulis ini, saya berpikir bahwa menyimpan
-1
di Hammersmith akan menjadi ide yang baik sehingga saya dapat mengurangi lebih murah, tetapi pada akhirnya ini mungkin lebih mahal daripada menghemat. Jika saya menemukan kesabaran untuk mengulangi hal ini, saya mungkin mencoba menjaga-1
di Upminster saja sehingga saya dapat menggunakan Hammersmith untuk sesuatu yang lebih berguna.sumber
Brachylog (V2), 1 byte
Cobalah online!
Brachylog (V1), 2 byte
Ini menggunakan predikat bawaan
#p - Prime
, yang membatasi inputnya menjadi bilangan prima.Brachylog adalah upaya saya untuk membuat Prolog versi Golf Code, yaitu bahasa golf kode deklaratif yang menggunakan backtracking dan unifikasi.
Solusi alternatif tanpa built-in: 14 byte
Berikut ini adalah rincian kode di atas:
sumber
Haskell, 49 byte
Menggunakan xnor's wajar untuk teorema Wilson :
sumber
main=interact$\n-> ...
?interact...read
di sana di suatu tempat, yang membuatnya jauh lebih lama dari sekadarreadLn
. Seringkalido
notasi bisa lebih ringkas daripada yang Anda harapkan, terutama ketika alternatifnya adalah lambda.Labirin , 29 byte
Membaca bilangan bulat dari STDIN dan output
((n-1)!)^2 mod n
. Teorema Wilson sangat berguna untuk tantangan ini.Program dimulai di sudut kiri atas, dimulai dengan
1
yang mengalikan bagian atas tumpukan dengan 10 dan menambahkan 1. Ini adalah cara Labyrinth membangun jumlah besar, tetapi karena tumpukan Labyrinth dipenuhi dengan nol, efek akhirnya adalah seolah-olah kita hanya mendorong 1.?
kemudian membacan
dari STDIN dan:
menggandakannya.}
bergesern
ke stack bantu, untuk digunakan di akhir modulo.(
kemudian pengurangann
, dan kami siap untuk mulai menghitung faktorial kuadrat.Kedua
:
(duplikat) kami berada di persimpangan, dan di sini fitur kontrol aliran Labyrinth ikut berperan. Di persimpangan setelah instruksi dijalankan, jika bagian atas tumpukan positif kita berbelok ke kanan, untuk negatif kita belok kiri dan untuk nol kita lurus ke depan. Jika Anda mencoba untuk berbalik tetapi menabrak dinding, Labyrinth membuat Anda berbelok ke arah sebaliknya.Karena
n = 1
, karena bagian atas tumpukann
dikurangi, atau0
, kita langsung saja. Kami kemudian mencapai no-op'
diikuti oleh penurunan lain(
yang menempatkan kami di-1
. Ini negatif, jadi kami belok kiri, mengeksekusi+
plus (-1 + 0 = -1
),{
untuk beralihn
kembali dari stack bantu ke main dan%
modulo (-1 % 1 = 0
). Lalu kami output dengan!
dan berakhir dengan@
.Sebab
n > 1
, pada detik:
kita belok kanan. Kami kemudian menggeser}
penghitung perulangan yang disalin ke tumpukan tambahan, menggandakan:
dan mengalikan dua kali**
, sebelum menggeser penghitung mundur{
dan mengurangi(
. Jika kita masih positif kita mencoba untuk berbelok ke kanan tetapi tidak bisa, jadi Labyrinth membuat kita berbelok ke kiri, melanjutkan putaran. Kalau tidak, bagian atas tumpukan adalah penghitung lingkaran kami yang telah dikurangi menjadi 0, yang kami+
tambahkan ke perhitungan kami((n-1)!)^2
. Akhirnya, kami beralihn
kembali dengan{
modulo%
, output!
dan terminasi@
.Saya mengatakan bahwa itu
'
adalah no-op, tetapi juga dapat digunakan untuk debugging. Jalankan dengan-d
bendera untuk melihat status tumpukan setiap kali'
dilewati!sumber
Utilitas Bash + GNU, 16
4 byte disimpan berkat @Dennis
2 byte disimpan berkat @Lekensteyn
Input adalah satu baris yang diambil dari STDIN. Output adalah string kosong untuk falsey dan string non-kosong untuk truey. Misalnya:
sumber
factor|awk NF==2
Java,
126121 byteSaya kira kita membutuhkan jawaban Java untuk papan skor ... jadi inilah loop pembagian percobaan sederhana:
Seperti biasa untuk Java, persyaratan "program penuh" membuat ini jauh lebih besar daripada jika itu adalah fungsi, sebagian besar karena
main
tanda tangan.Dalam bentuk yang diperluas:
Sunting: Diperbaiki dan disatukan kembali oleh Peter dalam komentar. Terima kasih!
sumber
1
itu prima. Kalau tidak, akan ada penghematan 4-char dengan menghapusp
dan berkatafor(;i<n;)n=n%i++<1?0:n;System.out.print(n>0);
class P{public static void main(String[]a){int i=2,n=Short.valueOf(a[0]);for(;i<n;)n=n%i++<1?0:n;System.out.print(n>1);}}
bekerja.valueOf
Anda dapat menggunakannew
, seperti dalamnew Short(a[0])
, ataunew Long(a[0])
, yang sedikit lebih pendek.public
pengubah.Brain-Flak ,
112108 byteCobalah online!
Bagaimana itu bekerja
Awalnya, tumpukan pertama akan berisi bilangan bulat positif n , tumpukan kedua akan kosong.
Kita mulai dengan mengurangi n sebagai berikut.
n = 1
Jika n = 1 adalah nol, loop while
dilewati seluruhnya. Akhirnya, kode yang tersisa dieksekusi.
n> 1
Jika n - 1 adalah bukan nol, kita masukkan loop yang n = 1 dilewati. Ini bukan loop "nyata"; kode hanya dieksekusi sekali. Ini mencapai yang berikut.
n% k dihitung menggunakan algoritma modulus 42-byte dari jawaban tes keterbagian saya .
Akhirnya, kami menginterpretasikan hasil untuk menentukan keutamaan n .
sumber
{}
.1 0
merupakan dua nilai. Di sisi lain, kami akan menerima array selama bahasa menganggapnya benar atau salah dan beberapa item tumpukan adalah hal yang paling dekat dengan array Brain-Flak. Mungkin layak mengambil ini ke meta.1 0
benar. chat.stackexchange.com/transcript/message/32746241#32746241R,
3729 byteMenggunakan divisi percobaan.
scan()
membaca bilangan bulat dari STDIN dancat()
menulis ke STDOUT.Kami menghasilkan vektor panjang yang
n
terdiri dari bilangan bulat 1 ken
modulon
. Kami menguji apakah masing-masing adalah 0 dengan meniadakan (!
), yang mengembalikan nilai logis yang benar ketika angka 0 dan salah ketika lebih besar dari 0. Jumlah vektor logis adalah jumlah elemen benar, dan untuk bilangan prima kita harapkan satu-satunya moduli bukan nol menjadi 1 dann
, jadi kami berharap jumlahnya menjadi 2Disimpan 8 byte berkat flodel!
sumber
f=function(x)sum(!x%%1:x)==2
Anda dapat melakukannya dalam 28 byte.TI-BASIC, 12 byte
Cukup mudah.
randIntNoRep(
memberikan permutasi acak semua bilangan bulat dari 1 hinggaAns
.Ini sedikit membengkokkan aturan; karena daftar dalam TI-BASIC terbatas pada 999 elemen yang saya tafsirkan
sebagai makna bahwa semua tipe data dapat diasumsikan untuk mengakomodasi input. OP setuju dengan interpretasi ini.
Solusi 17 byte yang benar-benar berfungsi hingga 10 ^ 12 atau lebih:
sumber
randIntNoRep(
yang dua.PARI / GP, 21 byte
Berfungsi untuk input yang sangat besar, karena hal seperti ini dibuat untuk PARI / GP.
sumber
isprime
melakukan bukti primitif APR-CL, sehingga memperlambat sedikit karena input menjadi sangat besar.ispseudoprime(input)
melakukan tes prime kemungkinan AES BPSW, yang akan jauh lebih cepat untuk lebih dari 100 digit. Masih belum ada contoh tandingan setelah 35 tahun. Versi 2.1 dan sebelumnya Pari, dari pra-2002, menggunakan metode yang berbeda yang dapat dengan mudah memberikan hasil yang salah, tetapi tidak ada yang harus menggunakannya.TI-BASIC, 24 byte
Perhatikan bahwa program TI-Basic menggunakan sistem token, sehingga penghitungan karakter tidak mengembalikan nilai byte sebenarnya dari program.
Suara positif jawaban Thomas Kwa , itu lebih unggul.
Sampel:
Sekarang kembali
0
jika bukan bilangan prima, atau1
jika bilangan prima .sumber
Stack Cats , 62 + 4 = 66 byte
Perlu dijalankan dengan
-ln
flag-command-line (karenanya +4 bytes). Mencetak0
untuk angka komposit dan1
untuk bilangan prima.Cobalah online!
Saya pikir ini adalah program Stack Cats non-sepele pertama.
Penjelasan
Pengantar Stack Cats cepat:
-1
didorong ke tumpukan awal, dan kemudian seluruh input didorong di atas itu. Dalam hal ini, karena-n
flag, input dibaca sebagai integer desimal.-1
di bagian bawah, itu akan diabaikan. Sekali lagi, karena adanya-n
flag, nilai-nilai dari stack hanya dicetak sebagai bilangan bulat desimal yang dipisahkan oleh linefeed.<<(\-_)
menjadi(_-/)>>
. Tujuan desain ini menempatkan pembatasan yang cukup parah pada operator dan konstruksi aliran seperti apa yang ada dalam bahasa tersebut, dan fungsi apa yang dapat Anda hitung pada status memori global.Untuk melengkapi semua ini, setiap program Stack Cats harus simetris sendiri. Anda mungkin memperhatikan bahwa ini bukan kasus untuk kode sumber di atas. Inilah
-l
gunanya flag: itu secara implisit mencerminkan kode ke kiri, menggunakan karakter pertama untuk pusat. Maka program yang sebenarnya adalah:Pemrograman secara efektif dengan seluruh kode sangat non-sepele dan tidak intuitif dan belum benar-benar mengetahui bagaimana manusia dapat melakukannya. Kami telah dengan kasar memaksa program semacam itu untuk tugas-tugas yang lebih sederhana, tetapi tidak akan bisa mendekati itu dengan tangan. Untungnya, kami telah menemukan pola dasar yang memungkinkan Anda mengabaikan setengah dari program. Meskipun ini pasti suboptimal, saat ini satu-satunya cara yang dikenal untuk memprogram secara efektif di Stack Cats.
Jadi dalam jawaban ini, templat pola kata adalah ini (ada beberapa variabilitas dalam cara dijalankannya):
Ketika program dimulai, stack tape terlihat seperti ini (untuk input
4
, katakanlah):The
[
bergerak atas tumpukan ke kiri (dan kepala rekaman bersama) - kita sebut ini "mendorong". Dan<
memindahkan kepala kaset itu sendiri. Jadi setelah dua perintah pertama, kita punya situasi ini:Sekarang
(...)
adalah loop yang dapat digunakan dengan mudah sebagai kondisional: loop dimasukkan dan dibiarkan hanya ketika bagian atas tumpukan saat ini positif. Karena saat ini nol, kami melewatkan seluruh paruh pertama program. Sekarang perintah pusat adalah*
. Ini sederhanaXOR 1
, yaitu mengubah sedikit paling tidak signifikan dari bagian atas tumpukan, dan dalam hal ini mengubah0
menjadi1
:Sekarang kita menemukan gambar cermin dari
(...)
. Kali ini atas tumpukan positif dan kami melakukan memasukkan kode. Sebelum kita melihat apa yang terjadi di dalam tanda kurung, izinkan saya menjelaskan bagaimana kita akan menyelesaikannya di akhir: kita ingin memastikan bahwa pada akhir blok ini, kita memiliki tape head pada nilai positif lagi (sehingga lingkaran berakhir setelah iterasi tunggal dan digunakan hanya sebagai bersyarat linear), bahwa tumpukan ke kanan memegang output dan tumpukan kanan yang memegang-1
. Jika itu masalahnya, kita biarkan loop,>
bergerak ke nilai output dan]
mendorongnya ke-1
sehingga kita memiliki tumpukan bersih untuk output.Itu itu. Sekarang di dalam tanda kurung kita dapat melakukan apa pun yang kita inginkan untuk memeriksa keaslian selama kita memastikan bahwa kita mengatur hal-hal seperti yang dijelaskan dalam paragraf sebelumnya di akhir (yang dapat dengan mudah dilakukan dengan beberapa mendorong dan kepala pita bergerak). Saya pertama kali mencoba menyelesaikan masalah dengan teorema Wilson tetapi berakhir lebih dari 100 byte, karena perhitungan faktorial kuadrat sebenarnya cukup mahal di Stack Cats (setidaknya saya belum menemukan jalan pintas). Jadi saya pergi dengan pembagian percobaan dan ternyata memang lebih sederhana. Mari kita lihat bit linear pertama:
Anda sudah melihat dua perintah itu. Selain itu,
:
menukar dua nilai teratas dari tumpukan saat ini dan^
XORs nilai kedua menjadi nilai teratas. Ini membuat:^
pola umum untuk menduplikasi nilai pada tumpukan kosong (kami menarik nol di atas nilai dan kemudian mengubah nol menjadi0 XOR x = x
). Jadi setelah ini, bagian rekaman kami terlihat seperti ini:Algoritma pembagian percobaan yang saya terapkan tidak berfungsi untuk input
1
, jadi kita harus melewatkan kode dalam kasus itu. Kita dapat dengan mudah memetakan1
ke0
dan segala sesuatu yang lain untuk nilai-nilai positif dengan*
, jadi di sini adalah bagaimana kita melakukannya:Itulah kita berubah
1
menjadi0
, lewati sebagian besar kode jika kita memang benar0
, tetapi di dalam kita segera membatalkan*
sehingga kita mendapatkan kembali nilai input kita. Kita hanya perlu memastikan lagi bahwa kita mengakhiri nilai positif pada akhir tanda kurung agar tidak mulai berulang. Di dalam bersyarat, kita bergerak satu tumpukan yang tepat dengan>
dan kemudian mulai loop divisi sidang utama:Kawat gigi (sebagai lawan dari tanda kurung) mendefinisikan jenis loop yang berbeda: itu adalah loop do-while, yang berarti selalu dijalankan untuk setidaknya satu iterasi. Perbedaan lainnya adalah kondisi terminasi: ketika memasuki loop Stack Cat mengingat nilai teratas dari stack saat ini (
0
dalam kasus kami). Pengulangan akan berjalan hingga nilai yang sama ini terlihat lagi di akhir iterasi. Ini nyaman bagi kami: dalam setiap iterasi kami cukup menghitung sisa pembagi potensial berikutnya dan memindahkannya ke tumpukan ini kita mulai loop pada. Ketika kami menemukan pembagi, sisanya adalah0
dan loop berhenti. Kami akan mencoba pembagi mulai darin-1
dan kemudian turunkan ke1
. Itu berarti a) kita tahu ini akan berakhir ketika kita mencapai1
paling lambat dan b) kita kemudian dapat menentukan apakah angka itu prima atau tidak dengan memeriksa pembagi terakhir yang kita coba (jika itu1
, itu prima, kalau tidak, itu bukan).Mari kita mulai. Ada bagian linear pendek di awal:
Anda tahu apa yang sebagian besar hal itu lakukan sekarang. Perintah baru adalah
-
dan!
. Stack Cats tidak memiliki operator increment atau decrement. Namun ia memiliki-
(negasi, yaitu kalikan dengan-1
) dan!
(bitwise BUKAN, yaitu kalikan dengan-1
dan penurunan). Ini dapat digabungkan menjadi kenaikan!-
, atau penurunan-!
. Jadi kami mengurangi salinann
di atas-1
, lalu membuat salinan lainn
di tumpukan ke kiri, lalu mengambil pembagi uji coba baru dan meletakkannya di bawahn
. Jadi pada iterasi pertama, kita mendapatkan ini:Pada iterasi lebih lanjut,
3
akan diganti dengan pembagi tes berikutnya dan seterusnya (sedangkan dua salinann
akan selalu bernilai sama pada saat ini).Ini adalah perhitungan modulo. Karena loop berakhir pada nilai-nilai positif, idenya adalah mulai dari
-n
dan berulang kali menambahkan pembagi uji cobad
hingga kami mendapatkan nilai positif. Setelah kami melakukannya, kami kurangi hasilnyad
dan ini memberi kita sisanya. Agak rumit di sini adalah bahwa kita tidak bisa hanya meletakkan-n
di atas tumpukan dan memulai loop yang menambahkand
: jika bagian atas tumpukan negatif, loop tidak akan dimasukkan. Tersebut adalah keterbatasan bahasa pemrograman reversibel.Jadi untuk menghindari masalah ini, kita mulai dengan
n
di atas tumpukan, tetapi meniadakannya hanya pada iterasi pertama. Sekali lagi, itu terdengar lebih sederhana daripada ternyata ...Ketika bagian atas tumpukan positif (yaitu hanya pada iterasi pertama), kami meniadakannya
-
. Namun, kita tidak bisa hanya melakukannya(-)
karena kita tidak akan meninggalkan loop sampai-
diterapkan dua kali. Jadi kami memindahkan satu sel ke kiri<
karena kami tahu ada nilai positif di sana1
. Oke, jadi sekarang kita sudah bisa diandalkan meniadakann
iterasi pertama. Tetapi kami memiliki masalah baru: kepala kaset sekarang dalam posisi yang berbeda pada iterasi pertama daripada yang lainnya. Kita perlu mengkonsolidasikan ini sebelum kita melanjutkan. Selanjutnya<
memindahkan kepala kaset ke kiri. Situasi pada iterasi pertama:Dan pada iterasi kedua (ingat kita telah menambahkan
d
sekali ke-n
sekarang):Persyaratan berikutnya menggabungkan jalur ini lagi:
Pada iterasi pertama head tape menunjuk pada nol, jadi ini dilewati seluruhnya. Pada iterasi lebih lanjut, kepala kaset menunjuk pada satu, jadi kami melakukan ini, pindah ke kiri dan sel meningkat di sana. Karena kita tahu sel dimulai dari nol, sekarang akan selalu positif sehingga kita dapat meninggalkan loop. Ini memastikan kita selalu berakhir dengan dua tumpukan yang tersisa dari tumpukan utama dan sekarang dapat kembali
>>
. Kemudian pada akhir modulo loop kita lakukan-_
. Anda sudah tahu-
._
adalah untuk mengurangi apa^
yang harus XOR: jika bagian atas tumpukana
dan nilai di bawahnyab
digantia
denganb-a
. Sejak kami pertama kali dinegasikana
,-_
digantia
denganb+a
, dengan demikian menambahkand
ke total berjalan kami.Setelah nilai loop berakhir (kami telah mencapai nilai positif), rekaman itu terlihat seperti ini:
Nilai paling kiri bisa berupa angka positif. Bahkan, itu jumlah iterasi minus satu. Ada bit linear pendek lain sekarang:
Seperti yang saya katakan sebelumnya, kita perlu mengurangi hasil dari
d
untuk mendapatkan sisa aktual (3-2 = 1 = 4 % 3
), jadi kita lakukan_
sekali lagi. Selanjutnya, kita perlu membersihkan tumpukan yang telah kita tambahkan di sebelah kiri: ketika kita mencoba pembagi berikutnya, itu harus nol lagi, agar iterasi pertama berfungsi. Jadi kami pindah ke sana dan mendorong nilai positif itu ke tumpukan pembantu lain<<]
dan kemudian pindah ke tumpukan operasional kami dengan yang lain>
. Kami menarikd
dengan:
dan mendorongnya kembali ke-1
dengan]
dan kemudian kami memindahkan sisanya ke tumpukan bersyarat kami dengan<]]
. Itulah akhir dari loop pembagian percobaan: ini berlanjut sampai kita mendapatkan sisa nol, dalam hal ini tumpukan di sebelah kiri berisin
Pembagi terbesar (selainn
).Setelah loop berakhir, ada beberapa saat
*<
sebelum kita bergabung dengan input1
lagi. The*
hanya mengubah nol menjadi1
, yang kita perlukan sedikit, dan kemudian kami pindah ke pembagi dengan<
(sehingga kita berada di tumpukan yang sama seperti untuk input1
).Pada titik ini membantu untuk membandingkan tiga jenis input yang berbeda. Pertama, kasus khusus di
n = 1
mana kami belum melakukan hal-hal pembagian sidang itu:Kemudian, contoh kita sebelumnya
n = 4
, angka gabungan:Dan akhirnya,,
n = 3
bilangan prima:Jadi untuk bilangan prima, kita memiliki
1
pada tumpukan ini, dan untuk bilangan komposit kita memiliki0
bilangan positif atau lebih besar dari2
. Kami mengubah situasi ini menjadi0
atau1
kita perlu dengan potongan kode berikut:]
hanya mendorong nilai ini ke kanan. Kemudian*
digunakan untuk menyederhanakan situasi kondisional: dengan mengubah bit paling tidak signifikan, kita mengubah1
(prime) menjadi0
,0
(komposit) menjadi nilai positif1
, dan semua nilai positif lainnya masih akan tetap positif. Sekarang kita hanya perlu membedakan0
dan positif. Di situlah kita menggunakan yang lain(:)
. Jika bagian atas tumpukan adalah0
(dan inputnya adalah yang utama), ini hanya dilewati. Tetapi jika bagian atas tumpukan positif (dan inputnya adalah angka komposit) ini menukar dengan1
, sehingga kita sekarang memiliki0
untuk komposit dan1
untuk bilangan prima - hanya dua nilai yang berbeda. Tentu saja, itu kebalikan dari apa yang ingin kita hasilkan, tetapi itu mudah diperbaiki dengan yang lain*
.Sekarang yang tersisa adalah mengembalikan pola tumpukan yang diharapkan oleh kerangka kerja kita di sekitarnya: selotip pada nilai positif, hasil di atas tumpukan di sebelah kanan, dan satu
-1
di tumpukan di sebelah kanan itu . Ini untuk apa=<*
.=
menukar bagian atas dua tumpukan yang berdekatan, dengan demikian memindahkan-1
ke kanan hasil, misalnya untuk input4
lagi:Kemudian kita hanya bergerak ke kiri
<
dan mengubah nol itu menjadi satu dengan*
. Dan itu saja.Jika Anda ingin menggali lebih dalam tentang cara kerja program, Anda dapat menggunakan opsi debug. Tambahkan
-d
bendera dan sisipkan ke"
mana pun Anda ingin melihat status memori saat ini, misalnya seperti ini , atau gunakan-D
bendera untuk mendapatkan jejak lengkap dari seluruh program . Atau, Anda dapat menggunakan EsotericIDE Timwi yang mencakup juru bahasa Stack Cats dengan debugger langkah-demi-langkah.sumber
>:^]
harus menjadi logo resmi Stack CatsHaskell, 54 byte
Tidak banyak yang bisa dijelaskan.
sumber
main=do n<-readLn;print$n>1&&mod(product[1..n-1]+1)n<1
main=do n<-readLn;print$mod(product[1..n-1]^2)n>0
adalah 49 byte.Ruby, 15 + 8 = 23 byte
Contoh dijalankan:
sumber
JavaScript,
3936 byteDisimpan 3 byte berkat produk ETH:
Menampilkan true untuk prime, false sebaliknya.
The untuk lingkaran tes setiap nomor i dari n-1 sampai i adalah pembagi. Jika pembagi pertama yang ditemukan adalah 1 maka itu adalah bilangan prima.
Solusi sebelumnya (39 byte):
Bagaimana dibiarkan tes yang tidak dibutuhkan:
Saya hanya memposting solusi 39 byte karena jawaban JavaScript terbaik sudah 40 byte.
sumber
&&i
tidak benar-benar melakukan apa-apa dalam program ini, sehingga Anda dapat menghapusnya.n>1
kondisi akhir, jika Anda tidak ingin1
menjadi prima.1
for loop akan melakukann%--i
sekali:1%0
mengembalikanNaN
dan menghentikan loop. Kapanalert
dipanggili
sudah sama dengan0
begitu1==i
pengembalianfalse
.Siput, 122
Masukan harus diberikan secara unary. Digit dapat berupa campuran karakter apa pun kecuali baris baru.
Dalam bahasa pencocokan pola 2D ini, status program hanya terdiri dari lokasi kisi saat ini, set sel yang telah dicocokkan, dan posisi dalam kode pola. Juga ilegal bepergian ke alun-alun yang cocok. Ini rumit, tetapi mungkin untuk menyimpan dan mengambil informasi. Pembatasan terhadap perjalanan ke sel yang cocok dapat diatasi dengan mundur, teleportasi (
t
) dan pernyataan (=
,!
) yang membuat grid tidak dimodifikasi setelah selesai.Faktorisasi untuk bilangan komposit ganjil dimulai dengan menandai beberapa set sel yang saling tidak bersebelahan (berwarna biru dalam diagram). Kemudian, dari setiap sel kuning, program memverifikasi bahwa ada jumlah yang sama dari sel-sel non-biru di kedua sisi biru yang berdekatan dengan bolak-balik antara dua sisi. Diagram menunjukkan pola ini untuk salah satu dari empat sel kuning yang harus diperiksa.
Kode beranotasi:
sumber
C, 67 byte
Mencetak
!1
(nilai falsey, menurut definisi Peter Taylor )0
jika(n-1)!^2 == 0 (mod n)
, dan1
sebaliknya.EDIT : Setelah beberapa diskusi dalam obrolan,
puts("!1"+p%n)
tampaknya dianggap sedikit curang, jadi saya menggantinya Hasilnya satu byte lebih panjang.SUNTING : Tetap untuk input besar.
Solusi yang lebih pendek
56 byte : Seperti yang direkomendasikan dalam komentar oleh pawel.boczarski, saya dapat mengambil input di unary dengan membaca sejumlah argumen baris perintah:
memanggil program seperti
51 bytes : Jika Anda mengizinkan "output" dengan menggunakan kode pengembalian:
sumber
puts("!1"+p%n)
Bagaimana Anda bisa melakukana+b
untukchar*
nilai?"!1"
dimulai pada alamata
, maka padaa+1
Anda akan menemukan string"1"
.strcat(const char*,const char*)
.)p=p*i*i%n
kep*=i*i%n
Python 3, 59 byte
Sekarang gunakan
input()
alih-alih argumen baris perintah. Terima kasih kepada @Beta Decaysumber
input()
akan jauh lebih pendekn=m=int(input())
,print(all(n%m for m in range(2,n)))
n%i<1
sebagai gantinya.APL,
4013 byteDivisi percobaan dengan algoritma yang sama seperti jawaban R saya . Kami menetapkan
x
input dari STDIN (⎕
) dan mendapatkan sisanya untukx
dibagi oleh setiap integer dari 1 hinggax
. Setiap sisa dibandingkan dengan 0, yang memberi kita vektor satu dan nol yang menunjukkan bilangan bulat manax
. Ini dijumlahkan menggunakan+/
untuk mendapatkan jumlah pembagi. Jika angka ini tepat 2, ini berarti satu-satunya pembagi adalah 1 danx
, dan karenanyax
prima.sumber
Python 2, 44
Seperti jawaban Python Sp3000 , tetapi menghindari menyimpan input dengan menghitung variabel
n
naik dari1
ke nilai input.sumber
Metaprogramming template C ++.
166131119 byte.Kode mengkompilasi jika konstanta adalah prima, dan tidak mengkompilasi jika komposit atau 1.
(semua baris baru, kecuali yang terakhir, dihilangkan dalam versi "asli").
Saya pikir "kegagalan untuk mengkompilasi" adalah nilai pengembalian falsey untuk bahasa pemrograman. Perhatikan bahwa itu tidak menautkan (jadi jika Anda memberinya prime, Anda akan mendapatkan kesalahan penautan) sebagai program C ++ lengkap.
Nilai untuk menguji adalah bilangan bulat pada "baris" terakhir.
contoh hidup .
sumber