リポグラム「クイン」


26

仕事

  1. 単一のUnicode文字を入力として使用します。
  2. この仕様にも従うが、入力文字を含まない同じ言語でプログラムを出力します。
  3. プログラムが入力aで実行され、次に出力プログラムが入力bで実行される場合、出力するプログラムは文字aを含むこと許可されます。ただし、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
なしで英語で書くのは非常に難しいですがe、Gadsbyはそれを行います。
アカンカ

私は馬の機能がないと仮定していますか?
ママファンロール

回答:


24

CJam、45 41 38 35バイト

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

入力文字がcharacterのいずれでもない場合"$&)+,/:?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

JavaScript(ES6)、356 340 327 308 303 263

次にFunction`...```、2番目のプログラムに使用します。

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()

この関数は、3つの可能なプログラムのいずれかに自身をパックします。

  1. 最初のプログラムはeval、各文字が8進数値としてエスケープされた関数のコードを含む文字列リテラルを呼び出します。

    eval( '\ 146 \ 165 ...')
  2. 2番目のプログラムはjavascript:、各文字URLがエンコードされた関数のコードを含むURLにブラウザーをリダイレクトします。これは、括弧を使用せずにコードを評価する唯一の方法です。また、「eval」の文字をエスケープします。

    window ["\ x6coc \ x61tion"] ["hr \ x65f"] = "j \ x61 \ x76 \ x61script:%66%75 ..."
  3. 最後のプログラムは非常に長いです。一度に1つ(+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
イスマエル・ミゲル

さらに良い:f=(_=prompt())=>...;f()。入力はとして保存され_ます。
ママファンロール

また、console.logは必要ありません。関数の出力は問題ありません。
ママファンロール

使用しません。Function`[code]`.call``;あなたのための作業を、代わりにリダイレクト?これが実際の例です:es6fiddle.net/ij023v49(参照?いいえevil()えーっと、どういう意味eval()ですか...)
イスマエルミゲル

さて、あなたは今日何かを学びました。thisオブジェクトが空のテンプレート文字列になることに注意してください。Functionコンストラクターに依存しているため、を実行する代わりに関数を作成できますeval()。この関数のコードは、最初のパラメーター内に含まれます。を使用して、実際に取得するために多くwindow使用しFunction('return this')()ます。使用できないので()、ES6の優しさを少し悪用して、なしで実行できる使用可能な関数を吐き出そうとしました()。そのためには、.call()新しいthisオブジェクトで関数を呼び出すメソッド が必要です。
イスマエルミゲル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.