口红“ quine”


26

任务

  1. 以单个Unicode字符作为输入。
  2. 以也符合该规范的相同语言输出程序,但不包含输入字符。
  3. 如果你的程序与输入运行一个,然后输出程序,然后用输入运行b,程序输出被允许的包含字符一个。但是,仍然不允许b出现在该程序中。换句话说,仅禁止输入程序的最新版本。
  4. 无论标题怎么说,都适用标准的奎因规则。

最短的程序获胜。程序必须至少一个字节长。

如果程序是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 '16

2
没有e,很难用英语写,但是Gadsby做到了。
Akangka '16

我假设没有quine函数?
Mama Fun Roll

Answers:


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

的JavaScript(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包含该函数代码的字符串文字,并且每个字符都以八进制值进行转义。

    eval('\ 146 \ 165 ...')
  2. 第二个程序将浏览器重定向到一个javascript:包含函数代码的URL,每个字符的URL均已编码。这是我认为不使用括号评估代码的唯一方法。它也将“ eval”中的字母转义。

    window [“ \ x6coc \ x61tion”] [“ hr \ x65f”] =“ j \ x61 \ x76 \ x61script:%66%75 ...”
  3. 最后一个程序很长。它通过一次添加一个(+9-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'1

另外,不需要console.log,功能输出也可以。
Mama Fun Roll'1

不会Function`[code]`.call``;为您使用工作,而不是重定向吗?这是一个工作示例:es6fiddle.net/ij023v49(请参阅?否evil()Erm,我的意思是eval()……)
Ismael Miguel

好吧,你今天学到了一些东西。请注意,该this对象将是空模板字符串。它依赖于Function构造函数,该构造函数允许您创建函数,而不是运行eval()。该函数将在第一个参数中包含代码。我用了很多我得到了真正window使用Function('return this')()。由于您无法使用(),我滥用了ES6的一些帮助来尝试吐出一个无需使用即可运行的可用功能()。为此,您需要一个.call()方法,该方法使用一个新this对象调用该函数 。
伊斯梅尔·米格尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.