3 차 퀘인 작성


17

이 도전은 ' 골프 상호 대화 ' 의 확장입니다 .

선택한 세 가지 언어를 사용하여 3 차 오로 보로스 프로그램을 만듭니다 .

즉, 언어 A에서 프로그램 pB를 언어 B로 출력하는 프로그램 pA를 작성하십시오. 프로그램 pB는 프로그램 pC를 언어 C로 출력해야하며, 원래 프로그램 pA를 언어 A로 출력합니다.

A, B 및 C의 두 언어는 서로 동일하거나 하위 집합 또는 상위 집합이 될 수 없습니다. pA, pB 또는 pC는 동일하지 않을 수 있습니다.

예를 들어, Haskell 프로그램은 원래 Haskell 프로그램을 출력하는 Java 프로그램을 출력하는 Perl 프로그램을 출력합니다.

한편, C # 2 프로그램을 출력하는 C # 3 프로그램을 출력하는 C # 4 프로그램은 유효하지 않습니다. Perl 프로그램과 Ruby 프로그램이 동일한 경우 Perl-> Ruby-> Bash 조합도 유효하지 않습니다.

이것은 코드 골프이므로 가장 짧은 프로그램 pA가 이깁니다.


답변:


21

Python-> Perl-> Ruby, 48 자

이전 답변의 적응 . 달리는

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

파이썬 으로이 펄스 니펫을 생성합니다

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

다음 루비 코드를 생성합니다.

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

그런 다음 원래 Python 스 니펫을 인쇄합니다.

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical

13

Perl-> PHP-> HTML + JavaScript, 105 자

언어 체인을 어떻게 든 의미있게 만들고 싶었 기 때문에 JavaScript가 포함 된 HTML 페이지를 생성하는 PHP 스크립트를 작성한다고 생각했습니다. 제 3의 언어로는 Perl을 좋아했기 때문에 Perl을 선택했습니다. :)

어떤 사람들은이 네 가지 언어를 고려할 수도 있지만 HTML을 JavaScript와 별개로 여기지 않습니다. 프로그래밍 언어가 아닌 마크 업 언어입니다. 어쨌든 다음은 세 가지 버전입니다.

펄 (105 자) :

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP (165 자) :

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + 자바 스크립트 (235 자) :

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(Ps. 네, PHP 단계를 Perl에서 HTML + JS 코드를 생성하고 추가 <?php하는 것만으로 거의 스누핑 할 수 있다는 것을 알고 있습니다. 그대로 복사하는 대신 PHP로 처리됩니다.)


3

언더로드 → sed → Perl, 23 바이트

더 나은 언어를 선택하면 더 낮아질 수 있습니다. "sed 프로그램은 논란으로 빈 줄을 can 수있다"는 규칙에 따라 대회에 참가할 수 없기 때문에 논 경쟁이 될 수 있습니다.

언더로드 프로그램 :

((iprint+q)Sa(:^)*aS):^

sed 프로그램을 생성합니다 :

iprint+q(((iprint+q)Sa(:^)*aS):^)

펄 프로그램을 생성합니다 :

print + q (((print + q) Sa (: ^) * aS) : ^)


(참고 : 여기에는 두 개의 후행 줄 바꿈이 있습니다), 원래 Underload 프로그램을 다시 생성합니다.

((iprint+q)Sa(:^)*aS):^

여기서 주요 목표는 문자열을 중첩 할 수있는 언어를 찾는 것입니다 (즉, 문자열을 이스케이프하지 않고 구분 기호로 묶어 문자열을 인용 할 수 있습니다). Underload has (), Perl has q(), sed에서 문자열은 공백이 될 때까지 계속됩니다 (프로그램에 공백이 없으면 암시 적으로 중첩 가능합니다). 아마도 "현재 줄의 나머지 부분을 인쇄하고, 줄 바꿈을하지 않는"명령을 가진 esolang 또는 golfing 언어가있을 것입니다. 그러나 여기서는 이상적이지 않을 것입니다. 이 경우 명령 길이에서 8 바이트를 뺀 값을 저장할 수 있습니다. (젤리는 거의 효과가 있지만 그 지침은 인용되지 않습니다. 게다가 도전 과제를 게시합니다.)

이것을 다음과 같이 22 바이트로 줄일 수 있습니다 .

((csay + q) Sa (: ^) * aS) : ^

(일반적으로 골프에서 0이 아닌 일반 텍스트 파일처럼 하나의 후행 줄 바꿈). 그러나 여기에는 줄 바꿈을 no-op로 취급해도 괜찮은 Underload 인터프리터가 필요합니다. 그것을 온라인으로 사용해보십시오!

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