소스 코드 변성


29

mbomb007는 우리에게 자가 절단 프로그램 을 만들도록 요청했습니다 . 흥미로운 도전이지만 개인적으로 프로그램이 자해되도록 권장하지는 않습니다. 나는 모든 프로그램의 중심에 아름다운 나비가 튀어 나와 있다고 생각하고 싶습니다.

따라서 첫 번째 Code Golf 챌린지에서 나비를 변형시키기 위해 Stack Exchange에 도전했습니다. 프로그램은 자체 언어 코드를 입력 및 출력으로 수용하고 I am a caterpillar!동일한 언어로 된 다른 프로그램의 코드를 따라야합니다 (출력 사이에 분배기를 놓을 수도 있고 그렇지 않을 수도 있지만 나비를 말하고 있기 때문에 예쁘게 계산됩니다!). 이 두 번째 프로그램은I am a beautiful butterfly!

변형 :이 프로그램은 스스로 수정해야하므로 입력으로 전달됩니다. 인쇄 문 I am a caterpillar!다음에 소스 코드를 인쇄 하는 지루한 중첩 프로그램을 원하지 않습니다 . 코드 자체를 변형해야하므로 가장 지루한 대답은 인쇄하는 I am a caterpillar다음 입력에서 문자열을 추출하여 코드에서 발생하는 것입니다. 물론 이것은 작성하기가 매우 까다로운 요구 사항이므로 "도전의 정신"으로 생각해야합니다. 공식적인 요구 사항은 "프로그램과 동일한 길이의 임의의 문자열이 프로그램에 제공되는 I am a butterfly경우 두 번째 프로그램이 실행될 때 인쇄 할 확률이 5 % 미만이어야 합니다."로 설정됩니다.

개요:

  • 자체 코드를 입력으로 제공 할 때 I am a caterpillar!소스 코드 블록이 뒤에 나오는 구분 기호를 사용하여 인쇄하는 프로그램을 작성하십시오 .
  • 이 두 번째 소스 코드 블록은 동일한 언어로 컴파일 / 해석 될 때 인쇄됩니다. I am a beautiful butterfly!
  • 프로그램에 자체 소스 코드가 입력으로 제공되지 않고 자체 코드와 일치하지 않는 임의의 문자열이 제공된 경우 결과는 컴파일 / 해석에 실패하거나 I am a butterfly!임의의 95 % 이상으로 인쇄되지 않아야합니다. 문자열 (정신 : 입력에서 자신의 소스 코드를 읽고 나비로 묶을 것으로 예상됩니다).
    • 나는 당신이 변태 아이디어의 정신을 잡고 자신의 코드를 수정하는 한, 이것을 증명하지 않고 편안하지만 입력을 사용하여 문제를 해결하기 위해 허점 게임을하려고한다면 그것을 증명하기 위해.
  • 표준 허점 적용

나는 이것들이 그들의 아름다움에 의해 판단되기를 원하지만 그것은 결정적이지 않은 양적 접근 방식이므로 일반적인 "바이트 수"경로를 사용하여 판단 할 수 있습니다.

보너스 : -20 %-프로그램의 처음 3 자와 일치하지 않는 3 개의 문자열을 선택하십시오. 캐터필라 프로그램을 실행하지만 처음 3자가 지정된 문자로 변경되도록 입력을 수정하면 I am Batman!대신 인쇄하십시오 . 항상 배트맨입니다. ( 동일한 무작위 문자열 규칙이 이것에 적용됩니다 ... 변태! )

사소한 예 (파이썬) :

"""
    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

참고로 : 처음에는 애벌레처럼 보이는 아스키 아트 프로그램을보고 싶고 다음 단계로 아스키 나비로 변하고 싶지만, 도전이 필요로하는 것보다 훨씬 더 발전했습니다.
Cort Ammon-복원 모니카

프로그램에 여러 파일이있는 경우 어떻게해야합니까?
TheNumberOne 2016 년

@TheNumberOne 나는 당신이 거기서 무엇을 계획했는지 궁금합니다! 결과를 보지 않고 바로 그 규칙을 따를 것인지는 모르겠지만 단일 파일이 아닌 여러 부분으로 된 파일 세트를 입력으로 받아들이려면 내용), 파일 사이에 반 합리적인 분리기가있는 여러 부분으로 된 출력 세트 (단일 출력이 아닌)를 출력해야한다는 것이 합리적인 해결책이라고 생각합니다. 이것이 효과가 없다면 규칙을 더 잘 만들기 위해 제안 된 솔루션에 대한 통찰력이 더 필요할 수 있습니다.
Cort

@TheNumberOne 그리고 오타 캐치 주셔서 감사합니다. 그 오타는 분명히 아름다운 나비가 아니 었습니다!
Cort Ammon-복원 모니카

답변:


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
와우. 이것은 놀랍다.
스파게티

3
나는 당신이했던 것처럼 누군가가 규칙을 밀고 싶어한다는 것을 알고있었습니다. 나는 아름다운 무언가가 나왔기 때문에 기쁘다 =)
Cort Ammon-Reinstate Monica

애벌레와 나비는 모두 매트릭스에 붙어있는 것처럼 보입니다. 아름다운!
Erno

어디에서 실행할 수 있습니까?
user1514631

3
Code Golf의 훌륭한 사람들이 어떻게 아름다운 괴물을 만들 수 있는지 이해하지 못할 것입니다.
Chris Cirefice

19

PHP, 74 바이트

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=동등 <?php echo여러 콤마 출력 값을 취할 수 구분
  • ¶ßž’ßžß그리고 šžŠ‹–™Š“ߊ‹‹š™“†ÞPHP에서 유효한 상수 이름이 있지만, 상수가 존재하지 않기 때문에 문자열 리터럴로 처리됩니다. ~반전은 그들에게하는 "I am a ""beautiful butterfly!"(하나의 인용 부호 각 바이트를 저장)
  • strtr"애벌레 대체" "아름다운 나비!" 논쟁에서

2
설명을 제공 하시겠습니까?
Timwi

@Timwi 문제 없음, 설명 추가
Fabian Schmengler

나는 누군가 ROT13과 같은 것으로 "아름다운 나비"를 인코딩 할 것을 완전히 기대했지만, PHP의 문자열 리터럴 기술과 일치시키는 아이디어는 Kaylee의 말로 반짝입니다!
Cort Ammon-복원 모니카

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

펄 6, 60 56 바이트

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

제대로 실행하려면 -p가 필요합니다. 바이트 수로 이것을 설명했습니다. 슬프게도 Perl 6의 단점 중 하나는 구문이 훨씬 엄격하다는 것입니다.


모충은 변태 중에 취약합니다. 그들이 좋아하는 이유의는 고치 변수에 자신을 포장하는 것을 : $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(I 펄 (6)와 펄 5와 같은 barewords 수 있으리라 믿고있어 no strict 'subs's///좌변에 보간 변수를.)
ThisSuitIsBlackNot

허, 재밌 네요 나는 그것을 시도했고 어떤 이유로 wc를했을 때 그것은 같은 양의 바이트를 주었다. 그러나 다시 입력하면 바이트 수가 줄었습니다. 이상한.
스파게티

내가 왜 안했는지 기억하지 마 새 코드를 실행하면 아름답고 나비 사이의 공간으로 인해 오류가 발생합니다.
스파게티

아, 나는 Perl 6을 사용한 적이 없어서 거기서 당신을 도울 수 없습니다. 정말 재치있는 말을 할 변명을 원했습니다. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/더 짧고 확실히 Perl 6에서 작동합니다.
ThisSuitIsBlackNot

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

I는 20 %에 대해 적용되는 희망 모든 로 시작 문자열 xyz달리 원래의 카운트이고, 224 (212) 210 바이트 (고정 "I am Batman!"부분).

변환이 완료 : 리터럴의 발생만을 대체 !NF와를 10그가되도록 " butterfly"되어 도를 사용하여 인쇄printf .

cksum소스 코드의 일부 (즉, 나머지) 에서 단순 을 수행 하므로 요구 사항도 마찬가지입니다.

주의 사항 : 첫 번째 입력은로 끝나야합니다 '. 잘못된 입력 을 억제 할 때주의 할 사항은 없습니다 ...

두 번째 입력이 예상되지 않습니다.


1
우와 나는 어색한 사람을 기다리고 있었다. 꽤 괜찮은데.
jrg

@jrg 격려해 주셔서 감사합니다. :)
hjk

1

파이썬-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입력에서 처음 세 개의 큰 따옴표를 작은 따옴표로 바꾸십시오 (첫 번째 줄은 '''""").

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.