ソースコードの変容


29

mbomb007は、自己切断プログラムを作成するように依頼しました。それは興味深い挑戦ですが、私は個人的に自分のプログラムが自傷行為になることを奨励したくありません。私は、すべてのプログラムの中心にあるのは、飛び出すのを待っている美しい蝶だと思うのが好きです。

そのため、初めてのCode Golfチャレンジでは、Stack Exchangeにバタフライを変身させます。プログラムは、独自のコードを入力および出力として受け入れ、I am a caterpillar!その後に同じ言語の別のプログラムのコードが続く必要があります(出力間に仕切りを入れても入れなくてもかまいませんが、蝶について話しているので、可愛さは重要です!)。この2番目のプログラムは出力するはずですI am a beautiful butterfly!

変態:このプログラムは自分自身を変更する必要があるため、入力として渡されます。私は、I am a caterpillar!ソースコードを出力するprintステートメントに他ならない退屈なネストされたプログラムが欲しくありません。コード自体を変形させる必要があるため、最も退屈な受け入れ可能な答えはI am a caterpillar、印刷し、入力から文字列を切り取って(これはコードである)、それを印刷するものです。もちろん、これは書くための非常にトリッキーな小さな要件であるため、「挑戦の精神」と考えるべきです。正式な要件は、「プログラムにプログラムと同じ長さのランダムな文字列が与えられているI am a butterfly場合、2番目のプログラムの実行時に5%未満の確率で印刷されるはずです」に設定されます。

概要:

  • 入力として独自のコードを提供するI am a caterpillar!と、ソースコードのブロックが続く(間に区切り文字があるかどうかにかかわらず)印刷するプログラムを作成します。
  • ソースコードのこの2番目のブロックは、同じ言語としてコンパイル/解釈されると、印刷されます I am a beautiful butterfly!
  • プログラムに入力として独自のソースコードが渡されず、代わりに独自のコードと一致しないランダムな文字列が与えられる場合、結果はコンパイル/解釈に失敗するかI am a butterfly!、少なくとも95%のランダムで印刷されない文字列(精神:入力から独自のソースコードを読み取り、それをつなぎ合わせてバタフライにします)。
    • 変身のアイデアの精神を守り、独自のコードを変更している限り、これを証明していないのは安心ですが、入力を使用して回避するために抜け穴ゲームをプレイしようとしている場合は、それを証明するために。
  • 標準的な抜け穴が適用されます

これらの美しさで判断したいのですが、それは明らかに非定量的なアプローチなので、通常の「バイト数」ルートを使用して判断できます

ボーナス:-20%-プログラムの最初の3文字と一致しない3文字の文字列を選択します。caterpillarプログラムを実行しますが、最初の3文字が指定された文字に変更されるように入力を変更する場合は、I am Batman!代わりに印刷してください。常にバットマンになりましょう。(これには同じランダムな文字列ルールが適用されます...変態!

簡単な例(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

注:最初はキャタピラーのように見え、次の段階ではアスキーの蝶に変わるアスキーアートプログラムを見てみたいが、それは挑戦が必要であるよりもかなり進んでいる。
コートアンモン-復帰モニカ

プログラムに複数のファイルがある場合はどうすればよいですか?
TheNumberOne

@TheNumberOneあなたがそこで計画していることに興味があります!結果を確認せずに、すぐにその規則を破りたいかどうかはわかりませんが、(単一のファイルではなく)複数の部分からなるファイルのセットを入力として受け入れるとしたら、 (コンテンツ)、およびファイル間の半合理的なデリニエーターを使用して、(単一の出力ではなく)マルチパートの出力セットを出力することでした、それは合理的な解決策だと思います。それがうまくいかない場合は、ルールをより適切に作成するために、提案されたソリューションについてより多くの洞察が必要になる場合があります。
コートアンモン-復帰モニカ

@TheNumberOneそして、タイプミスをありがとう。そのタイプミスは明らかに美しい蝶ではありませんでした!
コートアンモン-復帰モニカ

回答:


63

Befunge-98、602バイト

                                        "^@<"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でテスト済み。

2つのスペースで開始しない文字列で実行すると(確率が95%を超える確率)、何も出力されません。これは、OPが探しているものではありませんが、仕様に適合しています。

2つのスペースで始まる文字列(それ自体のように)が渡されると、これが出力されます。

I am a caterpillar!

---

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

その下の部分は、次を出力します。

I am a beautiful butterfly!

2
ワオ。これは素晴らしいです。
spaghetto

3
誰かがあなたと同じようにルールをプッシュしたいと思っていました。美しいものが出てきてうれしい=)
コートアンモン-復活モニカ

キャタピラーとバタフライの両方は、マトリックスに詰まっているように見えます。綺麗な!
エルノ

これはどこで実行できますか?
user1514631

3
あなたがコードゴルフの優秀な人々がこのような美しい怪物をどのように作成するかを理解することは決してありません。
クリスサイレフィス

19

PHP、74バイト

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=と同等で<?php echoあり、複数のコンマ区切り値を使用して出力できます
  • ¶ßž’ßžßおよびšžŠ‹–™Š“ߊ‹‹š™“†Þは、PHPで有効な定数名ですが、定数が存在しないため、文字列リテラルとして扱われます。およびを~反転します(それぞれ1つの引用符のバイトを保存します)"I am a ""beautiful butterfly!"
  • strtr「キャタピラー!」を置き換えます 「美しい蝶!」引数で

2
説明を提供しますか?
ティムウィ

@Timwi問題なし、説明を追加
ファビアンシュメングラー

誰かが「美しい蝶」をROT13のようなものでエンコードすることを完全に期待していましたが、それをPHPの文字列リテラルテクニックと一致させるという考えは、Kayleeの言葉では、ピカピカです!
コートアンモン-復帰モニカ

7

Pyth、50 46バイト

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

説明

"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

結果のソースコードは

"I am a beautiful butterfly!

これは基本的にテキストを印刷します。


6

Perl 6の、60の 56バイト

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

正しく実行するには-pが必要です。私はこれをバイト数で説明しました。残念なことに、Perl 6の欠点の1つは、構文がより厳密になったことです...


キャタピラーは変態中に脆弱です。そのため、彼らはc̶o̶c̶o̶o̶n̶s̶変数で自分自身をラップするのが好きです:$a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(Perl 6は、Perl 5のようなno strict 'subs's///
ベアワードを

ええ、それは面白いです。私はそれを試してみましたが、何らかの理由でwcを実行したときに同じ量のバイトが与えられました。しかし、もう一度入力すると、バイト数が減りました。奇妙な。
spaghetto

ああ、私はなぜそうしなかったのか覚えていません。新しいコードを実行すると、美しいとバタフライの間にスペースがあるためエラーがスローされます。
spaghetto

ああ、私はPerl 6を使ったことがないので、そこでは助けられません。私は本当に機知に富んだ発言をする言い訳が欲しかった。;)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/は短く、Perl 6でも確実に動作します。
ThisSuitIsBlackNot15年

1
@ThisSuitIsBlackNotそれは挑戦に合います。ルールは、コードを実際に読んで変更することを確認するためのものです。最終的に、本当の精神は、コードの中心にある美しい蝶を自由にさせようとしています。もちろん、美しさは見る人の目にあります。私たちはそれぞれ、他のソリューションよりも多かれ少なかれ異なるソリューションを見つけます。PERLのソリューションについては、... PERLには美しいという独自の定義があり、目的に合っているとだけ言ってください;-)
Cort Ammon-Reinstate Monica

4

網膜、53バイト

caterpillar
beautiful butterfly
^
I am a caterpillar!

プリントアウト:

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

I am a caterpillar! と新しいプログラムの間に区切り文字がないことに注意してください。新しいプログラムは入力を期待していません。


3

bash/ awk/ cksum- 179.2 169.6 168バイト

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}'

デモ:

$ 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

20%がで始まるすべての文字列に適用されることを望みますxyz。それ以外の場合、元のカウントは224 212 210バイトです("I am Batman!"パーツを修正)。

形質転換は行わ:リテラルの発生のみ置き換える!NFとする10ように、" butterfly"されても使用して印刷しますprintf

cksumソースコードの一部(つまり、残り)で単純を実行するため、その要件も同様です。

警告:最初の入力はで終わる必要があり'ます。間違った入力を抑制するほど警告ではありません...

2番目の入力は必要ありません。


1
わあ 私はawkの人を待っていました、そしてそれだけです。それはいいね。
jrg

@jrgの励ましに感謝します。:)
hjk

1

Python-184バイト-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";'''

入力するにI am batmanは、最初の3つの二重引用符を一重引用符に置き換えます(最初の行は'''""")。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.