Haskell , 306 + 624 = 930 bayt
Program 1: yapay bir argüman alarak ve bir dize döndüren anonim bir işlev.
(\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))"
Çevrimiçi deneyin!
Program 2: q[[40,...]]
sonunda kukla bir argüman alarak ve bir dize döndüren adsız bir işlevdir.
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]]
Çevrimiçi deneyin!
Karakter kümesi 1 (boşluk içerir):
"$()-:>E\`abcdefhilmnoprstuw×ÝáâäæéêñòóöđēĕħĮİĴ
Karakter seti 2 (yeni satır dahil):
!'+,.0123456789<=@[]_qxz~
Yalnızca set 1 ASCII olmayan karakterler içerdiğinden, UTF-8 baytları da ayrılır.
Nasıl çalışır
Program 1 genellikle lambda ifadeleri, boşluklar ve parantezler, yerleşik alfanümerik fonksiyonların serbest kullanımı ve sonunda string değişmezleri olarak quine verileriyle yazılır.
- Program 1'in kendi çekirdek kodu, basitçe alıntı işaretleriyle çevrelenerek string değişmez verilerine dönüştürülür.
- Bunu desteklemek için, her ters eğik çizgiyi
a
ya da takip eder b
, ki bu, içinden geçen geçerli kaçış dizileri oluşturur show
.
- Başka bir küçük fayda
a
, b
ve c
ASCII kodları 100'den küçük olan tek küçük harflerdir, program 2 tarafından kullanılan sayısal kodlamada bir rakamı kaydeder.
- Program 2'nin çekirdek kodunun dizgesel kodlaması, ASCII olmayan Unicode kullanılarak daha karışıktır: Her karakter, orijinal karakterlerle çakışmadığından emin olmak için kod noktasına 182 eklenir.
- 182 128 idi, ta ki, 182'nin kod çözmeyi kısaltmak için program 1'in kodu için iki kat uzunluğunun iki katı olduğu gerçeğini kötüye kullanabilirim. (Bonus olarak, program 2 yeni satırları kullanabilir.)
Program 2, genellikle üst seviye fonksiyon denklemleriyle (son isimsiz olanlar hariç), karakter değişmezleri ve ondalık sayılar, liste / aralık sözdizimi ve işleçleri ve Int
sonunda s listelerinin listesi olarak veri verileriyle yazılır .
- Program 1'in ana kodu, son bir çift alıntı ile kod noktalarının bir listesi olarak kodlanır.
- Program 2'nin ana kodu, program 1'de kullanılan string değişmezinin kod noktalarının listesi olarak kodlanmıştır, yine de 182'ye kadar kaydırılmıştır.
İlerleyiş, program 1
b
ve c
sırasıyla lambda ifadesine son argümanlar olarak verilen, sırasıyla program 2 ve 1 için dize değişmezlerinin değerleridir. ()
sadece PPCG'nin, programın bir fonksiyon tanımlaması gerektiği kuralını yerine getirmek için kukla bir argümandır.
foldr(\a->map pred)b(show()>>c)
, uzunluğuna eşit bir sayıya b
uygulayarak dizgiyi programın ana koduna dönüştürür , veya .map pred
show()>>c == c++c
182
tail(show c)
dizeyi c
son bir çift alıntı eklenmiş olarak programın 1 temel koduna dönüştürür .
:pure b
Bunu bir listede dizeyle birleştirir b
.
map(map fromEnum)$
dizeleri kod noktalarının listesine dönüştürür.
`mappend`show(...)
Elde edilen listelerin listesini seri hale getirir ve nihayetinde programın 2 temel koduna ekler.
İlerleme, program 2
- Üst seviye
z~z=[[['@','0'..]!!4..]!!z]
, kod noktalarını tekrar karakterlere dönüştüren bir işlevdir (içindeki tüm karakterler toEnum
mevcut olmadığından yazmak için gereklidir .)
- Kod noktası argümanı da denir
z
. Tembellik belirteci ~
bu pozisyonda bir etkiye sahip değildir, ancak boşluk karakterinden kaçınır.
['@','0'..]
ASCII kod 64'te başlayan, ardından her adımda 16 aşağı atlayan geriye doğru bir adım listesi aralığıdır.
- Buna uygulamak
!!4
bir \NUL
karakter verir .
- Bir
[ ..]
aralıktaki sarma, !!z
dizin oluşturan tüm karakterlerin bir listesini verir .
- Karakter sonunda tekil bir listeye sarılır. Bu , kullanılamayan ve yerine işlevini
z
kullanarak listelerde eşlemeyi sağlar .=<<
map
<$>
- Üst seviye
q[x,q]_=z=<<x++q++[34,34]++x
, quine veri listesinden program 1'i yapan bir fonksiyondur.
x
program 1'in çekirdeği için veriler (son bir çifte alıntı dahil) ve iç q
kısmı program 2'nin çekirdeği için gizlenmiş verilerdir, _
yalnızca son adsız işlevi yalnızca bir dize yerine bir işlev yapmak için başka bir kukla argümandır.
x++q++[34,34]++x
ASCII kod 34 ile iki çift alıntı işareti dahil parçaları birleştirir.
z=<<
Program 1'i z
kod noktalarından karakterlere dönüştürmek için birleştirme üzerinde eşleyerek oluşturur .
- Final
q[[40,...]]
, q
quine verileriyle birleştirilen adsız bir işlevdir .