CJam, ( 58 56 54 48 46 x 2) *% 48 = 44.16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
hangi yazdırır
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
Her satırdaki boşluk olmayan karakterler iki karşılıklı kuyruk arasında aynı kalır.
Ama şimdi gerçekten tatlı kısım:
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
bir sırtı var! :)
Burada test et.
Nasıl çalışır
Genel olarak CJam'da sorgulamanın temellerini açıkladığı gibi, ilk önce diğer gönderim hakkındaki açıklamayı okumanızı tavsiye ederim.
Bu biraz daha zor. Karşılıklı quine için, diğer durumda olduğu gibi, her satırdan önce veya sonra boşluk ekleyerek ve 2 ile 0 değiştirerek bloğun dize gösterimini değiştiririm, böylece ortaya çıkan program boşlukları zıt uca koyar.
Boşlukların karşılıklı kuyrukları hiç etkilemediğini unutmayın. İlki, gerçekten kullanılmayan bir blokta, ikincisi ise tüm kodun etrafında.
Her ikisini de birleştirirken düzenli bir kın elde etmek için, tüm bu değişiklikleri yapmaktan kaçınmanın bir yolunu bulmamız gerekir. Boşluk ve kodun yapısının her ikisini birleştirerek bir quinin tamamını diğerine eklediğimiz anlamına geldiğine dikkat edin. Bu yüzden, tüm modifikasyon kodunu bir bloğa koyarsak, o bloğu gerçek içeriğine bağlı olarak çalıştırabiliriz.
Şimdi bu bloku aldım ... karşılıklı sorgulamalar için, sadece gerçekten çalıştırmak istediğim kodu içeriyor. Kombine quine için, aynı zamanda tüm quine'i de içerir, rastgele bir pozisyonda, hiçbir anlamı yoktur ... ama bir blok olduğundan, otomatik olarak çalışmaz. Böylece dizenin o bloğun içeriğine göre değiştirilip değiştirilmeyeceğini belirleyebiliriz. Bunun _`'"#)!
için var. Bloğu çoğaltır, dizgeye dönüştürür, karakter arar "
(karşılıklı sorgularda, yalnızca bloğun dışında görünür ) - -1
karakter bulunmazsa arama döner ve aksi takdirde pozitif bir tamsayı - sonucu artırır ve mantıksal olarak olumsuzlar. Yani eğer bir a "
bulundu ise bu verim 0
aksi takdirde verim 1
. Şimdi sadece yapıyoruz*
, eğer sonuç 1 değilse ve hiç değilse bloğu bir kez çalıştırır.
Son olarak, değişiklik kodu şu şekilde çalışır:
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
Ödül talep etmek, (12 x 10) *% 48 = 57,6
Bazı değişikliklerle bu kodun daha fazla satıra kolayca bölünebileceği anlaşılıyor. 48'i üst üste almak için 2 karakter ekliyoruz, bu sayede 8'e bölebiliyoruz, böylece 6 karakterlik kodlu ve 6 boşluklu 8 satır var. Bunu yapmak için birkaç rakamı değiştirmemiz ve bir veya iki operatörü yeniden düzenlememiz gerekir, bu yüzden her iki satıra da bölünmezler. Bu bize 12 x 8 boyutunda ... çalışma şartı veriyor . Yani sadece hiçbir şey yapmayan iki satır ekleriz (1'e bas, 1'e bas, 1'e bas, 1'e bas ...), 12 x 10'a :
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
Bir öncekinin ürettiği gibi
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(Yan not: ara satırlarda sağa ve sola dönüşümlü olarak kalmaya gerek yoktur, sadece ilk ve son satırın konumu önemlidir. Sol ve sağ diğer tüm satırlar için keyfi olarak seçilebilir.)
Ve saf tesadüf sayesinde, tam bir de hala çalışır:
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(Tesadüf derim, çünkü iç kodun uygulanmamasına özen gösteren kısım şimdi diğer quine ile garip bir şekilde serpiştirildi, ancak yine de iyi sonuç veriyor.)
Olduğu gibi 1;
, lütuf ihtiyacını yerine getirmek için orijinal sunumuma 44 satır ekleyebilirdim, ama 12 x 10
çok daha düzgün görünüyor. ;)
Düzenleme: Haha, "saf tesadüf" dediğimde daha fazla yer alamazdım. Son sıranın gerçekten nasıl çalıştığını araştırdım ve kesinlikle saçma. Üç iç içe blok (4 aslında, ancak en içteki önemsiz) vardır. Bu 3 bloğun en iç kısımlarının tek önemli kısmı, içerdiği "
(orijinal gönderimde yaptıkları değil '"
, sonunda aynı olanı kontrol etmek için kullanılanlar) içermesidir . Yani, sıranın temel yapısı:
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
Bunu parçalayalım:
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
Yani bu gerçekten komik bir sihir yapar, ama iç blok yığında tek bir dize bıraktığı için, )!*
bunu boş bir dize dönüştürür. Tek koşul, iç bloktaki öğelerin +
yığında başka bir şey yapmamasıdır, o yüzden şuna bakalım:
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";