리포 그램“퀸”


26

태스크

  1. 단일 유니 코드 문자를 입력으로 사용하십시오.
  2. 이 스펙을 준수하지만 입력 문자를 포함하지 않는 동일한 언어로 프로그램을 출력하십시오.
  3. 프로그램 입력 작동하면 하고 출력 프로그램 후 입력 실행된다 (B) , 다음 프로그램 출력이된다 허용 캐릭터 포함 . 그러나이 프로그램에서 b 는 여전히 나타나지 않습니다. 다시 말해, 프로그램의 가장 최근 화신에 대한 입력 만 나타나는 것은 금지되어 있습니다.
  4. 제목에 관계없이 표준 퀴니 규칙이 적용됩니다.

최단 프로그램이 이깁니다. 프로그램 길이는 1 바이트 이상이어야합니다.

프로그램이 ABCD 인 경우 (#는 주석입니다)

> slangi "ABCD"
A
EBCD          # "FBCD" "JGGJ" "UGDKJGDJK" are all OK
> slangi "EBCD"
C
ABGD          # "EBGD" "UIHDAIUTD" are all OK
> slangi "ABGD"
B
AFCD
> slangi "AFCD"
Z
ABCD

slangi가상의 언어에 대한 통역사는 어디에 있습니까 ?


이 도전이 덜 장황한 언어가 아닌가? 몇몇은 명령어 명으로 단어를 사용하기 때문에와 같은 문자를 피하는 것은 매우 어렵거나 불가능합니다 e.
LegionMammal978

2
없이 영어로 작성하는 것은 매우 어렵지만 eGadsby는 그렇지 않습니다.
Akangka

Quiine 기능이 없다고 가정합니까?
Mama Fun Roll

답변:


24

CJam, 45 41 38 35 바이트

{`"OX$_?"+_l&{{H)+`}/"\He,}":)}&}_~

입력 문자가 문자가 아닌 "$&)+,/:?HOX\_`el{}경우이 프로그램은 약간 수정 된 다음 버전 자체를 인쇄합니다. 온라인으로 사용해보십시오!

{`"OX$_?"+_l&{{H)+`}/"\He,}":)}&}OX$_?

그렇지 않으면 프로그램은 다음과 같이 난독 화 된 수정 버전을 인쇄합니다. 온라인으로 사용해보십시오!

''r'4'a'j'6'q'Q'4'='q'~'8'''Z';'='r''A'4'n'Z'w'>''4'L';''8''a'j'6'q'Q]If-~

일부 문자는 인쇄 할 수 없습니다. 온라인으로 사용해보십시오!

작동 원리

{`"OX$_?"+_l&{{H)+`}/"\He,}":)}&}_~

{                               }    Define a code block.
                                 _~  Push a copy and execute the copy.
 `                                   Push a string representation of the block.
  "OX$_?"                            Push that string.
         +_                          Concatenate and push a copy.
           l&                        Intersect the copy with the input.
             {                }&     If the intersection is non-empty:
              {    }/                  For each character of the concat. strings:
               H)                        Push 18.
                 +                       Add it to the character.
                  `                      Inspect; turn 'c into "'c".
                     "He,}"            Push that string.
                           :)          Increment each char. Pushes "If-~"

첫 번째 가능한 출력 프로그램에서는 ~다른 프로그램에서 사용할 수있는 사용 을 피 합니다. 따라서 _~수정 된 프로그램은 대신에 OX$_?다음과 같이 작동하는로 끝납니다 .

O        Push "" (falsy).
 X$      Push a copy of the code block.
   _     Push yet another copy.
    ?    Ternary if; since "" is falsy, execute the second copy.

마지막으로 나머지 출력 프로그램에서

''r'4'a'j'6'q'Q'4'='q'~'8'''Z';'='r''A'4'n'Z'w'>''4'L';''8''a'j'6'q'Q]

모든 문자를 배열로 감싸서 다음 문자열을 푸시합니다.

"'4aj6qQ4=q~8'Z;=r'104nZw>'4L;'8'j6qQ"

If- 각 문자 코드에서 18을 빼서 문자열을 밀어냅니다.

"{`\"OX$_?\"+_l&{{H)+`}/\"\He,}\":)}&}OX$_?"

이는 ~평가합니다.


18

자바 스크립트 (ES6) 356 340 327 308 303 263

이제 Function`...```두 번째 프로그램에 사용하십시오.

f=(b=y=>[for(x of`f=${f};f()`)x.charCodeAt().toString(y).toUpperCase()])=>alert([`eval('\\${b(8).join('\\')}')`,`eval(String.fromCharCode(${b(10).map(x=>'+9-8'.repeat(x))}))`,'Function`\\x'+b(16).join('\\x')+'```'][1+"0e1v2a3l4(5'6'7)\\".indexOf(prompt())%2]);f()

이 기능은 다음 세 가지 가능한 프로그램 중 하나로 압축됩니다.

  1. 첫 번째 프로그램은 eval각 문자를 8 진수 값으로 이스케이프 한 함수 코드가 포함 된 문자열 리터럴을 호출 합니다.

    eval ( '\ 146 \ 165 ...')
  2. 두 번째 프로그램 javascript:은 각 문자 URL이 인코딩 된 함수 코드가 포함 된 URL로 브라우저를 리디렉션합니다 . 이것은 괄호를 사용하지 않고 코드를 평가할 수있는 유일한 방법입니다. 또한 'eval'의 문자를 이스케이프합니다.

    창 [ "\ x6coc \ x61tion"] [ "hr \ x65f"] = "j \ x61 \ x76 \ x61script : % 66 % 75 ..."
  3. 마지막 프로그램은 고통스럽게 길다. +9-8각 문자 코드를 얻기 위해 한 번에 하나 ( )를 추가하여 함수의 코드를 작성합니다 . 이것은 8 진수를 사용하지 않기위한 것입니다.

    eval (String.fromCharCode (+ 9-8 + 9-8 + 9-8 + 9-8 ...))

입력 문자에 대해 신중하게 구성된 문자열을 검색하여 올바른 프로그램이 색인됩니다.

[`program_1`,`program_3`,`program_2`][1+"0e1v2a3l4(5'6'7)\\".indexOf(prompt())%2]

다음은 테스트되지 않은 테스트되지 않은 버전입니다. 소스의 개행으로 인해 작동하지 않을 수 있습니다.

function f() {
    // convert source code of current function to bytes
    var bytes = Array.map(f + 'f()', x => x.charCodeAt());

    // pack this function's code in one of three possible programs,
    // depending on the input
    var input = prompt();

    // PROGRAM 1 - only contains characters: eval(')01234567\
    // eval('\146\165...')
    var source = "eval('\\" + bytes.map(x => x.toString(8)).join('\\') + "')";

    // PROGRAM 2 - doesn't contain characters: eval('')
    // window["\x6coc\x61tion"]["hr\x65f"]="j\x61\x76\x61script:%66%75..."
    // -> window["location"]["href"] = "javascript:..."
    if ("eval(')".includes(input)) {
        source = 'window["\\x6coc\\x61tion"]["hr\\x65f"]="j\\x61\\x76\\x61script:%';
        source += bytes.map(x => x.toString(16).toUpperCase()).join('%') + '"';
    }

    // PROGRAM 3 - doesn't contain characters: 01234567\
    // eval(String.fromCharCode(+9-8+9-8+9-8+9-8...))
    if ('01234567\\'.includes(input)) {
        source = "eval(String.fromCharCode(";
        source += bytes.map(x => '+9-8'.repeat(x)).join(',') + '))';
    }

    console.log(source);
}
f()

function f(){ ... };f()일 수 있습니다 (f=_=>{ ... })(). 예를 들면 다음과 같습니다. es6fiddle.net/iiz2nq0l
Ismael Miguel

더 나은 : f=(_=prompt())=>...;f(). 입력은로 저장됩니다 _.
Mama Fun Roll

또한 console.log가 필요 없으며 함수 출력이 좋습니다.
Mama Fun Roll

Function`[code]`.call``;리디렉션 대신 작업을 사용하지 않습니까? 다음은 실제 예입니다. es6fiddle.net/ij023v49 (참조? 아니요 evil()! 음, 내 말은 eval()...)
Ismael Miguel

글쎄, 당신은 오늘 무언가를 배웠습니다. 그냥 알고 있어야 this개체가 그 빈 템플릿 문자열입니다. 그것은에 의존하는 Function대신 실행, 당신은 함수를 만들 수 있습니다 생성자 eval(). 이 함수에는 첫 번째 매개 변수 내에 코드가 포함됩니다. 나는 그것을 사용하여 실제를 얻기 위해 그것을 많이 window사용 Function('return this')()합니다. 사용할 수 없기 때문에 ()ES6의 친절 함을 남용하여 사용할 수없는 기능을 뱉어 보았습니다 (). 이를 위해서는 .call()새로운 this객체로 함수를 호출하는 메소드 가 필요 합니다.
Ismael Miguel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.