Lipogram “quine”


26

Görev

  1. Giriş olarak tek bir Unicode karakteri alın.
  2. Aynı zamanda bu spesifikasyona uyan fakat giriş karakterini içermeyen bir program çıktısı.
  3. Programınız girdi olarak çalıştırılırsa a ve ardından çıkış programı daha sonra giriş ile çalıştırılan b , sonra program bu çıkışını sağlar İZİN karakter içerecek şekilde a . Ancak, b hala bu programda görünmüyor. Başka bir deyişle, yalnızca programın en son enkarnasyonuna yapılan girdilerin görünmesi yasaktır.
  4. Başlığın ne diyebileceğinden bağımsız olarak, standart quine kuralları geçerlidir.

En kısa program kazanır. Program en az bir bayt uzunluğunda olmalıdır.

Örnek

Program ABCD ise. (# bir yorumdur)

> 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

slangiHayali bir dil için tercüman nerede ?


Bu, daha az ayrıntılı dillere meydan okumaz mı? Bazıları öğretim adları için kelimeler kullanır, bu nedenle karakterlerden kaçınmak çok zor ve / veya imkansız olur e.
LegionMammal978

2
İngilizce olmadan yazmak çok zor e, ama Gadsby bunu yapıyor.
Akangka

Hiçbirine fonksiyon almadığını farz ediyorum.
Mama Fun Roll

Yanıtlar:


24

CJam, 45 41 38 35 bayt

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

Giriş karakteri karakterlerden biri değilse "$&)+,/:?HOX\_`el{}, bu program kendisinin biraz değiştirilmiş versiyonunu basar. Çevrimiçi deneyin!

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

Aksi takdirde, program, değişikliğin aşağıdaki karışıklaştırılmış sürümünü yazdırır. Çevrimiçi deneyin!

''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-~

Bazı karakterlerin yazdırılamaz olduğuna dikkat edin. Çevrimiçi deneyin!

Nasıl çalışır

{`"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-~"

İlk olası çıktı programında, ~onu diğer programda kullanabilmek için kullanmaktan kaçınırız . Bu nedenle, _~değiştirilen programın yerine, OX$_?aşağıdaki gibi çalışır.

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

Son olarak, kalan çıktı programında,

''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]

tüm bu karakterleri bir dizide sarar, bu nedenle aşağıdaki dizgiyi iterek.

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

If- dizeyi iterek her karakter kodundan 18 çıkarır

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

hangi ~değerlendirir.


18

JavaScript (ES6), 356 340 327 308 303 263

Şimdi Function`...```ikinci program için kullanılıyor :

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

İşlev, kendisini üç olası programdan birine yerleştirir:

  1. İlk program eval, fonksiyonun kodunu içeren bir karakter dizgesini çağırır ve her karakter sekizlik değer olarak kaçar.

    eval ( '\ 146 \ 165 ...')
  2. İkinci program tarayıcıyı javascript:, her karakter URL'sinin kodlanmış olduğu fonksiyonun kodunu içeren bir URL'ye yönlendirir . Bu, parantez kullanmadan kodu değerlendirmeyi düşünebilmemin tek yoludur. Aynı zamanda 'eval' harflerinden kaçar.

    Pencere [ "\ x6coc \ x61tion"] [ "hr \ x65f"] = "j \ X61 \ x76 \ x61script:% 66% 75 ..."
  3. Son program acı verici bir şekilde uzun. +9-8Her karakter kodunu almak için bir seferde bir ( ) ekleyerek fonksiyonun kodunu oluşturur . Bu, sekizli rakamları kullanmaktan kaçınmak içindir.

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

Doğru program, giriş karakteri için dikkatlice oluşturulmuş bir dize aranarak indekslenir:

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

İşte bir ungolfed, denenmemiş versiyonu. Kaynaktaki yeni satırlar nedeniyle çalışmayabilir.

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()olabilir (f=_=>{ ... })(). İşte bir örnek: es6fiddle.net/iiz2nq0l
Ismael Miguel

Daha da iyisi: f=(_=prompt())=>...;f(). Giriş olarak saklanır _.
Mama Fun Roll

Ayrıca, console.log dosyasına gerek yok, fonksiyon çıkışı iyi.
Mama Fun Roll

Function`[code]`.call``;Yönlendirme yerine sizin için iş kullanmaz mısınız? İşte çalışan bir örnek: es6fiddle.net/ij023v49 (Bakınız? Hayır evil()! Erm, demek istediğim eval()...)
Ismael Miguel

Bugün bir şey öğrendin. Sadece thisnesnenin o boş şablon dizgisinin olacağına dikkat edin. Çalıştırmak Functionyerine bir işlev oluşturmanıza izin veren yapıcıya dayanır eval(). İşlev, ilk parametrede bulunan koda sahip olacaktır. windowKullanarak , gerçeği elde etmek için çok kullanırım Function('return this')(). Eğer kullanamazsınız beri (), ben ES6 en iyilik biraz sen olmadan çalıştırabilirsiniz dair bir kullanışlı fonksiyon tükürmek için denemek için suistimal ettin (). Bunun için .call(), işlevi yeni bir thisnesneyle çağıran yönteme ihtiyacınız vardır .
Ismael Miguel,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.