最短への道、コードゴルフの世界

2023/06/01に公開

競技プログラミングが脚光を浴びて盛り上がる世の中ですが、いかがお過ごしでしょうか。
今日はコードゴルフという、プログラミングの競技についてお話します。

競技プログラミングはざっくり言って、お題に従って目的のアウトプットを出すコードを書く競技ですが、コードゴルフはどんな手を使ってもいいので目的のアウトプットを出力を出す最短のコードを書く遊びです。
最短のコードを目指すのでコメント書くな!改行するな!関数使うな!などコードに可読性やらメンテナンス性が求められる昨今とは真逆を行く遊びですので、

その昔、暇すぎてコードゴルフを書いていたのでコードゴルフの世界をご紹介します。
それでは行きましょう。

Anarchy Golf

ここがAnarchy Golf でコードゴルフの問題とランキングが散りばめられているサイトです。


どこをみたらわからん。という感じだと思うので中段の
The list of all problems
を見てみましょう。


hello world から始まり、ざっと問題がならんでいます。


hello world は見た通り「Hello, world!」と出力する最も短いコードを書けばいいわけです。
簡単ですね!
コードゴルフのランキングへの参加もYour name に名前を入れて、File に書いたコードをアップロードして、送信 するだけです。
簡単ですね!

それではランキングを目指していた当時のコードを解説を踏まえて見ていきましょう。
参加していた問題はFizzBuzz です。
FizzBuzz はなんぞやについてはこちらで
https://ja.wikipedia.org/wiki/Fizz_Buzz


このサイトはコードゴルフ問題の下に言語ごとのランキングがずらっとならんでいます。
自分で挑戦する時は得意な言語でいきましょう。
当時はjava でやってたので、java を見ていきます。


未だにランキングに残ってますね。
Size がコードのサイズでこれが少なければ少ないほど強いです。
同着の場合は先に提出した順でランキングに乗ります。
この場合だと14位まで同着の最短コードで提出されたことになります。

さて、どんなコードを書いていたのか見てみましょう。
これは最短コードの1歩手前で提出してたコードです。
これにひと工夫すると最短コードになります。

b.java
class b{public static void main(String[]B){for(int i=0;i++<100;)System.out.println((i%3>0?"":"Fizz")+(i%5<1?"Buzz":i%3>0?i:""));}}

見辛いのでコードフォーマットしましょう。

b.java
class b {
    public static void main(String[] B) {
        for (int i = 0; i++ < 100;) System.out.println((i % 3 > 0 ? "" : "Fizz") + (i % 5 < 1 ? "Buzz" : i % 3 > 0 ? i : ""));
    }
}

ポイントはプリント文の中に三項演算子で条件式を書いているところでしょうか。
これにあることをすると public static void~ なjava のおまじないを除去できて最短コードになります。
そもそも三項演算子が読みづらいので普段遣いはやめましょう。良い子はリーダブルコードを読みましょう。
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック

コードゴルフと似た競技で7行プログラミングというのがあるので、ついでに紹介します。
(79文字+改行)x 7行 で面白いものを作ろうというやつです。

有名なのものの一つとして7行テトリスというのがあります。
html で保存するとたったこれだけで、遊べるコードがかけるってすごいですよね。

<body id=D onKeyDown=K=event.keyCode-38><script>Z=X=[B=A=12];function Y(){for(C
=[q=c=i=4];f=i--*K;c-=!Z[h+(K+6?p+K:C[i]=p*A-(p/9|0)*145)])p=B[i];for(c?0:K+6?h
+=K:t?B=C:0;i=K=q--;f+=Z[A+p])k=X[p=h+B[q]]=1;if(e=!e)if(h+=A,f|B)for(Z=X,X=[l=
228],B=[[-7,-20,6,h=17,-9,3,3][t=++t%7]-4,0,1,t-6?-A:2];l--;)for(l%A?l-=l%A*!Z[
l]:(P+=k++,c=l+=A);--c>A;)Z[c]=Z[c-A];for(S="";i<240;S+=X[i]|(X[i]=Z[i]|=++i%A<
2|i>228)?i%A?"■":"■<br>":"_");D.innerHTML=S+P;Z[5]||setTimeout(Y,99-P)}Y(h=e
=K=t=P=0)</script>

古えの解説記事はこちら
7行テトリスの解説

(おしまいに)
コードゴルフも7行プログラミングもショートコーディングと呼ばれる分野の知識です。
可読性やら保守性が求められる世の中で真逆を行っていますが、ショートコードは省メモリ・高速性・処理系の理解などに役に立ちます。
もし、限られたリソースで何かやらなきゃいけないとなったときは思い出してみてください。

EMP Tech Blog

Discussion