SORU
23 Mart 2014, Pazar


Nasıl bu sihirli Javascript çalışır?

Bu uyarı küçük bir javascript "Merhaba Dünya":

゚ω゚ノ=/`m´)ノ~┻━┻//*´∇`*/['_'];o=(゚ー゚)=_=3;c=(゚Θ゚)=(゚ー゚)-(゚ー゚);(゚Д゚)=(゚Θ゚)=(o^_^o)/(o^_^o);(゚Д゚)={゚Θ゚:'_',゚ω゚ノ:((゚ω゚ノ==3) '_')[゚Θ゚],゚ー゚ノ:(゚ω゚ノ '_')[o^_^o-(゚Θ゚)],゚Д゚ノ:((゚ー゚==3) '_')[゚ー゚]};(゚Д゚)[゚Θ゚]=((゚ω゚ノ==3) '_')[c^_^o];(゚Д゚)['c']=((゚Д゚) '_')[(゚ー゚) (゚ー゚)-(゚Θ゚)];(゚Д゚)['o']=((゚Д゚) '_')[゚Θ゚];(゚o゚)=(゚Д゚)['c'] (゚Д゚)['o'] (゚ω゚ノ '_')[゚Θ゚] ((゚ω゚ノ==3) '_')[゚ー゚] ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] ((゚ー゚==3) '_')[゚Θ゚] ((゚ー゚==3) '_')[(゚ー゚)-(゚Θ゚)] (゚Д゚)['c'] ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] (゚Д゚)['o'] ((゚ー゚==3) '_')[゚Θ゚];(゚Д゚)['_']=(o^_^o)[゚o゚][゚o゚];(゚ε゚)=((゚ー゚==3) '_')[゚Θ゚] (゚Д゚).゚Д゚ノ ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] ((゚ー゚==3) '_')[o^_^o-゚Θ゚] ((゚ー゚==3) '_')[゚Θ゚] (゚ω゚ノ '_')[゚Θ゚];(゚ー゚) =(゚Θ゚);(゚Д゚)[゚ε゚]='\\';(゚Д゚).゚Θ゚ノ=(゚Д゚ ゚ー゚)[o^_^o-(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ '_')[c^_^o];(゚Д゚)[゚o゚]='\"';(゚Д゚)['_']((゚Д゚)['_'](゚ε゚ (゚Д゚)[゚o゚] (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) (゚Θ゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) ((゚ー゚) (゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) (゚ー゚) (゚Д゚)[゚ε゚] ((゚ー゚) (゚Θ゚)) (c^_^o) (゚Д゚)[゚ε゚] (゚ー゚) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) (゚Θ゚) (c^_^o) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) ((゚ー゚) (゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚ー゚) (c^_^o) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o)-(゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) (゚ー゚) (゚Д゚)[゚ε゚] (゚ー゚) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] ((゚ー゚) (゚Θ゚)) (゚Θ゚) (゚Д゚)[゚o゚])(゚Θ゚))('_');

İyi görünümlü bir versiyonu:

゚ω゚ノ = /`m´)ノ~┻━┻//*´∇`*/['_'];
o = (゚ー゚) = _ = 3;
c = (゚Θ゚) = (゚ー゚) - (゚ー゚);
(゚Д゚) = (゚Θ゚) = (o^_^o)/(o^_^o);
(゚Д゚) = {
  ゚Θ゚:  '_',
  ゚ω゚ノ: ((゚ω゚ノ==3) '_')[゚Θ゚],
  ゚ー゚ノ: (゚ω゚ノ '_')[o^_^o-(゚Θ゚)],
  ゚Д゚ノ: ((゚ー゚==3) '_')[゚ー゚]
};
(゚Д゚)[゚Θ゚] = ((゚ω゚ノ==3) '_')[c^_^o];
(゚Д゚)['c'] = ((゚Д゚) '_')[(゚ー゚) (゚ー゚)-(゚Θ゚)];
(゚Д゚)['o'] = ((゚Д゚) '_')[゚Θ゚];
(゚o゚)=(゚Д゚)['c']   (゚Д゚)['o']   (゚ω゚ノ   '_')[゚Θ゚]   ((゚ω゚ノ==3)   '_')[゚ー゚]   ((゚Д゚)   '_')[(゚ー゚)   (゚ー゚)]   ((゚ー゚==3)   '_')[゚Θ゚]   ((゚ー゚==3)   '_')[(゚ー゚) - (゚Θ゚)]   (゚Д゚)['c']   ((゚Д゚)   '_')[(゚ー゚)   (゚ー゚)]   (゚Д゚)['o']   ((゚ー゚==3)   '_')[゚Θ゚];
(゚Д゚)['_'] = (o^_^o)[゚o゚][゚o゚];
(゚ε゚) = ((゚ー゚==3)   '_')[゚Θ゚]   (゚Д゚).゚Д゚ノ   ((゚Д゚)   '_')[(゚ー゚)   (゚ー゚)]   ((゚ー゚==3)   '_')[o^_^o-゚Θ゚]   ((゚ー゚==3)   '_')[゚Θ゚]   (゚ω゚ノ '_')[゚Θ゚];
(゚ー゚)  = (゚Θ゚);
(゚Д゚)[゚ε゚] = '\\';
(゚Д゚).゚Θ゚ノ = (゚Д゚ ゚ー゚)[o^_^o-(゚Θ゚)];
(o゚ー゚o) = (゚ω゚ノ '_')[c^_^o];
(゚Д゚)[゚o゚] = '\"';
(゚Д゚)['_']((゚Д゚)['_'](゚ε゚ (゚Д゚)[゚o゚] (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) (゚Θ゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) ((゚ー゚) (゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) (゚ー゚) (゚Д゚)[゚ε゚] ((゚ー゚) (゚Θ゚)) (c^_^o) (゚Д゚)[゚ε゚] (゚ー゚) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) (゚Θ゚) (c^_^o) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) ((゚ー゚) (゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚ー゚) (c^_^o) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o)-(゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) (゚ー゚) (゚Д゚)[゚ε゚] (゚ー゚) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] ((゚ー゚) (゚Θ゚)) (゚Θ゚) (゚Д゚)[゚o゚])(゚Θ゚))('_');

JSFiddle

Buradan alındı: http://codegolf.stackexchange.com/a/24041/17049

Herkes nasıl çalıştığı hakkında bir fikrin var mı? Hatta bu kodu alert göremiyorum.

CEVAP
23 Mart 2014, Pazar


Kodu daha yakından bakmadan önce, JavaScript beri 1.5 identifiers sadece ASCII karakterler ama aynı zamanda Unicode karakter içeren izin verilir.

Bu durumda bu komik dizileri çok göreceli. Basit tanımlayıcılar tarafından bu mübadele edilmesini ve gereksiz yorum ve parantez çıkardıktan sonra, kodu aşağıdaki gibi görünüyor

a = /`m´)ノ~┻━┻/['_'];
o = b = _ = 3;
c = d = b-b;
e = d = o^_^o/o^_^o;
e = {
  d: '_',
  a: ((a==3) '_')[d],
  h: (a '_')[o^_^o-d],
  i: ((b==3) '_')[b]
};
e[d]   = ((a==3) '_')[c^_^o];
e['c'] = (e '_')[b b-d];
e['o'] = (e '_')[d];
f      = e['c'] e['o'] (a '_')[d] ((a==3) '_')[b] (e '_')[b b] ((b==3) '_')[d] ((b==3) '_')[b-d] e['c'] (e '_')[b b] e['o'] ((b==3) '_')[d];
e['_'] = (o^_^o)[f][f];
g      = ((b==3) '_')[d] e.i (e '_')[b b] ((b==3) '_')[o^_^o-d] ((b==3) '_')[d] (a '_')[d];
b       = d;
e[g]   = '\\';
e.j    = (e b)[o^_^o-d];
obo    = (a '_')[c^_^o];
e[f]   = '\"';
e['_'](e['_'](g e[f] e[g] d b d e[g] d (b d) b e[g] d b (b d) e[g] d ((o^_^o) (o^_^o)) ((o^_^o)-d) e[g] d ((o^_^o) (o^_^o)) b e[g] (b d) (c^_^o) e[g] b ((o^_^o)-d) e[g] d d (c^_^o) e[g] d b (b d) e[g] d (b d) b e[g] d (b d) b e[g] d (b d) (b (o^_^o)) e[g] b (c^_^o) e[g] d ((o^_^o)-d) (b (o^_^o)) e[g] d (b d) (b (o^_^o)) e[g] d ((o^_^o) (o^_^o)) ((o^_^o)-d) e[g] d (b d) b e[g] d b b e[g] b ((o^_^o)-d) e[g] (b d) d e[f])(d))('_');

Şimdi bir anda her deyim değerlendirebilir ediyoruz:

  • a = /`m´)ノ~┻━┻/['_'] 22* *olarak değerlendirir
  • o = b = _ = 3 o, b _ tamsayı 3 atar
  • c = d = b-b c d tamsayı 0 atar
  • e = d = o^_^o/o^_^o e d tamsayı 1 (o^_^o 3 3 veren 3, 3 XOR XOR sonucunu verir
  • e = { d: '_', a: ((a==3) '_')[d], h: (a '_')[o^_^o-d], i: ((b==3) '_')[b] } e nesne { d: '_', a: 'a', h: 'd', i: 'e' } atar
  • e[d] = ((a==3) '_')[c^_^o] e[1] dize 'f' atar
  • e['c'] = (e '_')[b b-d] e['c'] dize 'c' atar
  • e['o'] = (e '_')[d] e['o'] dize 'o' atar

Bu sadece kur ve aşağıdaki değişkenleri ayarlanır:

a = undefined
b = 3
c = 0
d = 1
e = {
    1: "f",
    a: "a",
    c: "c",
    d: "_",
    h: "d",
    i: "e",
    o: "o"
}

Sonraki deyimi bir şey inşa ilk

f = e['c']               // => "c"
    e['o']               // => "o"
    (a '_')[d]           // => "undefined_"[1] = "n"
    ((a==3) '_')[b]      // => "false_"[3]     = "s"
    (e '_')[b b]         // => "object_"[6]    = "t"
    ((b==3) '_')[d]      // => "true_"[1]      = "r"
    ((b==3) '_')[b-d]    // => "true_"[2]      = "s"
    e['c']               // => "c"
    (e '_')[b b]         // => "object_"[6]    = "t"
    e['o']               // => "o"
    ((b==3) '_')[d];     // => "true"[1]       = "r"

f = "constructor". Bir sonraki açıklamada "constructor" bu işlevi almak için kullanılır:

e['_'] = (o^_^o)[f][f]

Bu function Function, yani: veren (3).constructor.constructor eşdeğer

e['_'] = Function

Function bu fonksiyonu parametre) fonksiyonu vücut kodu geçerek fonksiyonları dinamik olarak inşa tek özel

f = Function("alert(1)")
// equivalent to
f = function() { alert(1) }

Önümüzdeki birkaç ifadeleri atlamak ve sonuç değişkenleri ve değerleri yazacağım:

a = undefined
b = 4
c = 0
d = 1
e = {
    1: "f",
    _: Function,
    a: "a",
    c: "c",
    constructor: "\"",
    d: "_",
    h: "d",
    i: "e",
    j: "b",
    o: "o",
    return: "\\"
}
f = "constructor"
obo = "u"

Son açıklama son çalışır:

e['_'](e['_'](g e[f] e[g] d b d e[g] d (b d) b e[g] d b (b d) e[g] d ((o^_^o) (o^_^o)) ((o^_^o)-d) e[g] d ((o^_^o) (o^_^o)) b e[g] (b d) (c^_^o) e[g] b ((o^_^o)-d) e[g] d d (c^_^o) e[g] d b (b d) e[g] d (b d) b e[g] d (b d) b e[g] d (b d) (b (o^_^o)) e[g] b (c^_^o) e[g] d ((o^_^o)-d) (b (o^_^o)) e[g] d (b d) (b (o^_^o)) e[g] d ((o^_^o) (o^_^o)) ((o^_^o)-d) e[g] d (b d) b e[g] d b b e[g] b ((o^_^o)-d) e[g] (b d) d e[f])(d))('_');

Bu eşdeğerdir:

Function(Function( … )(1))('_')

Uzun ifade, aşağıdaki dize oluşturur:

return"\141\154\145\162\164\50\42\110\145\154\154\157\40\127\157\162\154\144\42\51"

Atlamalı dize değerlendirir:

alert("Hello World")

return bu kod gibi isimsiz bir işlev yaratır Function geçti

function anonymous() {
    return"\141\154\145\162\164\50\42\110\145\154\154\157\40\127\157\162\154\144\42\51";
}

Biliyoruz, eşdeğerdir:

function anonymous() {
    return"alert(\"Hello World\")";
}

Bu işlev, daha sonra oluşan bir dize döndürür parametre olarak 1 ile yürütülür:

alert("Hello World")

Bu daha sonra Function yeni bir anonim işlev oluşturur: bir daha geçti

function anonymous() {
    alert("Hello World");
}

Son olarak, bu fonksiyon da parametre olarak '_' ile çağrılır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Saquet

    Caroline Saq

    1 EKİM 2011
  • Elefant Traks

    Elefant Trak

    5 HAZİRAN 2007
  • Shon Gonzales

    Shon Gonzale

    5 EKİM 2014