Kaynak Kodu Metamorfoz


29

mbomb007 bizden kendini yaratan bir program yapmamızı istedi . Bu ilginç bir meydan okuma, ancak kişisel olarak programlarımın kendi kendine sakatlanmalarını teşvik etmekten hoşlanmıyorum. Her programın merkezinde, ayrılmayı bekleyen güzel bir kelebek olduğunu düşünüyorum.

Bu nedenle, ilk Code Golf mücadelem için Stack Exchange'i bir kelebeği metamorph haline getirmek için zorluyorum. Programınız kendi kodunu giriş ve çıkış olarak kabul etmeli ve I am a caterpillar!ardından aynı dilde başka bir programın kodunu almalıdır (çıkışlar arasına bir bölücü koyabilirsiniz ya da değil ... ama biz kelebekler konuşuyoruz, bu yüzden saygınlık önemlidir!). Bu ikinci program çıktı vermeliI am a beautiful butterfly!

Metamorfoz: Bu program kendini değiştirmeli, bu yüzden kendisini girdi olarak geçiriyor. I am a caterpillar!Baskı kodundan sonra basılan bir deyimden başka hiçbir şey olmayan sıkıcı iç içe geçmiş bir program istemiyorum . Kodun kendisini metamormelleştirmelisiniz, bu nedenle en sıkıcı kabul edilebilir cevap yazdıran I am a caterpillar, ardından bir dizgeyi girişten (kod olan) kopyalayan ve basan cevaptır . Tabii ki, bu yazmak için çok zor küçük bir gerekliliktir, bu yüzden bir "meydan okuma ruhu" olarak düşünülmelidir. Resmi gereksinim, "Programınıza, programınızla aynı uzunlukta rastgele bir dize verilirse I am a butterfly, ikinci program çalıştırıldığında % 5'ten daha az yazdırma şansı olmalıdır ."

Özet:

  • Girdi olarak kendi kodunu sağladığında, I am a caterpillar!ardından bir kaynak kod bloğunun (aralarında sınırlayıcı olsun veya olmasın) yazdırdığı bir program yazın .
  • Bu ikinci kaynak kod bloğu, aynı dilde derlendiğinde / yorumlandığında yazdırılıyor I am a beautiful butterfly!
  • Programınıza girdi olarak kendi kaynak kodunu vermediyseniz ve bunun yerine kendi koduna uymayan rastgele bir karakter dizesi verilirse, sonuç ya I am a butterfly!rasgele% 95'ine derlenemez / yorumlanamaz ya da yazdırılmamalıdır . stringler (spirit: girişten kendi kaynak kodunuzu okumanız ve onu bir kelebeğin içine dikilmeniz beklenir).
    • Metamorfoz fikrinin ruhuna sadık kaldığınız sürece, kendi kodunuzu değiştirdiğiniz sürece, bunu ispatlamamanız konusunda rahatım, ancak girdilerinizi kullanarak etrafında çalışmak için boşluk oyunu oynamayı deniyorsanız, kanıtlamak için.
  • Standart boşluklar uygulanır

Bunların güzelliği ile değerlendirilmelerini isterdim, ancak bu kesinlikle nicel olmayan bir yaklaşım, bu nedenle normal "bayt sayısı" rotası yargılamak için kullanılabilir

Bonus : -20% - programınızın ilk 3 harfiyle eşleşmeyen 3 harfli bir dize seçin. Tırtıl programını çalıştırıyorsam, ancak girdiyi ilk 3 karakter belirtilenlerle değiştirilecek şekilde değiştirin, I am Batman!bunun yerine yazdırın . Daima Batman ol. ( Aynı rasgele dize kuralları bu ... metamorfoz için de geçerlidir! )

Önemsiz örnek (python):

"""
    print "I am a beautiful butterfly!"
    #print "I am Batman!"
"""
import sys
code = sys.stdin.read()
if code.startswith("YYZ"):
   # swap the comments between the print statements
   code = code.replace("#print", "_a").replace("print", "#print").replace("_a", "print")
code = [3:] # remove """ or XYZ
code = code.split('"""')[0]
print "I am a caterpillar!"
print code

Not olarak: İlk kez bir tırtıl gibi göründüğü asci sanat programlarını görmeyi çok isterdim ve bir sonraki aşamada bir ascii kelebeğine dönüşür, ancak bu zorluğun olması gerekenden biraz daha ileridir.
Cort Ammon - Monica

Bir programda birden fazla dosya varsa ne yapmalıyız?
TheNumberOne

@TheNumberOne Orada ne planladığını merak ediyorum! Bilmiyorum, sonuçları hemen görmeden hemen bunun için kurallara uymak isteyip istemediğimi bilmiyorum, ama bana öyle geliyor ki, eğer çok parçalı bir dosya kümesini girdi olarak kabul ediyorsanız (tek bir dosya yerine içindekiler) ve çok parçalı bir çıktı kümesi (tek bir çıktı yerine) çıktıracaksınız, dosyalar arasında yarı makul bir ayırıcı varsa, bunun makul bir çözüm olması gerektiğini düşünüyorum. Bu sizin için işe yaramazsa, bir kuralı daha iyi hale getirmek için önerilen çözümünüz hakkında daha fazla bilgiye ihtiyacım olabilir.
Cort Ammon - Monica

@TheNumberOne Ve yazım hatası yakalamak için teşekkür ederim. Bu yazım hatası çok güzel bir kelebek değildi!
Cort Ammon - Monica

Yanıtlar:


63

Befunge-98, 602 bayt

                                        "^@<"v@@
                                     "'I'"00v>00g::
                                   "@v"0v@@@>g::a">#"
                                 "a">v@@>      0g::'"1>                                 /
                             ":\"'"v@>            'm'"00g:a                       >"@v$"
 "lufituaeb"'"'v00ga"@v\"'":'b\00v@>                :'a\":*84>"00ga"\>@@@@_,#:>"00g:a'<'"
"et"'"'va'v'":'l\00g5k:'""y!">>v@>                    g::'''""ut"'"'>a'<'""fr"'"00g3k:'">
 "ma"00g>'I~48*-~48*-+#@_>:#,_@>                        '"aa"---"aa"!rallipretac"00g:'a\

PyFunge'de test edilmiştir.

2 boşlukla başlamayan bir dizeyle çalıştırıldığında (rastgele olduğunda% 95'in üzerinde olasılık) hiçbir şey çıkarmaz. Bu tam olarak OP'nin aradığı şey değil, şartnameye uygun.

2 boşlukla başlayan bir dize (bunun gibi) iletildiğinde şunu verir:

I am a caterpillar!

---

"!y"       "l"v
v"te"     "rf"<
>"tu"'   "b"\v@
 v"beautiful"<
  >:#,_@@@@>\
 >48*:"a"\:$v@
  "ma"   v@#>
   'I'   <@^

Bunun alt kısmı sırayla şöyle çıkarır:

I am a beautiful butterfly!

2
Vay. Bu harika.
bir

3
Birinin senin yaptığın gibi kuralları zorlamak isteyeceğini biliyordum; Güzel bir şey çıktığına sevindim =)
Cort Ammon - Reinstate Monica

Hem tırtıl hem de kelebek Matrix'e sıkışmış gibi görünüyor. Güzel!
Erno

Bunu nerede çalıştırabilirim?
user1514631,

3
Code Golf'ta iyi insanların nasıl bu kadar güzel canavarlıklar yarattığını asla anlayamayacağım.
Chris Cirefice,

19

PHP, 74 Bayt

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=eşdeğerdir <?php echove çıktıya birkaç virgülle ayrılmış değer alabilir
  • ¶ßž’ßžßve šžŠ‹–™Š“ߊ‹‹š™“†ÞPHP'de geçerli sabit isimlerdir, fakat sabitler mevcut olmadığı için değişmez olarak yazılır. ~onları ters çevirir "I am a "ve "beautiful butterfly!"(her biri bir tırnak işareti için bir bayt kaydetme)
  • strtr"tırtıl!" "güzel bir kelebek!" tartışmada

2
Bir açıklama yapmak ister misiniz?
Timwi

@Timwi sorun değil, açıklama eklendi
Fabian Schmengler

Birinden "güzel kelebeği" ROT13 gibi bir şeyle kodlamasını bekledim, ancak onu PHP'nin string değişmez tekniği ile eşleştirme fikri, Kaylee'nin ifadesiyle parlak!
Cort Ammon - Monica

7

Pyth, 50 46 bayt

"I am a caterpillar!"+<z8"beautiful butterfly!

açıklama

"I am a caterpillar!"        print "I am a caterpillar!"
 z<8                         first 8 chars of input
+   "beautiful butterfly!    add "beautiful butterfly!" to that and print

Sonuçta ortaya çıkan kaynak kodu

"I am a beautiful butterfly!

Temel olarak metni basar.


6

Perl 6, 60 56 bayt

say "I am a caterpillar!"; s/\S+\!/beautiful butterfly!/

Düzgün çalışması için -p gerektirir; Bunu bayt sayımı ile hesapladım. Ne yazık ki Perl 6'nın olumsuz taraflarından biri, sözdiziminin şimdi çok daha katı olması ...


Tırtıllar metamorfoz sırasında korunmasızdır. İstedikleri neden en kozalar değişkenler kendilerini örtecek Yani: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(Ben Perl 6 ile Perl 5 gibi barewords izin verdiğini tahmin ediyorum no strict 'subs've s///lhs Interpolates değişkenleri.)
ThisSuitIsBlackNot

Huh, bu komik. Bunu denedim ve bazı nedenlerden dolayı wc yaptığımda bana aynı miktarda bayt verdi. Ama tekrar yazdıktan sonra bana daha az bayt verdi. Garip.
bir

Neyse bekle, neden yapmadığımı hatırladım. Yeni kodu çalıştırdığınızda, güzel ile kelebek arasındaki boşluktan dolayı bir hata veriyor.
bir

Ah, Perl 6'yı hiç kullanmadım, o yüzden sana yardım edemem. Gerçekten sadece esprili bir açıklama yapmak için bir bahane istedim. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/daha kısa ve kesinlikle Perl 6'da çalışacak.
ThisSuitIsBlackNot 08:15 '

1
@ BuSuitIsBlackNot Bu zorluğa uymuyor. Kurallar, kodunuzu gerçekten okuduğunuzdan ve değiştirdiğinizden emin olmak için vardı. Sonunda, gerçek ruh kodun kalbindeki güzel kelebeği serbest bırakmaya çalışıyor. Elbette, güzellik, bakanın gözündedir. Her birimiz, diğerlerinden daha az ya da çok güzel farklı çözümler bulacağız. PERL’deki çözümlere gelince, diyelim ki PERL’in kendine özgü güzel tanımı vardır ve gayet iyi amaçlarına uygundur ;-)
Cort Ammon - Reinstate Monica

4

Retina, 53 bayt

caterpillar
beautiful butterfly
^
I am a caterpillar!

Çıktı:

I am a caterpillar!beautiful butterfly
beautiful butterfly
^
I am a beautiful butterfly!

I am a caterpillar! Yeni program arasında bir ayırıcı bulunmadığına dikkat edin . Yeni program girdi beklemiyor.


3

bash/ awk/ cksum- 179.2 169,6 168 bayt

awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'

Demo:

$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am a caterpillar!
echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
$ echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
I am a beautiful butterfly!

# Batman!
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> xyzawk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am Batman!

# Invalid input
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0{'
> E

İnşallah% 20 ile başlayan herhangi bir dize uygulanır xyz, aksi takdirde orijinal sayım 224 212 210 bayttır ( "I am Batman!"kısım düzeltildi ).

Dönüşüm yapılır: literal tek oluşumunu yer değiştirir !NFolan 10, böylece, " butterfly"bir de kullanılarak basılırprintf .

cksumKaynak kodun bir kısmında (yani geri kalanında) basit bir işlem gerçekleştirir , dolayısıyla gereksinimi de artar.

Uyarı: İlk giriş bitmelidir '. Yanlış girişi bastırmak için pek bir uyarı değil ...

İkinci bir giriş beklenmiyor.


1
VAY. Awk kişiyi bekliyordum, hepsi bu. Bu oldukça havalı.
jrg

@jrg teşvik için teşekkürler. :)
09:15

1

Python - 184 bayt bonus için% -20 = 147.2

""""""
import sys;c=sys.stdin.read();print"I am a caterpillar!";x=c[3:] if"\'''"!=c[:3] else c
print x+c[:3]
""";print"I am a beautiful butterfly!" """
''';print"I am Batman";'''

Yazdırmak için I am batman, ilk üç çift tırnak girişindeki tek tırnak ile değiştirin. (İlk satır '''""")

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.