Haskell , 306 + 624 = 930 byte
Program 1: Fungsi anonim mengambil argumen dummy dan mengembalikan string.
(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"İĴİóđđđÝöÝâÝæÝääē××êääē××İēÀħđĮâħēĕóİóòòĮááħááđéêâéêēááĮÀħ""(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"
Cobalah online!
Program 2: q[[40,...]]
pada akhirnya adalah fungsi anonim mengambil argumen dummy dan mengembalikan string.
z~z=[[['@','0'..]!!4..]!!z]
q[x,q]_=z=<<x++q++[34,34]++x
q[[40,92,98,32,99,40,41,45,62,102,111,108,100,114,40,92,97,45,62,109,97,112,32,112,114,101,100,41,98,40,115,104,111,119,40,41,62,62,99,41,96,109,97,112,112,101,110,100,96,115,104,111,119,40,109,97,112,40,109,97,112,32,102,114,111,109,69,110,117,109,41,36,116,97,105,108,40,115,104,111,119,32,99,41,58,112,117,114,101,32,98,41,41,34],[304,308,304,243,273,273,273,221,246,221,226,221,230,221,228,228,275,215,215,234,228,228,275,215,215,304,275,192,295,273,302,226,295,275,277,243,304,243,242,242,302,225,225,295,225,225,273,233,234,226,233,234,275,225,225,302,192,295]]
Cobalah online!
Set karakter 1 (termasuk spasi):
"$()-:>E\`abcdefhilmnoprstuw×ÝáâäæéêñòóöđēĕħĮİĴ
Kumpulan karakter 2 (termasuk baris baru):
!'+,.0123456789<=@[]_qxz~
Karena hanya set 1 berisi karakter non-ASCII, byte UTF-8 mereka juga terpisah.
Bagaimana itu bekerja
Program 1 umumnya ditulis dengan ekspresi lambda, spasi dan tanda kurung, penggunaan bebas fungsi alfanumerik bawaan, dan dengan data quine sebagai string literal pada akhirnya.
- Kode inti Program 1 sendiri diubah menjadi data literal string hanya dengan mengelilinginya dengan tanda kutip.
- Untuk mendukung hal ini, setiap backslash diikuti oleh
a
atau b
, yang membentuk urutan pelarian yang valid yang melakukan perjalanan pulang pergi show
.
- Manfaat kecil lainnya adalah
a
, b
dan c
merupakan satu-satunya huruf kecil yang kode ASCIInya kurang dari 100, menghemat satu digit dalam pengkodean numerik yang digunakan oleh program 2.
- Pengkodean string string kode inti program 2 lebih dikaburkan dengan menggunakan Unicode non-ASCII: Setiap karakter ditambahkan 182 ke titik kode untuk memastikan tidak ada tumpang tindih dengan karakter asli.
- 182 dulu 128, sampai saya menyadari saya bisa menyalahgunakan fakta bahwa 182 adalah dua kali panjang string literal untuk kode program 1 untuk mempersingkat decoding. (Sebagai bonus, program 2 dapat menggunakan baris baru.)
Program 2 umumnya ditulis dengan persamaan fungsi tingkat atas (kecuali untuk yang anonim akhir), karakter literal dan angka desimal, sintaksis daftar / rentang dan operator, dan dengan data quine sebagai daftar daftar Int
s pada akhirnya.
- Kode inti Program 1 dikodekan sebagai daftar poin kode, dengan kutipan ganda akhir.
- Kode inti Program 2 dikodekan sebagai daftar titik kode dari string literal yang digunakan dalam program 1, masih bergeser ke atas oleh 182.
Panduan, program 1
b
dan c
adalah nilai-nilai string literal untuk program 2 dan 1, masing-masing, diberikan sebagai argumen akhir untuk ekspresi lambda. ()
adalah argumen dummy semata-mata untuk memenuhi aturan PPCG bahwa program harus mendefinisikan suatu fungsi.
foldr(\a->map pred)b(show()>>c)
mendekode string b
ke kode inti program 2 dengan menerapkannya map pred
beberapa kali sama dengan panjang show()>>c == c++c
, atau 182
.
tail(show c)
mengkonversi string c
ke kode inti program 1, dengan kutipan ganda akhir ditambahkan.
:pure b
menggabungkan ini dalam daftar dengan string b
.
map(map fromEnum)$
mengkonversi string ke daftar poin kode.
`mappend`show(...)
membuat serial daftar yang dihasilkan dari daftar dan akhirnya menambahkannya ke kode inti program 2.
Panduan, program 2
- Tingkat tertinggi
z~z=[[['@','0'..]!!4..]!!z]
adalah fungsi yang mengubah kode kembali ke karakter (diperlukan untuk menulis karena tidak semua karakter toEnum
tersedia).
- Argumen titik kode juga disebut
z
. Penanda kemalasan ~
tidak memiliki efek pada posisi ini tetapi menghindari karakter spasi.
['@','0'..]
adalah rentang daftar loncatan mundur mulai dari kode ASCII 64, kemudian melompat 16 ke bawah setiap langkah.
- Menerapkan
!!4
ini memberi \NUL
karakter.
- Membungkusnya dalam
[ ..]
rentang memberikan daftar semua karakter, yang !!z
diindeks.
- Karakter akhirnya dibungkus dalam daftar tunggal. Ini memungkinkan pemetaan fungsi
z
menggunakan daftar =<<
alih-alih yang tidak tersedia map
dan <$>
.
- Tingkat teratas
q[x,q]_=z=<<x++q++[34,34]++x
adalah fungsi membangun program 1 dari daftar data quine.
x
adalah data untuk inti dari program 1 (termasuk penawaran ganda akhir) dan bagian dalam q
adalah data yang dikaburkan untuk inti dari program 2. _
adalah argumen dummy lain semata-mata untuk membuat fungsi anonim akhir menjadi fungsi alih-alih hanya string.
x++q++[34,34]++x
menyatukan potongan-potongan, termasuk dua tanda kutip ganda dengan kode ASCII 34.
z=<<
membangun program 1 dengan memetakan z
rangkaian untuk mengkonversi dari titik kode ke karakter.
- Final
q[[40,...]]
adalah fungsi anonim yang dikombinasikan q
dengan data quine.