LoginSignup
1
2

【Javascript】クソコードを憎め!クソコード構築選手権(独り)

Posted at

※この記事には通常では考えられないような記法が多々登場します

クソコードって見るたびにイラッときますよね?
ということでその憂さ晴らしで逆にどこまでクソコードかけるかなっていうやつです。
(EsolangでFizzBuzz回です)

おまけクソコード集

とあるプロジェクト(個人開発)でタイマー周りを作っていたんですけど、
天災的にコピペが駆使されていて()
なんかもうすごくて、、、
まあEsolang、CodeGolf勢なんで耐性はあるんですけども

<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のコードを乗せます












==>(==>String.fromCharCode())([++]),=ᅠᅠ=0,=[66,70,105,117,122],ᅠᅟ=(),ᅟᅠ=()+(),[-/]=this[([ᅠᅠ]/(+)***--)+([ᅠᅟ]=([]+++*))+([--]++++)+([--]-)+[ᅠᅟ]+([ᅟᅠ]=([++]+))+([--]--++)][[ᅟᅠ]+[ᅠᅟ]+([--]-++)],ᅠᅟ+=(),ᅠᅟ+==(=())+,ᅟᅠ+=,[]=/,[+[]]=-[]-[],==>ᅠᅠ%,(=()=>{ᅠᅠ+=[],[-/](([+[]]*)?([+[]])?()?ᅠᅠ:ᅠᅟ:ᅟᅠ:ᅟᅠ+ᅠᅟ),ᅠᅠ<[[]+[]]-?():})()

はい。

解説

じゃあ解説していきます。

変数

まず見たときにスペースが多いと思ったことでしょう。
まあ初っ端からᅠ=なんて入っていますので。

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

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

変数はすべて、この4字の組み合わせでできています。
このままだと解説に影響が出るので、とりあえず変数名を変えて、整形していきます。

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行目

a=a=>(b=a=>String.fromCharCode(a))(c[d++]),
d=e=0,
c=[66,70,105,117,122],
f=a(),
g=a()+a(),

まず1行目です
変数を使いまわし始められかけています。
はじめに

b = a => String.fromCharCode(a)

が行われています。
返り値は

a => String.fromCharCode(a)

です。

つぎに

c[d++]

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

最後に

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'

f = 'B';
g = 'F' + 'i';

なので、要するに

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行目

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のように高性能ではありません!!(笑)
                              何わろとんねん

つぎは7行目です

b(c[e]/(d+d)*d**--d)

bString.fromCharCode
e0なので、c[e]66になって、

String.fromCharCode(66 / (d+d) * d**(--d))

dはこの時点では3なので、
(d+d)6、 * d3、 --d2になります。
終わってますね!

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

つぎに8行目です

(c[f]=b(c[d]+d++*d))

f'B'なので、c['B']に代入します。(???)
bはfromCharCodeなので、

c['B'] = String.fromCharCode(c[d] + d++ * d)

dはこの時点では2なので、
c[d]105、 d++2、 * d3になります。

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

つぎに9行目です

b(c[--d]+d+++d)

d+++d(d++) + dとして処理されるので(結果は一緒)

String.fromCharCode(c[--d] + (d++) + d)

dはこの時点では3なので、
c[--d]105、 d++は、2 + d3になります。

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

 
これ以上言うこともないので最終的にどうなるかと言うと、

c[-1] = this['console']['log'];

です。
ただconsole.logを代入するためだけにこんなに作業していたんですね。

いや直接代入するな 今更っすね

17~22行目

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行目です
fa()を足しています。
この時点でd3なのでc[d++]117a()'u'になります
これにより、f = 'Bu'になります。

18行目です。

f+=a=(a=a())+a

まず、

a = a()

が処理されて、
この時点でd4なのでc[d++]122a()'z'になります。
なのでa = 'z'に、d = 5変わります。

このあとに

a = a + a

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

19行目!
gaが足されて
g = 'Fizz'になる!!!

  
制作・著作
━━━━━
 ⓃⒽ③
 

 
20行目です(笑)

c[d]=d/d

d5なので、c[5] = 1になります

21行目です

c[d+c[d]]=d-c[d]-c[d]

d5c[5]1なのでc[6]に代入しているようです
d - c[d] - c[d]5 - 1 - 13になるので
c[6] = 3となります。

シンガポールに初音ミクを添えて!!!!
やっと22行目です!

a=a=>e%a

eを割って余りを求める関数をaに入れています。

終わりたい

23、24行目

おめでとうございます!!
ここからがmainです!!
                            結構簡単だけどね(ぼそっ)

(b=()=>{
    e+=c[d],

23行目はそのままです

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

25~35行目、、、!!

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に書き直します。

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と同義で、
d5c[5]1なことを踏まえると、

c[d + c[d]]c[5 + 1]c[6]より3
dをかけると15になるので、

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つ目のifelse
15で割り切れず、3で割り切れたら2つ目のifelse
3で割り切れず、5で割り切れたら3つ目のifelse
何も割り切れなかったら3つ目のifがの上側が実行されます!!

28、30、32、34

            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行目!!!ラスト!!

(b=()=>{
           ︙
    e<c[c[d]+c[d]]-d?b():d
})()

先に、38行目はb=(){}で返される関数bを実行しています!

37行目!

e<c[c[d]+c[d]]-d?b():d

c[d]c[5]1
c[1 + 1]c[2]105

書き直すと、

e < 105 - 5 ? b() : 5

e < 100ならb()を実行して、そうでないなら5を返す再帰関数!!!!

終わりいいいい!!!!!!!!!!!

最後に

ここまでのご閲読、ありがとうございました!!!そしてお疲れ様です!
タイトル的にも選手権なのでコメントに、、、
明らかにわざとなものでも、
ほんとにあるものでも構わないので!!(露骨な稼ぎ)

企画とかも募集してます!↖今回初めてsup使った

じゃあ、さようなら!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2