Otomatik cycler quine


11

Bir quine yapın ama bir bükülme ile.

Beyan

Quine kodunu yazdırır, ancak ilk karakterini sonuna koyar.
(Bunu tersine yapabilirsiniz ancak bu notu cevabınıza ekleyebilirsiniz)
Çıktı, aynı zamanda bir çözüm olan bir program olmalıdır.

Örnek: Kodunuzun foobarçalıştığını varsayalım , çalıştırıldığında oobarfgeçerli başka bir program olacak.

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

kurallar

  • Kodunuz , bir başkasının kodunun oldukça çalınan bazı nesil çıktıları olmamalıdır
  • Kodunuz 2 karakterden uzun olmalıdır (bu nedenle kısa kod eğlenceli değildir)
  • Kodunuz en az iki farklı karakter içermelidir (ör: +++geçerli değil)

puanlama

Bir meydan okuma olarak en kısa kod kazanır.



3
@DomHastings Bunu yayınlamak için aylarınız var.
mbomb007

2
@ IQuick143 Sanırım> 2 karakter, belirttiğiniz neden için iyi bir gerekliliktir
dylnan

5
Misiniz bu bir 'dönen Quine' olarak sayım? ; p
Kevin Cruijssen

3
@ mbomb007 Bunun mümkün olduğu bir dil bulmak zorluğun bir parçası
IQuick 143

Yanıtlar:


19

Befunge-98 (PyFunge) , 2600 bayt

ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Çevrimiçi deneyin!

Bu bir cehennem festivali oldu.

Bu nasıl çalışır:
Program, etrafındaki bir Program B'yi birleştiren ve daha sonra kaynak baytının yarısını iki kez kaydırılan bir grup put ifadesidir.
Program aslında 1300 baytlık bir programın 2 kopyasıdır, bu nedenle tüm 1300 baytlık programın her zaman bir bütün olarak çalıştırılması sağlanır.

Daha iyi açıklama:
Her Befunge-98 quine sembolleri böyle a içermesi gerekir @ya qve ,
Sorun : bu sembollerin hiçbiri beri especialy başlangıç noktası iyi olan @ve qanında programı sonlandırmak.
Çözüm : Kaynak koddaki bu karakterlerden kurtulun

Sorun : Nasıl?
Çözüm : Kullanımı p(put) kaynak kodu içeren yazdırmak tek bir bayt kaymıştır ve edecektir gerekli karakterleri içerecek şekilde kaynak kodunu değiştirmek için komutları değil kullanmak ghile komutu.

Sorun : (bunlar ne zaman sona erecek)
Bir put komutu n x ykarakteri, x-koordinatını, y-koordinatını belirleyen 3 değer çıkar , ancak bu değerlerin başlatılması yarıya bölündüğünde, başlangıç ​​kaynak kodunda kötü karakterler yazabilir. quining için.
Çözüm : (son söz veriyorum)
Kaynak kodun 2 kopyasını kullanın, sonuncusu "doğru olanı", bu yanlışlıkla başka bir sorunu giderir, bu da ikiye bölünen bir put ifadesinin (p komutu + sabit başlatıcılar) yürütülmezse, bu, her ifadenin 2 kopyasına sahip olarak düzeltildi. Bunun çalışması için gereken son şey, kaynak kodun tamamını nasıl yarıya indirebiliriz?

Cevap :
Bir görüntü 1000 kelimeye bedeldir.  Sonra Piet'i yaptılar.

Bu, bir dize baytının iki kopyasının neden kaydırıldığının görsel kanıtıdır == Bir bayt kaydırılan dizenin iki kopyası. Bu, kodun yarısını alabilir, bayt kaydırıp sonra iki kez yazdırabiliriz (VEYA kodun yarısını alır, bayt kaydırır, yazdırır, tekrarlar [Gerçekte olan budur])

Bu nasıl uygulanır : Kaynak 0123456789abcdef'in kaynak olduğunu varsayalım

Befunge Sözde Kodu:

0123456789abcv;;"123456789abcdef" < go this way <--
             >PS'0,   repeat 2x   ^

PS, Yazdırma Yığını anlamına gelir (gerçek bir talimat değildir). Kaynak kodun yarısını kullanarak yığını tersine itiyoruz, ""sonra yığını yazdırıyoruz ve sonra önünde hareket ettiğimiz 'ilk karakteri getiriyoruz ( komut veriyoruz ) ve bayt kaymasına neden olan en son yazdırıyoruz, sonra döngüyü tekrarlıyoruz ikinci kopyayı yazdırmak için bir kez daha. Ele alınacak bir teknik, kaynak içindeki sembollerdir, kaynak kodunu yürütürken yazdığımızda bu sorun yaratabilir, bunu dışarıdan ilgilenen daha fazla ifadeler ekleyerek atlattım.0'

Bu, kodun şöyle görünmesini sağlar: kod

Açıklama :
Yeşil Vurgulama: Kaynağa karakter eklemeye özen gösteren kod
Gri Harfler (problar zayıf görünürlük özür dilerim): Yeşil kodla eklenen kod
Kırmızı Vurgulama: Kaynak kodun ikinci yarısının ilk karakterini Mavi alana taşıyan kod .
Mavi Vurgulama: Bkz. Kırmızı Vurgulama
Turuncu Vurgulama: @Sarı Alana bir (sonlandırma) komutu koyarak 2 baytlık kaydırılmış kopyalar yazdıktan sonra sonlandırdığımızdan emin olan kod .

Oklar umarım kod akışının nasıl gittiğini daha net hale getirmelidir.

: İşte son sert kısım geliyor
nerede yapacağız bebekler kaynak kodu geliyor?

Kısa cevap: C # Magic
Uzun cevap: 100+ C # koduyla derlenmiş elle yapılan kod parçacıkları. Elle yaklaşık 100 sabit başlatıcı (belirli bir sayıyı istiflemeye iten bir parça kodlama kodu) elle yazdım ve daha sonra 1300 bayt Befunge çıktısına derlemek için özel bir C # programı kullandım, sonra iki kez yapıştırdım ve sonuncuyu yaptım programı.

Hala burada mısın? Okuduğunuz için teşekkürler! (veya en azından sonuna kadar kaydırma)
Umarım kötü şakaları eğlenceli ve sinir bozucu değildir.

Not: Bu koddaki hiçbir put ifadesi hile yapacak bir ag komutu oluşturmaz.

EDIT: Geliştirici araçlarını kullanarak TIO aşağıdaki Javascript kodunu kullanarak kodu doğruladım

setInterval(()=>{document.getElementById("code").value = 
document.getElementById("output").value; 
document.getElementById("run").click();}, 2000);

Gerçekten tam açıklamayı dört gözle bekliyorum, ama bu oldukça büyük bir başarı gibi görünüyor ve kesinlikle ödülü hak ediyor!
Nathaniel

1
@Nathaniel Tam açıklama umuyoruz hoşuna gidiyor! : D
IQuick 143

1
pYanlış argümanlarla başa çıkma kısmı dahidir.
leo3065

@ leo3065 Teşekkürler :)
IQuick 143

@lQuick gerçekten de var!
Nathaniel
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.