【Javascript】クソコードを憎め！クソコード構築選手権（独り）

#### ※この記事には通常では考えられないような記法が多々登場します
クソコードって見るたびに**イラッ**ときますよね？
ということでその憂さ晴らしで逆にどこまでクソコードかけるかなっていうやつです。
（EsolangでFizzBuzz回です）
# おまけクソコード集
とあるプロジェクト（個人開発）で[タイマー](https://github.com/Nikonosfive/Tabatch/)周りを作っていたんですけど、
天災的にコピペが駆使されていて()
なんかもうすごくて、、、
まあEsolang、CodeGolf勢なんで耐性はあるんですけども
```html
<input type="button" id="start">
<input type="button" id="rap" value="lap">
　　　　　　　　︙
<button id="start_button" onclick="start()">
　　　　　　　　︙
<script>
  startButton = document.getElementById('start');

  let startTime;

  function start() {
    setInterval("updateClock();", 1000);
    updateClock();
    //  document.getElementById("osareta").click();
  }
               ︙
  function start() {
         ︙
  }
```
まあ一から全部書き直させていただいたんですけも、、
# コード
先に今回書いたFizzBuzzのコードを乗せます
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
```javascript
ﾠ=ﾠ=>(ㅤ=ﾠ=>String.fromCharCode(ﾠ))(ᅠ[ᅟ++]),ᅟ=ᅠᅠ=0,ᅠ=[66,70,105,117,122],ᅠᅟ=ﾠ(),ᅟᅠ=ﾠ()+ﾠ(),ᅠ[-ᅟ/ᅟ]=this[ㅤ(ᅠ[ᅠᅠ]/(ᅟ+ᅟ)*ᅟ**--ᅟ)+(ᅠ[ᅠᅟ]=ㅤ(ᅠ[ᅟ]+ᅟ++*ᅟ))+ㅤ(ᅠ[--ᅟ]+ᅟ+++ᅟ)+ㅤ(ᅠ[ᅟ--]-ᅟ)+ᅠ[ᅠᅟ]+(ᅠ[ᅟᅠ]=ㅤ(ᅠ[ᅟ++]+ᅟ))+ㅤ(ᅠ[--ᅟ]-ᅟ-ᅟ++)][ᅠ[ᅟᅠ]+ᅠ[ᅠᅟ]+ㅤ(ᅠ[--ᅟ]-ᅟ++)],ᅠᅟ+=ﾠ(),ᅠᅟ+=ﾠ=(ﾠ=ﾠ())+ﾠ,ᅟᅠ+=ﾠ,ᅠ[ᅟ]=ᅟ/ᅟ,ᅠ[ᅟ+ᅠ[ᅟ]]=ᅟ-ᅠ[ᅟ]-ᅠ[ᅟ],ﾠ=ﾠ=>ᅠᅠ%ﾠ,(ㅤ=()=>{ᅠᅠ+=ᅠ[ᅟ],ᅠ[-ᅟ/ᅟ](ﾠ(ᅠ[ᅟ+ᅠ[ᅟ]]*ᅟ)?ﾠ(ᅠ[ᅟ+ᅠ[ᅟ]])?ﾠ(ᅟ)?ᅠᅠ:ᅠᅟ:ᅟᅠ:ᅟᅠ+ᅠᅟ),ᅠᅠ<ᅠ[ᅠ[ᅟ]+ᅠ[ᅟ]]-ᅟ?ㅤ():ᅟ})()
```
はい。
# 解説
じゃあ解説していきます。
## 変数
まず見たときに**スペース**が多いと思ったことでしょう。
まあ初っ端から`ﾠ=`なんて入っていますので。

なんでこれが成り立っているのかと言うと、

`U+115F:ᅟ`、`U+1160:ᅠ`、`U+3164:ㅤ`、`U+FFA0:ﾠ`
この4つです。
これらは、空白文字の中で"唯四"空白として扱われていない文字です。

変数はすべて、この4字の組み合わせでできています。
このままだと解説に影響が出るので、とりあえず変数名を変えて、整形していきます。
```javascript
a=a=>(b=a=>String.fromCharCode(a))(c[d++]),
d=e=0,
c=[66,70,105,117,122],
f=a(),
g=a()+a(),
c[-d/d]=this[
    b(c[e]/(d+d)*d**--d)+
    (c[f]=b(c[d]+d++*d))+
    b(c[--d]+d+++d)+
    b(c[d--]-d)+
    c[f]+
    (c[g]=b(c[d++]+d))+
    b(c[--d]-d-d++)
][
    c[g]+c[f]+b(c[--d]-d++)
],
f+=a(),
f+=a=(a=a())+a,
g+=a,
c[d]=d/d,
c[d+c[d]]=d-c[d]-c[d],
a=a=>e%a,
(b=()=>{
    e+=c[d],
    c[-d/d](a(c[d+c[d]]*d)?
        a(c[d+c[d]])?
            a(d)?
                e
            :
                f
        :
            g
    :
        g+f
    ),

    e<c[c[d]+c[d]]-d?b():d
})()
```
これはひどい
~~誰だよこんなクソコード書いたやつ~~
実務でこんなコード来たら発狂しますね。
## 1~5行目
```js
a=a=>(b=a=>String.fromCharCode(a))(c[d++]),
d=e=0,
c=[66,70,105,117,122],
f=a(),
g=a()+a(),
```
まず1行目です
変数を使いまわし始められかけています。
はじめに
```js
b = a => String.fromCharCode(a)
```
が行われています。
返り値は
```js
a => String.fromCharCode(a)
```
です。

つぎに
```js
c[d++]
```
が行われます
`c`の`d`番目を参照したあとに`d`をインクリメントしてますね(?)
まあまだそんな変数定義されていないわけですが。

最後に
```js
a = a => (a => String.fromCharCode(a))[c[d]]
```
が行われます。
`fromCharCode`内の`a`は`(a =>`の`a`なので`a = a =>`の2つ目の`a`は一切使われないダミーですね。

2行目と3行目は見たままですね。

4行目と5行目は`a`を実行してるだけです。
`a()`の1回目では`c[d++]`は`c[0]`で`66`、
2回目は`70`、
3回目は`105`なので、
文字はそれぞれ`'B'`、`'F'`、`'i'`、
```js
f = 'B';
g = 'F' + 'i';
```

なので、要するに
```js
a = () => {
    String.fromCharCode(c[d]);
    d++;
};
b = num => {
    String.fromCharCode(num);
};
c = [66,70,105,117,122];
d = 3;
e = 0;
f = 'B'
g = 'Fi'
```
です。

## 6~16行目
```js
c[-d/d]=this[
    b(c[e]/(d+d)*d**--d)+
    (c[f]=b(c[d]+d++*d))+
    b(c[--d]+d+++d)+
    b(c[d--]-d)+
    c[f]+
    (c[g]=b(c[d++]+d))+
    b(c[--d]-d-d++)
][
    c[g]+c[f]+b(c[--d]-d++)
],
```
まず6行目です
これは`c == [66,70,105,117,122]`の`-d/d == -1`個目に右辺を代入します。
ここで留意するべきなのが、
↓
↓
↓
↓
↓
**右から1個目に代入しているわけではなく、c[-1]に代入している点です**
pythonのように高性能ではありません！！（笑）
<sub>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　~~何わろとんねん~~</sub>

つぎは7行目です
```js
b(c[e]/(d+d)*d**--d)
```
`b`は`String.fromCharCode`、
`e`は`0`なので、`c[e]`は`66`になって、
```js
String.fromCharCode(66 / (d+d) * d**(--d))
```
`d`はこの時点では`3`なので、
`(d+d)`は`6`、　`* d`は`3`、　`--d`は`2`になります。
~~終わってますね！~~

なので、`66 / (d+d) * d**(--d)`は`99`になるので、
この行は`'c'`になり、`d = 2`になります。

つぎに8行目です
```js
(c[f]=b(c[d]+d++*d))
```
`f`は`'B'`なので、`c['B']`に代入します。（？？？）
bは`fromCharCode`なので、
```js
c['B'] = String.fromCharCode(c[d] + d++ * d)
```
`d`はこの時点では`2`なので、
`c[d]`は`105`、　`d++`は`2`、　`* d`は`3`になります。

なので、`c[d] + d++ * d`は`111`になるので、
この行は`'o'`になり、`d = 3`になります。

つぎに9行目です
```js
b(c[--d]+d+++d)
```
`d+++d`は`(d++) + d`として処理されるので<sub>（結果は一緒）</sub>
```js
String.fromCharCode(c[--d] + (d++) + d)
```
dはこの時点では`3`なので、
`c[--d]`は`105`、　`d++`は、`2`　`+ d`は`3`になります。

なので、`c[--d]+d+++d`は`110`になるので、
この行は`'n'`になり、`d = 3`になります。

　
これ以上言うこともないので最終的にどうなるかと言うと、
```js
c[-1] = this['console']['log'];
```
です。
ただ`console.log`を代入するためだけにこんなに作業していたんですね。

~~いや直接代入するな~~ 今更っすね
## 17~22行目
```js
f+=a(),
f+=a=(a=a())+a,
g+=a,
c[d]=d/d,
c[d+c[d]]=d-c[d]-c[d],
a=a=>e%a,
```
まず17行目です
`f`に`a()`を足しています。
この時点で`d`は`3`なので`c[d++]`は`117`、`a()`は`'u'`になります
これにより、`f = 'Bu'`になります。

18行目です。
```js
f+=a=(a=a())+a
```
まず、
```js
a = a()
```
が処理されて、
この時点で`d`は`4`なので`c[d++]`は`122`、`a()`は`'z'`になります。
なので`a = 'z'`に、`d = 5`変わります。

このあとに
```js
a = a + a
```
が実行されて、`a = 'zz'`になります。
それが`f`に足されるので、
`f = Buzz`になります。

19行目！
`g`に`a`が足されて
`g = 'Fizz'`になる！！！

　　~~終~~
~~制作・著作~~
━━━━━
　~~ⓃⒽ③~~
　
 
　
20行目です（笑）
```js
c[d]=d/d
```
`d`は`5`なので、`c[5] = 1`になります


21行目です
```js
c[d+c[d]]=d-c[d]-c[d]
```
`d`は`5`、`c[5]`は`1`なので`c[6]`に代入しているようです
`d - c[d] - c[d]`は`5 - 1 - 1`で`3`になるので
`c[6] = 3`となります。

シンガポールに初音ミクを添えて!!!!
やっと22行目です！
```js
a=a=>e%a
```
`e`を割って余りを求める関数をaに入れています。

終わり<sub>たい</sub>
## 23、24行目
おめでとうございます！！
**ここからがmainです！！**
<sub>　　　　　　　　　　　　　　　　　　　　　　　　　　　　結構簡単だけどね(ぼそっ)</sub>
```js
(b=()=>{
    e+=c[d],
```
23行目はそのままです

24行目だっ！！
dはもうずっと固定です。
`e+=c[d]`なので`c[5]`は`1`、`e`をインクリメントしてるだけです。

## 25~35行目、、、!!
```js
c[-d/d](a(c[d+c[d]]*d)?
        a(c[d+c[d]])?
            a(d)?
                e
            :
                f
        :
            g
    :
        g+f
    ),
```
の部分です
`c[-d/d]`は`c[-1]`で`console.log`が入っています。
いったん`if`に書き直します。
```js
if(a(c[d+c[d]]*d)) {
    if(a(c[d+c[d]])) {
        if(a(d)) {
            console.log(e);
        } else {
            console.log(f);
        }
    } else {
        console.log(g);
    }
} else {
     console.log(g + f)
}
```
25~27行目
`a(x)`は`e % x`と同義で、
`d`が`5`で`c[5]`が`1`なことを踏まえると、

`c[d + c[d]]`は`c[5 + 1]`で`c[6]`より`3`
`d`をかけると`15`になるので、
```js
if(e % 15) {           //25
    if(e % 3) {        //26
        if(e % 5) {    //27
           ︙          //28
        } else {       //29
           ︙          //30
        }
    } else {           //31
       ︙              //32
    }
} else {               //33
   ︙                  //34
}                      //35
        
```
となり、
`e % x`は割り切れなかったときに`Truthy`になります。

ということは`15`で割り切れたら1つ目の`if`の`else`が
`15`で割り切れず、`3`で割り切れたら2つ目の`if`の`else`が
`3`で割り切れず、`5`で割り切れたら3つ目の`if`の`else`が
何も割り切れなかったら3つ目の`if`がの上側が実行されます！！

## 28、30、32、34
```js
            console.log(e);
        } else {
            console.log(f);
        }
    } else {
        console.log(g);
    }
} else {
     console.log(g + f)
```
`e`には数字が、`f`には`'Buzz'`が、`g`には`'Fizz'`が入っていて、
`g + f`は`'FizzBuzz'`になります。
##37、38行目！！！ラスト！！
```js
(b=()=>{
        　　　︙
    e<c[c[d]+c[d]]-d?b():d
})()
```
先に、38行目は`b=(){}`で返される関数`b`を実行しています！

37行目！
```js
e<c[c[d]+c[d]]-d?b():d
```
`c[d]`は`c[5]`で`1`
`c[1 + 1]`は`c[2]`で`105`

書き直すと、
```js
e < 105 - 5 ? b() : 5
```
`e < 100`なら`b()`を実行して、そうでないなら5を返す再帰関数！！！！

終わりいいいい！！！！！！！！！！！
# 最後に
**ここまでのご閲読、ありがとうございました！！！**<sub>そしてお疲れ様です！</sub>
タイトル的にも選手権なのでコメントに、、、
明らかにわざとなものでも、
ほんとにあるものでも構わないので！！（露骨な稼ぎ）

<sup>~~企画とかも募集してます！~~</sup><sub>~~↖今回初めてsup使った~~</sub>

じゃあ、さようなら！