KMC活動ブログ

京大マイコンクラブの活動の様子を紹介します!!

KMC Esolangコードゴルフ大会を開催しました

TSG(東大コンピュータサークル)で行われているEsolangコードゴルフ大会を,まるごと輸入してKMC部内でも開催しました. 日程は2019-03-29から 2019-04-03で行いました. その様子を実況します.

各言語ごとの最終提出の解説はこちらです: github.com

  • 問題やシステムは全てTSGさんのものをお借りしています.
  • サイト(静的): http://esolang-0.wass80.xyz/contests/komabasai2018-day1/
  • ルール:
    • 参加者は赤と青のチーム分かれて言語の陣取りを行う.
    • 自分のチームの陣に4近傍で隣接している陣の言語に提出ができる.
    • すでに取られている陣を取り返すためには,より短いコードを提出する.
    • 自分のチームの提出コードは見れるが,相手チームの提出コードは見れない.
  • 問題概要: hとwを受け取って *からなる長方形を出力する.

1日目

f:id:wass80:20190408110037p:plain

  • システムを設置した.
  • TSGではミニ大会だったので14言語だったが,今回は8言語更に増やしておいた.
  • 参加したい人はいつでも参加できるようにした.チームは適当に割り振られる.

最初にC言語でACされた青チームのコード (140B):

#include<stdio.h>
w,h,y=0,x;main(){scanf("%d\n%d",&h,&w);for(;y++<h;){printf("*");for(x=0;x<w-2;x++)printf(y>1&y<h?" ":"*");printf("*\n");}}

その日のうちに赤チームが取り返す (101B):

y,i,j;main(x){for(scanf("%d%d",&y,&x);i<y;puts(""),++i)for(j=0;j<x;++j)printf(j%~-x&&i%~-y?" ":"*");}

両者素朴な二重ループによる実装を行っている.

2日目

f:id:wass80:20190408113230p:plain

  • 思ったより参加人数が増えたので12言語増えた.
  • 難解言語が足らない気がしたので, Evil, Unreadable,Malbolgeを追加した.
  • 提出可能な陣も4近傍から8近傍に増加.さらにマップの縁は反対側につながるように.
  • 参加者は11人

青チームがC言語を取り返す (99B):

i,w;main(h){scanf("%d%d",&h,&w);for(i=++w*h;i--;)putchar(i%w<w-1&i%w>1&i/w<h-1&&i/w?32:i%w?42:10);}

赤チームが更に取り返す (94B):

y,i,j;main(x){for(scanf("%d%d",&y,&x);j<x||(j=puts(""),++i<y);)putchar(j++%~-x&&i%~-y?32:42);}

数式を用いることで1重ループによる実装を行うことに両チームとも成功している.

3日目

f:id:wass80:20190408113625p:plain

  • 参加者がまだまだ増えるので,言語を13言語増やした,
    • これで当初の倍のマップサイズになった.
  • 真ん中の言語を何にするか悩んだが,京大ということでSchemeにした.
  • 青チームは言語内で他の言語を使い始めた.
    • なでしこはJSを実行し,Emojicodeはperlを実行するようになった.

また青チームがC言語を取り返す (90B):

main(w,h,i){scanf("%d%d",&h,&w);for(i=++w*h;i--;)putchar(~i%w/3&~(i/w)%h/2?32:i%w?42:10);}

赤チームがまた更に取り返す (89B):

y,i;main(x){for(scanf("%d%d",&y,&x),i=++x*y;i--;)putchar(i%x?-~i%x>2&&i/x%~-y?32:42:10);}

4日目

f:id:wass80:20190408113943p:plain

  • どんどん埋まっていくボード.
  • ネットワークに接続して問題を解くことを禁止した.
    • $_=<>.<>;s/\s//;exec "wget -O- xxx.jp/$_"がperlの答えになっちゃうの悲しいのでこうなった.

青チーム更に提出 (88B):

c;i;main(w,h){for(scanf("%d%d",&h,&w);!i++?i=~w,h--:putchar(!i?c=10:i%w/2*h*c?32:42););}

赤チームが提出 (87B):

y,i;main(x){for(scanf("%d%d",&y,&x),x++;i<y*x;)putchar(i++%x?i%x>2&&i/x%~-y?32:42:10);}

5日目

f:id:wass80:20190408114739p:plain

  • 全ての入力に対して正常に動作することを要求した.
    • 入力が偶数の場合だけとか,素数の場合だけとかで動くコードが存在した.

青チームがC言語に提出.これが最終提出となる (86B):

h;c;i;main(w){for(scanf("%d%d",&h,&w);h;putchar(++i%w/2*c?32:i>w?c=--h-1,i=0,10:42));}

最終日

f:id:wass80:20190408115118p:plain

  • Malbolge以外のすべての言語が埋まる.
    • Malbolgeは提出コードサイズ上限に収まるコードが存在しないと思われる.
    • cmd.exeは出力の改行コードがどうしても\r\nになってしまいACできなかったのを,システム側で修正した.

結果

f:id:wass80:20190408115220p:plain

青チームの勝利となりました.

最終的に参加者は22人.合計AC数は442回でした. たくさんの参加ありがとうございました.

言語ごとの解説はこちらを読んでください: github.com

大会システムを作ってくださっているhakatashiさんに感謝します. github.com

たいへん盛り上がったので,また開催したいです.