(」・ω・)」うー!(/・ω・)/にゃー!encode
(」・ω・)」うー!(/・ω・)/にゃー!encodeの説明。
(」・ω・)」うー!(/・ω・)/にゃー!encodeは、JavaScriptを(」・ω・)」うー!(/・ω・)/にゃー!に変換する。
alert("(」・ω・)」うー!(/・ω・)/にゃー!")
は、以下のようになる。
使用する文字
JavaScriptには非ASCII文字も使えるけど、意外に厳しくて、記号は使えないし、数字は識別子の先頭には使えない。((全角左括弧)も、」(右鉤括弧)も、・(片仮名中点)も、)(全角右括弧)も使えない。
そこで、代わりに、ᒧ(カナダ先住民族音節のMO)と、ᆞ(古いハングル字母)を使う。/は通常のスラッシュと、〳(くの字点の上半分)。括弧は全て半角の括弧。
基本となる顔文字は、
(ᒧᆞωᆞ).ᒧうー
と、
(〳ᆞωᆞ).〳にゃー 。
JavaScriptとしては、変数 ᒧᆞωᆞ と 〳ᆞωᆞ のプロパティにアクセスしていて、長音符の数や全角半角を変えることで、複数の変数を表せる。
また、[〜] を目立たないようにできるかと思い、
[(ᆞωᆞᒪ)
と、
(コᆞωᆞ)]
を使っている。
事前に、 ᆞωᆞᒪ と コᆞωᆞ は0や空文字列にしている。
スクリプトの実行方法
記号だけのJavaScriptプログラミングの基本原理と記号だけのJavaScriptプログラミングの原理 その2に書いてある。要は、
code = (123)["constructor"]["constructor"]("return '\"+1+0+1+"\"+……+"'"); (123)["constructor"]["constructor"](code)();
を実行すれば良い。
↑の変換後のスクリプトの変数やプロパティの名前を置き換えると、↓のようになる。
_ = /・ω・/, // 正規表現 n0 = -!!/・ω・/.にゃー, // -!!undefined = 0 n1 = - -!n0, // = 1 n2 = n1- -!n0, // = 2 n3 = n2- -n1, // = 3 n4 = n3- -!n0, // = 4 n5 = n4- -n1, // = 5 n6 = n5- -!n0, // = 6 n7 = n6- -n1, // = 7 n8 = n7- -!n0, // = 8 n9 = n8- -n1, // = 9 ー = '', // = "" s_true = !n0+ー, // = "true" s_false = !n1+ー, // = "false" s_object = {這いよれ:!n1}+ー, // = "[object Object]" s_undefined = _.」ニャル子さん+ー,// = "undefined" s_a = s_false[n1], // = "a" s_b = s_object[n2], // = "b" s_c = s_object[n5], // = "c" s_d = s_undefined[n2], // = "d" s_e = s_true[n3], // = "e" s_f = s_false[0], // = "f" s_n = s_undefined[n1], // = "n" s_o = s_object[n1], // = "o" s_r = s_true[n1], // = "r" s_s = s_false[n3], // = "s" s_t = s_true[0], // = "t" s_u = s_undefined[0], // = "u" s_tmp = /""ω""/+/\\ω\\/, // = "/""ω""//\\ω\\" s_quot = s_tmp[n1], // = """ s_bs = s_tmp[n9], // = "\" s_bsu = s_bs+s_u, // = "\u" s_bsu0 = s_bsu+n0+n0, // = "\u00" s_constructor = // = "constructor" s_c+s_o+s_n+s_s+s_t+s_r+s_u+s_c+s_t+s_o+s_r, s_code = // = "return"\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0028\u300d\u30fb\u03c9\u30fb\u0029\u300d\u3046\u30fc\u0021\u0028\u002f\u30fb\u03c9\u30fb\u0029\u002f\u306b\u3083\u30fc\u0021\u0022\u0029"" s_r+s_e+s_t+s_u+s_r+s_n+s_quot+s_bsu0+n6+n1+s_bsu0+n6+s_c+s_bsu0+n6+n5+s_bsu0+n7+n2+s_bsu0+n7+n4+s_bsu0+n2+n8+s_bsu0+n2+n2+s_bsu0+n2+n8+s_bsu+n3+n0+n0+s_d+s_bsu+n3+n0+s_f+s_b+s_bsu+n0+n3+s_c+n9+s_bsu+n3+n0+s_f+s_b+s_bsu0+n2+n9+s_bsu+n3+n0+n0+s_d+s_bsu+n3+n0+n4+n6+s_bsu+n3+n0+s_f+s_c+s_bsu0+n2+n1+s_bsu0+n2+n8+s_bsu0+n2+s_f+s_bsu+n3+n0+s_f+s_b+s_bsu+n0+n3+s_c+n9+s_bsu+n3+n0+s_f+s_b+s_bsu0+n2+n9+s_bsu0+n2+s_f+s_bsu+n3+n0+n6+s_b+s_bsu+n3+n0+n8+n3+s_bsu+n3+n0+s_f+s_c+s_bsu0+n2+n1+s_bsu0+n2+n2+s_bsu0+n2+n9+s_quot, s_constructor = // Function n0[s_constructor][s_constructor], s_code = // = "alert("(」・ω・)」うー!(/・ω・)/にゃー!")" s_constructor(s_code)(0), s_code = // 実行 s_constructor(s_code)(0),