Temukan Lubang 1 di sini .
Buatlah quine yang, ketika dijalankan, mengeluarkan blok kode sumbernya sendiri beberapa kali. Bahkan, ia harus menampilkannya n kali, di mana n di bilangan prima berikutnya.
Saya pikir sebuah contoh menunjukkan yang terbaik.
[MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
Setiap Program akan menampilkan basis "blok" (jadi [MY QUINE]) kali prime number berikutnya .
Fungsi bawaan untuk menghitung apakah suatu bilangan prima, (seperti fungsi isPrime), atau untuk menentukan bilangan prima berikutnya (seperti fungsi nextPrime ()) tidak diperbolehkan.
- Ini berarti bahwa fungsi untuk mendaftar jumlah pembagi tidak diperbolehkan
- Fungsi yang mengembalikan faktorisasi utama juga tidak diizinkan
Ini harus quine yang benar (kecuali untuk beberapa kelonggaran, lihat poin berikutnya), jadi Anda tidak harus membaca kode sumber Anda sendiri.
Karena bahasa seperti Java dan C # sudah dirugikan, Anda tidak perlu menampilkan kode yang benar-benar berfungsi. Jika itu bisa dimasukkan ke dalam suatu fungsi (yang disebut) dan menampilkan quine berikutnya, Anda baik.
Ini kode-golf, jadi kode terpendek menang!
Jawaban:
CJam, 31 byte
Cobalah online di penerjemah CJam .
Ide
Untuk memeriksa primality, kita akan menggunakan teorema Wilson , yang menyatakan bahwa bilangan bulat n> 1 adalah bilangan prima jika dan hanya jika (n - 1)! ≡ -1 (mod n) , yang benar jika dan hanya jika (n - 1)! + 1% n == 0 .
Kode
sumber
mp
(is prime?) ada sekarang, jadi dalam versi terbaru CJam, orang bisa bermain golf ini sedikit lebih.CJam,
3635 byteIni
pastibisa bermain golf lebih lanjut.Bagaimana itu bekerja:
Terima kasih kepada Martin karena mengingatkan saya pada
]W=
triknya :)Cobalah online di sini
sumber
Mathematica,
248222 byteSunting: Memperbaiki penggunaan fungsi terkait prima, tetapi juga meningkatkan quining sedikit.
Sunting: Terima kasih kepada Dennis karena memperkenalkan saya pada teorema Wilson.
Ini mengasumsikan bahwa kernel keluar antara menjalankan quine berikutnya (atau setidaknya
n
reset), karena bergantung padan
yang tidak terdefinisi sebelum instance pertama[MyQuine]
dijalankan.Ini mungkin bisa dipersingkat banyak, tapi saya tidak punya banyak pengalaman dengan quines, terutama di Mathematica.
Berikut ini penjelasannya:
Ini tidak melakukan apa-apa, tetapi jika digabungkan ke akhir quine sebelumnya, ini mengalikan hasil dari ekspresi terakhir dengan
1
(yang merupakan no-op) dan tanda titik koma menekan output. Ini memastikan bahwa hanya salinan[MyQuine]
cetakan yang terakhir .Ini Menginisialisasi
n
ke1
dalam salinan pertama[MyQuine]
dan kemudian menambahkan dengan1
di setiap salinan lanjut - yaitu ini hanya menghitung berapa banyak salinan ada din
.Lewati terus hingga akhir sekarang:
Ini menemukan prime berikutnya menggunakan teorema Wilson .
Inilah quine yang sebenarnya. Itu membuat
NextPrime@n
salinan kode itu sendiri. Ini juga agak aneh. Ya, saya mengalikan dua string di sana, dan tidak ada yang tidak memiliki hasil yang berarti.QUINE_PREFIX
berisi semua kode sebelum dua string danQUINE_SUFFIX
berisi semua kode setelah dua string. Sekarang biasanya Anda menggunakanApply
(atau@@
) untuk mengubah daftar menjadi serangkaian argumen. Tetapi Anda bisa mengganti apa sajaHead
denganApply
- mis. Perkalian. Jadi, meskipun ini merupakan produk, saya masih bisa mengubahnya menjadi dua argumen untuk fungsi saya. Fungsi itu tidak:Di mana
#
argumen pertama (string awalan),#2
adalah argumen kedua (string suffix),##
adalah urutan dari kedua argumen. Saya perlu menambahkan1
untuk menjaga perkalian - jika tidak##
akan percikan ke daftar argumen untukToString
. Bagaimanapun,ToString[1##,InputForm]&@@("abc"*"def")
kembali"abc"*"def"
... hanya apa yang saya butuhkan!Saya pikir dengan semua hal yang saya butuhkan di sekitar quine,
eval
quine berbasis akan lebih tepat di sini. Saya akan memeriksanya nanti atau besok.sumber
J - 60 char
Gunakan metode prima berikutnya seperti jawaban lainnya. (Itu
4 p:
sedikit.)Trik J kecil yang lucu adalah yang
f :g
bertindak sepertif
ketika diberi satu argumen dang
ketika diberi dua. Jadi, jika Anda menulis, katakanf :;'a'f :;'a'f :;'a'
itu bertingkah sepertif'a';'a';'a'
, yang bagus karena itu adalah daftar kotak yang itemnya'a'
dan panjangnya adalah jumlah kemunculannya.Jadi kita bisa mengangkatnya menjadi semacam quiney. The
f
kita gunakan terlihat seperti(foo $~ bar)
, di manafoo
konstruksi bagian string yang kita ulangi berulang,bar
menemukan bilangan prima berikutnya dan mengalikan dengan 60, panjang string difoo
.sumber
Python 2.7, 214
sumber