Help us understand the problem. What is going on with this article?

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 ながーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーい、おつきあい。}

お疲れ様でした。

まとめ

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

acid_chicken
ひねくれたコードを書くことで無名。自分のことを学生だと思い込んでいた 18 歳。
https://acid-chicken.com
justincase
テクノロジーで保険を身近にする保険スタートアップです。
https://justincase.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした