Mutasyonla sertleştirilmiş kine


15

Göreviniz kendi kaynağını basan bir program yapmaktır.

"Hey, zaten bu zorluğa sahibiz ve tonlarca varyasyon! Neden başka bir sorun çıkarıyorsun?" sorabilirsiniz, ama bu en zor olanlardan biri olacak (umarım, yine de).

Ayranınız "mutasyonla sertleştirilmiş" olmalıdır, yani karakterlerden herhangi biri yerinde çoğaltılmış olsa bile, ayraç orijinal programın kaynak kodunu çıkarmalıdır.

Örneğin, bir sorgunuz varsa (aşağıdaki örnek herhangi bir dilde yazılmamıştır, sadece sözde koddur):

abcd

Bu programların tümü çıktı almalıdır abcd:

aabcd
abbcd
abccd
abcdd

(Bu programların her birinde, a, b, cve dher yinelenen karakter orijinal karakterden sonra doğrudan yerleştirildi anlamına gelen yerinde çoğaltılır.)

Kurallar:

  • Standart quine kuralları geçerlidir.
  • Çok baytlık bir karakter bir karakter olarak sayılır ve karakter çoğaltıldığında ilgili baytlara "bölünmez".

Bu , bayt en kısa kod kazanır!


Bu önemli mi? 0ve 00CJam'de her iki çıktı 0.
geokavel

Hayır, 0uygun bir soru değil.
Dennis


Kod mutasyonu problemi genel olarak çözülebilir mi? mutasyon tırnak içine alınan bir dize içindeki bir karaktere gelmezse, genellikle programı bozar.
hasen

Başlık biraz yanıltıcı değil mi? "Mutasyon" bir karakteri tekrar etmeyi değil tekrar etmeyi önerir
Luis Mendo

Yanıtlar:


18

> <> , 56 bayt

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

Çevrimiçi deneyin! veya tüm mutasyonları doğrulayın .

Orijinal program nasıl çalışır (modası geçmiş)

Yorumlayıcı hücre (0, 0) içinde başlar . ^yönü yukarı doğru ayarlar , böylece yönerge işaretçisi (IP) hücreye (0, 20) sarılır .

'dize modunu etkinleştirir: bir sonraki 'ile karşılaşılıncaya kadar IP altındaki tüm karakterler yığına itilir. Aynı 'şey etrafa sarıldıktan sonra tekrar bulunur, bu yüzden

d3*}^^:84*=?~oao0f.^

IP hala (0, 19) 'a iniyor ve hala yukarı doğru gidiyor. Yürütülmesi d3*}iter 13 = 0xd sonra, 3 , çarpma, her iki değer ( 39 / tek tırnak ), daha sonra sağa doğru yığın döner. Bu yığını aşağıdaki gibi bırakır.

'd3*}^^:84*=?~oao0f.^

Sonraki iki talimat ( ^) bu noktada hiçbir şey yapmaz.

:84*=yığının üstünü çoğaltır, 8 ve 4'ü iter , çoğaltır ( 32 / boşluk ), sonra çoğaltılan karakteri boşlukla eşitlik açısından test eder . Değiştirilmemiş program için, bu her zaman 0 değerini itecektir .

?yığının üstü hatalıysa bir sonraki talimatı atlar. Orijinal program için, her zaman ~, her zaman atlanır.

oaoyığının üstünü çıkar ve yazdırır, 10 / satır beslemeyi iter , ardından çıkar ve satır beslemeyi yazdırır .

Son olarak , yığındaki bir sonraki karakterle başlayarak 0f.hücreye (0, 15) (en alttaki ^) atlar .

Yığın boş olduğunda, tüm kaynak kodu yazdırılır. :başarısız olur ve program çıkar.

Değişen programlar nasıl çalışır (modası geçmiş)

Satır besleme olmayan karakterlerin çoğaltılması, programı yalnızca yatay olarak genişletir. Program dikey olarak yürütüldüğünden, bu ek talimatlar hiçbir zaman yürütülmez.

Bottomost önce satır besleme Kopyalama ^hücreleri kayacak (0, 14) ve (0, 15) için (0, 15) ve (0, 16) . 0f.şimdi en alttan önce hücreye atlayacaktır ^, ki bu da a'dır , bu ^nedenle program vardiyadan etkilenmez.

Son olarak, yinelenen satır besleme karakterleri de dizeyi değiştirir. Kısa çizgiler boşluklarla doldurulur, böylece hat beslemesi konumuna 32 / boşluk eklenir. boşluk için 1'i84*= iter , bu nedenle sonraki talimatı atlamaz. Bu durumda,?~ çıkar ve atar uzay yüzden şu oyukarıdaki karakterini yazdırır boşluk yerine.


Herhangi bir yeni satırı çoğaltabilirsiniz ve yine de çalışır.
Dennis

3
Oh,
gönderiyi


@ jimmy23013 Düzeltilmelidir.
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.