※この記事には通常では考えられないような記法が多々登場します
クソコードって見るたびにイラッときますよね?
ということでその憂さ晴らしで逆にどこまでクソコードかけるかなっていうやつです。
(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++]
が行われます
cのd番目を参照したあとに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)
bはString.fromCharCode、
eは0なので、c[e]は66になって、
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行目です
(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、 * dは3になります。
なので、c[d] + d++ * dは111になるので、
この行は'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 + dは3になります。
なので、c[--d]+d+++dは110になるので、
この行は'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行目です
fにa()を足しています。
この時点でdは3なのでc[d++]は117、a()は'u'になります
これにより、f = 'Bu'になります。
18行目です。
f+=a=(a=a())+a
まず、
a = a()
が処理されて、
この時点でdは4なのでc[d++]は122、a()は'z'になります。
なのでa = 'z'に、d = 5変わります。
このあとに
a = a + a
が実行されて、a = 'zz'になります。
それがfに足されるので、
f = Buzzになります。
19行目!
gにaが足されて
g = 'Fizz'になる!!!
終
制作・著作
━━━━━
ⓃⒽ③
20行目です(笑)
c[d]=d/d
dは5なので、c[5] = 1になります
21行目です
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行目です!
a=a=>e%a
eを割って余りを求める関数をaに入れています。
終わりたい
23、24行目
おめでとうございます!!
ここからがmainです!!
結構簡単だけどね(ぼそっ)
(b=()=>{
e+=c[d],
23行目はそのままです
24行目だっ!!
dはもうずっと固定です。
e+=c[d]なのでc[5]は1、eをインクリメントしてるだけです。
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と同義で、
dが5でc[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つ目のifのelseが
15で割り切れず、3で割り切れたら2つ目のifのelseが
3で割り切れず、5で割り切れたら3つ目のifのelseが
何も割り切れなかったら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使った
じゃあ、さようなら!