Lipogram“ ควิน”


26

งาน

  1. ใช้อักขระ Unicode เดียวเป็นอินพุต
  2. เอาท์พุทโปรแกรมในภาษาเดียวกันกับที่ยังเป็นไปตามข้อกำหนดนี้ แต่ไม่มีตัวอักษรอินพุต
  3. ถ้าโปรแกรมของคุณจะดำเนินการด้วยการป้อนข้อมูลแล้วโปรแกรมการส่งออกมีการเรียกใช้จากนั้นมีการป้อนข้อมูลแล้วโปรแกรมมันเอาท์พุทจะได้รับอนุญาตให้มีตัวอักษร อย่างไรก็ตามยังไม่ได้รับอนุญาตให้ปรากฏในโปรแกรมนี้ กล่าวอีกนัยหนึ่งคือห้ามไม่ให้มีการป้อนข้อมูลในการจุติมาเกิดล่าสุดของโปรแกรม
  4. ไม่ว่าสิ่งที่ชื่ออาจพูดได้ว่ากฎ quine มาตรฐานใช้

โปรแกรมที่สั้นที่สุดชนะ โปรแกรมต้องมีความยาวอย่างน้อยหนึ่งไบต์

ตัวอย่าง

ถ้าโปรแกรมคือ 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ล่ามสำหรับภาษาสมมติอยู่ที่ไหน


ความท้าทายนี้จะไม่น้อยกว่าภาษา verbose หรือไม่ ใช้คำหลายคำแนะนำสำหรับชื่อดังนั้นมันจะเป็นเรื่องยากมากและ / eหรือไม่สามารถที่จะหลีกเลี่ยงตัวอักษรเช่น
LegionMammal978

2
มันยากมากที่จะเขียนเป็นภาษาอังกฤษโดยไม่มีeGadsby ทำเช่นนั้น
Akangka

ฉันสมมติว่าไม่มีฟังก์ชั่นควินิน
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

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'

    หน้าต่าง [ "\ x6coc \ x61tion"] [ "ชม \ 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

นอกจากนี้ไม่จำเป็นต้องใช้ console.log เอาต์พุตของฟังก์ชั่นก็ใช้ได้
Mama Fun Roll

จะไม่ใช้Function`[code]`.call``;งานให้กับคุณแทนที่จะเปลี่ยนเส้นทางหรือไม่ นี่คือตัวอย่างการทำงาน: es6fiddle.net/ij023v49 (ดู? ไม่evil()! Erm ฉันหมายถึง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.