Edited at

JS記号プログラミング入門


なんやねんこれ

JavaScriptで記号のみを用いてできるだけ短く英数字を出力する + 記号のみを用いてFizzBuzzをやってみるが少し伸びてたので、もうちょっとまともに解説しようと思ったのが記事のきっかけです。


そもそも記号プログラミングとは

JavaScriptを記号だけで書こうという宗教プログラミングです。

得られるものとしては



  • 読解可能な難読化コードの手動生成技術

  • 冗長化された素晴らしいコード

  • 謎の感動

  • 狂気

と言ったものが挙げられます。


制約

具体的なルールは以下の通りです。


0x20 - 0x21


 
!


0x22 - 0x26


"
#
$
%
&


0x27 - 0x2f


'
(
)
*
+
,
-
.
/


0x3a - 0x40


:
;
<
=
>
?
@


0x5b - 0x60


[
\
]
^
_
`


0x7b - 0x7e


{
|
}
~


テクニック

では早速記号プログラミングを始めましょう!


  1. about:blankを開き、


  2. Ctrl + Shift + K (macOS: ⌘⌥K) を押下し、

  3. コンソールにフォーカスが入れば準備完了!


基礎編

記号プログラミングでは[]が多用されます。これは配列リテラルと呼ばれるもので、非常に活用しやすいのが特徴です。使用例を以下に記述します。


Array

[] // Array []



Boolean

 ![] // false

!![] // true


undefined

[][[]] // undefined



Number

    +[] // 0

-[] // -0
~[] // -1
-~[] // 1
~-~[] // -2
-~-~[] // 2
[]/[] // NaN
~[]/[] // -Infinity
-~[]/[] // Infinity


String

  []+[] // ""

![]+[] // "false"
!![]+[] // "true"

ね?簡単でしょう?JavaScriptは弱い動的型付け言語なので、このような様々な表記で多様な値に様変わりします。

また、任意の値に配列を加算するような書き方をすると、その値はString型になります。これは全てのString型がString型の配列とも解釈できることに起因するものです。


基本編

では、入門編で生成したオブジェクトから様々な文字列を獲得してみましょう。


false

 ![]+[]          // "false"

(![]+[])[+[]] // "f"
(![]+[])[-~[]] // "a"
(![]+[])[-~-~[]] // "l"
(![]+[])[-~-~-~[]] // "s"
(![]+[])[-~-~-~-~[]] // "e"


true

 !![]+[]         // "true"

(!![]+[])[+[]] // "t"
(!![]+[])[-~[]] // "r"
(!![]+[])[-~-~[]] // "u"
(!![]+[])[-~-~-~[]] // "e"


undefined

 [][[]]+[]    // "undefined"

([][[]]+[])[+[]] // "u"
([][[]]+[])[-~[]] // "n"
([][[]]+[])[-~-~[]] // "d"
([][[]]+[])[-~-~-~[]] // "e"
([][[]]+[])[-~-~-~-~[]] // "f"
([][[]]+[])[-~-~-~-~-~[]] // "i"
([][[]]+[])[-~-~-~-~-~-~[]] // "n"
([][[]]+[])[-~-~-~-~-~-~-~[]] // "e"
([][[]]+[])[~-~-~-~-[]*~-~[]] // "d"


NaN

 []/[]+[]        // "NaN"

([]/[]+[])[+[]] // "N"
([]/[]+[])[-~[]] // "a"
([]/[]+[])[-~-~[]] // "N"


Infinity

 -~[]/[]+[]             // "Infinity"

(-~[]/[]+[])[+[]] // "I"
(-~[]/[]+[])[-~[]] // "n"
(-~[]/[]+[])[-~-~[]] // "f"
(-~[]/[]+[])[-~-~-~[]] // "i"
(-~[]/[]+[])[-~-~-~-~[]] // "n"
(-~[]/[]+[])[-~-~-~-~-~[]] // "i"
(-~[]/[]+[])[-~-~-~-~-~-~[]] // "t"
(-~[]/[]+[])[-~-~-~-~-~-~-~[]] // "y"

そして空のオブジェクトからこんなものも採取できます。


[object Object]

/* Don't write "{}+[]". It's not working! */

[]+{} // "[object Object]"
([]+{})[+[]] // "["
([]+{})[-~[]] // "o"
([]+{})[-~-~[]] // "b"
([]+{})[-~-~-~[]] // "j"
([]+{})[-~-~-~-~[]] // "e"
([]+{})[-~-~-~-~-~[]] // "c"
([]+{})[-~-~-~-~-~-~[]] // "t"
([]+{})[-~-~-~-~-~-~-~[]] // " "
([]+{})[~-~-~-~-[]*~-~[]] // "O"
([]+{})[~-~-~[]*~-~-~[]] // "b"
([]+{})[~-~-~-~-~[]*~-~[]] // "j"
([]+{})[(-~-~-~[]<<-~-~[])+~[]] // "e"
([]+{})[-~-~-~[]<<-~-~[]] // "c"
([]+{})[(-~-~-~[]<<-~-~[])-~[]] // "t"
([]+{})[~-~-~-~-~-~-~[]*~-~[]] // "]"

さらにビルトイン関数を呼び出しましょう。Firefoxでは全てこのような出力になります。


native code

$+[]

/*
"function () {
[native code]
}"
*/

$$+[]
/*
"function () {
[native code]
}"
*/

$_+[]
/*
"function () {
[native code]
}"
*/


長すぎるので文字列の分解は省略しますが、この文字列には改行文字も含まれることを忘れないようにしましょう。また、jQueryでは$が上書きされるため、下2つの内何れかの表記する必要があります。


応用編

基本編の段階ではまだまだ扱える文字が少ないので、この限られた文字から様々なオブジェクトを生成しましょう。

幸い現時点で次の文字を並べることができます。

'c' // "[object Object]"

+ // |~~~~~^ [5]
'o' // "[object Object]"
+ // |~^ [1]
'n' // "function () {\n [native code]\n}"
+ // |~~^ [2]
's' // "false"
+ // |~~~^ [3]
't' // "true"
+ // |^ [0]
'r' // "true"
+ // |~^ [1]
'u' // "undefined"
+ // |^ [0]
'c' // "[object Object]"
+ // |~~~~~^ [5]
't' // "true"
+ // |^ [0]
'o' // "[object Object]"
+ // |~^ [1]
'r' // "true"
// |~^ [1]

ここでなぜ'constructor'などという文字列を生成しているかというと、次のようなことができるようになるからです。

[]['constructor']

/*
"function Array() {
[native code]
}"
*/

(![])['constructor']+[]
/*
"function Boolean() {
[native code]
}"
*/

(+[])['constructor']+[]
/*
"function Number() {
[native code]
}"
*/

([]+[])['constructor']+[]
/*
"function String() {
[native code]
}"
*/

({})['constructor']+[]
/*
"function Object() {
[native code]
}"
*/

/ /['constructor']+[]
/*
"function RegExp() {
[native code]
}"
*/

[]['constructor']['constructor']
/*
"function Function() {
[native code]
}"
*/

なんということでしょう、先程まで数少なかった文字列のレパートリーが、constructorの手によってこんなにも増えました。

(正規表現の部分、ハイライトがおかしいですが、正しく動作します。)

この奇跡は記号に直すとこうなります。

/*c*/ ([]+{})[-~-~-~-~-~[]]

+
/*o*/ ([]+{})[-~[]]
+
/*n*/ ($+[])[-~-~[]]
+
/*s*/ (![]+[])[-~-~-~[]]
+
/*t*/ (!![]+[])[+[]]
+
/*r*/ (!![]+[])[-~[]]
+
/*u*/ ([][[]]+[])[+[]]
+
/*c*/ ([]+{})[-~-~-~-~-~[]]
+
/*t*/ (!![]+[])[+[]]
+
/*o*/ ([]+{})[-~[]]
+
/*r*/ (!![]+[])[-~[]]

つまり、このように書けば

(

[]
[
([]+{})[-~-~-~-~-~[]]+
([]+{})[-~[]]+
($+[])[-~-~[]]+
(![]+[])[-~-~-~[]]+
(!![]+[])[+[]]+
(!![]+[])[-~[]]+
([][[]]+[])[+[]]+
([]+{})[-~-~-~-~-~[]]+
(!![]+[])[+[]]+
([]+{})[-~[]]+
(!![]+[])[-~[]]
]+
[]
)
[~-~-~[]*~-~-~[]] // "A"

といった文字が使えるようになるわけです。JavaScriptの奇跡に圧倒的感謝:pray::pray::pray:


発展編

まだまだ扱える文字は不完全です。この章では応用編でさえも獲得できなかった文字列をすべて埋めていきます。

JavaScriptでは、次のようなコードでUnicode文字コードから任意のアルファベットなどを生成できます。

'\u0068' // "h"

これを関数化し

(() => '\u0068')() // "h"

こうすると

new Function('return "\u0068"')() // "h"

こうなり

Function['constructor']('return "\u0068"')()

さらにこうなり

[]['constructor']['constructor']('return "\u0068"')()

最後にこうなります。

この時点で全ての記号でない部分が文字列になりました。

さて、お待ちかねの記号化のお時間です。

[]

[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
-~-~-~-~-~-~[]+ // "6"
-~-~-~-~-~-~-~-~[]+ // "8"
(/"/+[])[-~[]] // "\""
)
() // "h"

これでめでたく全ての文字を参照することができるようになりました!


実用編

もうFizzBuzzは面倒なのでやりません。そもそも実用編なら実用できそうなコードを書くべきですよね。

ということで、この記事をいいねしてくれた人を取得するコードを書こうと思います。

(

async () => {
try {(
await (
await fetch('https://qiita.com/api/v2/items/eeb0b42a1ecbba0c49e3/likes')
).json()
).map(x =>
console.log(x.user.id)
)} catch (e) {
console.error(e)
}
}
)()

ざっとこんなところでしょうか。

これを記号部分以外全て文字列にすると

[]['constructor']['constructor'](

'('+
'async()=>{'+
'try{('+
'await('+
'await fetch("https://qiita.com/api/v2/items/eeb0b42a1ecbba0c49e3/likes")'+
').json()'+
').map(x=>'+
'console.log(x.user.id)'+
')}catch(e){'+
'console.error(e)'+
'}'+
'}'+
')()'
)()

こうなr…ずるいですね。こういうのはタブーです。

ということでまず既存のコードに懐かしの風味を加えましょう。

fetch('https://qiita.com/api/v2/items/eeb0b42a1ecbba0c49e3/likes'

).then(new Function('u',
'u.json()'+
'.then(new Function("u",'+
'"u.map(new Function(\'u\','+
'\'console.log(u.user.id)\''+
'))"'+
'))'
)).catch(new Function('u',
'console.error(u)'
))

これが限界か…ダメだ!これだからFetch APIはけしからん!

ならばXMLHttpRequestを用意して…

_=[]['constructor']['constructor']('return this')()['XMLHttpRequest']['constructor']();

_['open']('GET','https://qiita.com/api/v2/items/eeb0b42a1ecbba0c49e3/likes',false);
_['send']([]['constructor']['constructor']('return this')()['document']['parentNode']);
_['status']==200&&[]['constructor']['constructor']('return this')()['JSON']['parse'](_['responseText'])['reduce']([]['constructor']['constructor']('f','u','N','f[N]=u'),[])

:warning: TypeError: _.open is not a function

おっと、一体どういうことでしょうか。

:warning: TypeError: Constructor XMLHttpRequest requires 'new'

困りましたね…XMLHttpRequestはnewを使わないとコンストラクタが作れないみたいです。しかしnewは記号ではないので使うことができません。

ならばとても古典的な方法にかけてみるしかなさそうですね…

__=[]['constructor']['constructor']('u','u["map"]([]["constructor"]["constructor"]("u","[][`constructor`][`constructor`](`return this`)()[`console`][`log`](u.user.id)"))');

_=[]['constructor']['constructor']('return this')()['document']['createElement']('script');
_['src']='https://qiita.com/api/v2/items/eeb0b42a1ecbba0c49e3/likes?callback=__';
_['onload']=[]['constructor']['constructor']('_["remove"]()');
[]['constructor']['constructor']('return this')()['document']['body']['appendChild'](_)

残念!Qiita APIはJSONPに対応していませんでした。

仕方なくFetch APIで記号プログラミングすることにしましょう。

_=[]['constructor']['constructor']('return this');

__=[]['constructor']['constructor']('u','_()["console"]["log"](u["user"])');
___=[]['constructor']['constructor']('u','u["map"](__)');
____=[]['constructor']['constructor']('u','u["json"]()["then"](___)');
(_())
['fetch']('https://qiita.com/api/v2/items/eeb0b42a1ecbba0c49e3/likes')
['then'](____)
['catch'](__)

こんな感じですか。

さてではこれを記号にしましょう。

_=[]

[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(!![]+[])[+[]]+ // "t"
[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
~-~-~[]*~-~[]+ // "6"
~-~-~-~[]*~-~[]+ // "8"
(/"/+[])[-~[]] // "\""
)
()+ // "h"
(-~[]/[]+[])[-~-~-~[]]+ // "i"
(![]+[])[-~-~-~[]] // "s"
);
__=[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
([][[]]+[])[+[]], // "u"
(/_/+[])[-~[]]+ // "_"
(/\(/+[])[-~-~[]]+ // "("
(/\)/+[])[-~-~[]]+ // ")"
(/\[/+[])[-~-~[]]+ // "["
(/"/+[])[-~[]]+ // "\""
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
([]+{})[-~[]]+ // "o"
(![]+[])[-~-~[]]+ // "l"
(!![]+[])[-~-~-~[]]+ // "e"
(/"/+[])[-~[]]+ // "\""
(/\]/+[])[-~-~[]]+ // "]"
(/\[/+[])[-~-~[]]+ // "["
(/"/+[])[-~[]]+ // "\""
(![]+[])[-~-~[]]+ // "l"
([]+{})[-~[]]+ // "o"
(
/ /
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]+
[]
)
[(-~-~-~[]<<-~-~[])+~[]]+ // "g"
(/"/+[])[-~[]]+ // "\""
(/\]/+[])[-~-~[]]+ // "]"
(/\(/+[])[-~-~[]]+ // "("
([][[]]+[])[+[]]+ // "u"
(/\[/+[])[-~-~[]]+ // "["
(/"/+[])[-~[]]+ // "\""
([][[]]+[])[+[]]+ // "u"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[-~[]]+ // "r"
(/"/+[])[-~[]]+ // "\""
(/\]/+[])[-~-~[]]+ // "]"
(/\)/+[])[-~-~[]] // ")"
);
___=[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
([][[]]+[])[+[]], // "u"
([][[]]+[])[+[]]+ // "u"
(/\[/+[])[-~-~[]]+ // "["
(/"/+[])[-~[]]+ // "\""
(
(+[])
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]+
[]
)
[(-~-~-~[]<<-~-~[])+~[]]+ // "m"
(![]+[])[-~[]]+ // "a"
(
/ /
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]+
[]
)
[~-~-~-~-~-~-~[]*~-~[]]+ // "p"
(/"/+[])[-~[]]+ // "\""
(/\]/+[])[-~-~[]]+ // "]"
(/\(/+[])[-~-~[]]+ // "("
(/_/+[])[-~[]]+ // "_"
(/_/+[])[-~[]]+ // "_"
(/\)/+[])[-~-~[]] // ")"
);
____=[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
([][[]]+[])[+[]], // "u"
([][[]]+[])[+[]]+ // "u"
(/\[/+[])[-~-~[]]+ // "["
(/"/+[])[-~[]]+ // "\""
([]+{})[-~-~-~[]]+ // "j"
(![]+[])[-~-~-~[]]+ // "s"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(/"/+[])[-~[]]+ // "\""
(/\]/+[])[-~-~[]]+ // "]"
(/\(/+[])[-~-~[]]+ // "("
(/\)/+[])[-~-~[]]+ // ")"
(/\[/+[])[-~-~[]]+ // "["
(/"/+[])[-~[]]+ // "\""
(!![]+[])[+[]]+ // "t"
[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
~-~-~[]*~-~[]+ // "6"
~-~-~-~[]*~-~[]+ // "8"
(/"/+[])[-~[]] // "\""
)
()+ // "h"
(!![]+[])[-~-~-~[]]+ // "e"
($+[])[-~-~[]]+ // "n"
(/"/+[])[-~[]]+ // "\""
(/\]/+[])[-~-~[]]+ // "]"
(/\(/+[])[-~-~[]]+ // "("
(/_/+[])[-~[]]+ // "_"
(/_/+[])[-~[]]+ // "_"
(/_/+[])[-~[]]+ // "_"
(/\)/+[])[-~-~[]] // ")"
);
(_())
[
(![]+[])[+[]]+ // "f"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([]+{})[-~-~-~-~-~[]]+ // "c"
[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
~-~-~[]*~-~[]+ // "6"
~-~-~-~[]*~-~[]+ // "8"
(/"/+[])[-~[]] // "\""
)
() // "h"
]
(
[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
~-~-~[]*~-~[]+ // "6"
~-~-~-~[]*~-~[]+ // "8"
(/"/+[])[-~[]] // "\""
)
()+ // "h"
(!![]+[])[+[]]+ // "t"
(!![]+[])[+[]]+ // "t"
(
/ /
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]+
[]
)
[~-~-~-~-~-~-~[]*~-~[]]+ // "p"
(![]+[])[-~-~-~[]]+ // "s"
(/:/+[])[-~[]]+ // ":"
(/\//+[])[-~-~[]]+ // "/"
(/\//+[])[-~-~[]]+ // "/"
[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
-~-~-~-~-~-~-~[]+ // "7"
-~[]+ // "1"
(/"/+[])[-~[]] // "\""
)
()+ // "q"
(-~[]/[]+[])[-~-~-~[]]+ // "i"
(-~[]/[]+[])[-~-~-~[]]+ // "i"
(!![]+[])[+[]]+ // "t"
(![]+[])[-~[]]+ // "a"
(/./+[])[-~[]]+ // "."
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
(
(+[])
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]+
[]
)
[(-~-~-~[]<<-~-~[])+~[]]+ // "m"
(/\//+[])[-~-~[]]+ // "/"
(![]+[])[-~[]]+ // "a"
(
/ /
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]+
[]
)
[~-~-~-~-~-~-~[]*~-~[]]+ // "p"
(-~[]/[]+[])[-~-~-~[]]+ // "i"
(/\//+[])[-~-~[]]+ // "/"
($+[])[~(~[]+~[]+~[]<<-~-~-~[])]+ // "v"
-~-~[]+ // "2"
(/\//+[])[-~-~[]]+ // "/"
(-~[]/[]+[])[-~-~-~[]]+ // "i"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~-~-~[]]+ // "e"
(
(+[])
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]+
[]
)
[(-~-~-~[]<<-~-~[])+~[]]+ // "m"
(![]+[])[-~-~-~[]]+ // "s"
(/\//+[])[-~-~[]]+ // "/"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[-~-~-~[]]+ // "e"
([]+{})[-~-~[]]+ // "b"
-[]+ // "0"
([]+{})[-~-~[]]+ // "b"
-~-~-~-~[]+ // "4"
-~-~[]+ // "2"
(![]+[])[-~[]]+ // "a"
-~[]+ // "1"
(!![]+[])[-~-~-~[]]+ // "e"
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~-~[]]+ // "b"
([]+{})[-~-~[]]+ // "b"
(![]+[])[-~[]]+ // "a"
-[]+ // "0"
([]+{})[-~-~-~-~-~[]]+ // "c"
-~-~-~-~[]+ // "4"
~-~-~[]*~-~-~[]+ // "9"
(!![]+[])[-~-~-~[]]+ // "e"
-~-~-~[]+ // "3"
(/\//+[])[-~-~[]]+ // "/"
(![]+[])[-~-~[]]+ // "l"
(-~[]/[]+[])[-~-~-~[]]+ // "i"
[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
-~-~-~-~-~-~[]+ // "6"
([]+{})[-~-~[]]+ // "b"
(/"/+[])[-~[]] // "\""
)
()+ // "k"
(!![]+[])[-~-~-~[]]+ // "e"
(![]+[])[-~-~-~[]] // "s"
)
[
(!![]+[])[+[]]+ // "t"
[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
~-~-~[]*~-~[]+ // "6"
~-~-~-~[]*~-~[]+ // "8"
(/"/+[])[-~[]] // "\""
)
()+ // "h"
(!![]+[])[-~-~-~[]]+ // "e"
($+[])[-~-~[]] // "n"
]
(____)
[
([]+{})[-~-~-~-~-~[]]+ // "c"
(![]+[])[-~[]]+ // "a"
(!![]+[])[+[]]+ // "t"
([]+{})[-~-~-~-~-~[]]+ // "c"
[]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
[
([]+{})[-~-~-~-~-~[]]+ // "c"
([]+{})[-~[]]+ // "o"
($+[])[-~-~[]]+ // "n"
(![]+[])[-~-~-~[]]+ // "s"
(!![]+[])[+[]]+ // "t"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[+[]]+ // "u"
([]+{})[-~-~-~-~-~[]]+ // "c"
(!![]+[])[+[]]+ // "t"
([]+{})[-~[]]+ // "o"
(!![]+[])[-~[]] // "r"
]
(
(!![]+[])[-~[]]+ // "r"
(!![]+[])[-~-~-~[]]+ // "e"
(!![]+[])[+[]]+ // "t"
([][[]]+[])[+[]]+ // "u"
(!![]+[])[-~[]]+ // "r"
([][[]]+[])[-~[]]+ // "n"
(/ /+[])[-~[]]+ // " "
(/"/+[])[-~[]]+ // "\""
(/\\/+[])[-~[]]+ // "\\"
([][[]]+[])[+[]]+ // "u"
-[]+ // "0"
-[]+ // "0"
~-~-~[]*~-~[]+ // "6"
~-~-~-~[]*~-~[]+ // "8"
(/"/+[])[-~[]] // "\""
)
() // "h"
]
(__)

{\scriptstyle ながーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーい、おつきあい。}

お疲れ様でした。


まとめ

記号プログラミングはいいぞ。