TSG第3回コードゴルフ大会

8/19からの1週間に渡って行われたコードゴルフ大会ですが、ここで初めてのコードゴルフに挑戦してみました。この大会は今までEsolang大会だったものにコードゴルフ要素が加わったことで今回からコードゴルフ大会に名称が変わったそうです。

f:id:Hyoga:20170824182315p:plain

ルール説明

  • 3チームに分かれて行います。初めに3チーム1マスずつ当てられています。

  • 支配しているマスの隣のマスについて、指定された問題をマスに書かれている言語で書くことでそのマスを支配できます。

  • 既に他のチームに取られてしまっている隣り合っているマスは、そのチームのコードの文字数(マスに書かれている)よりも短いコードを書くことで上塗りして支配が出来ます。

  • 期間は1週間です。

というものでした。お題は、

8桁の2進数で与えられた数が三角数かどうか判定せよ。入力は50個の数からなる。三角数なら1、そうでないなら0を出力せよ。

というものでした。私は赤チームだったのですが、緑チームにかなりのプロ2名がいらっしゃったようで、残念ながら自分の書いたコードは他の方に塗りつぶされてしまった・それによって提出する権利を失ってしまったのですが、Esolangの習得に関してはまあまあ頑張れたかな、と思ったので、自分のやったものについて、書いた順に触れていきます。

PHP

皆さんおなじみPHPです。赤チームだったので真っ先に取り組んだ言語でした。入力に少し戸惑って調べたことを除いては、自分が書いた言語としては最も簡単(自分が既に習得しているため)なものでした。Wikipediaを見ると、三角数か否かの判定方法は「{√(8N+1)-1}/2が整数かどうか」とありました。これの必要箇所のみを抜き取ってあげただけです。

<?php for($i=0;$i<50;$i++){$j=sqrt(8*bindec(fgets(STDIN))+1);echo 1^$j<=>floor($j);}

という感じで書いたのですが、比較関数が上手く動かず、結局宇宙船に頼ることになってしまいました…

Bash(pure)

Windowsを普段使わない人なら使ったことがあるであろうターミナルで扱う言語です。ただし、pureなので外部コマンドが一切使えないそう(自分は結局どこまで出来るのが知りませんでしたが、それが痛い)

先ほどのように根号が使えないので、1から順に足していった数字を毎回比較しています。後に気付きましたが引いた方が自明にコードは短くなります。しかし自分の実力では到底追いつけないほどのコード差を付けられてしまったので修正はしていません。

for i in {0..49};do read j;k=0;y=1;for x in {0..7};do if [ ${j:$[7-$x]:1} = 1 ];then k=$[$k+$y];fi;y=$[2 * $y];done;s=0;for x in {0..22};do s=$[$s+$x];if [ $s -eq $k ];then echo 1;break;elif [ $x -eq 22 ];then echo 0;fi;done;done

とまあここまでは実用的な言語でした。ここからEsolangに入っていきます。全部初見です。流石に分かりづらさが増すので、分かりやすいように空白を挟んでおきます。

emojicode

文字通り、全て絵文字です。emojiはスタックを扱う言語らしいですが、こっちはしっかりしていて、数学関数まで実装されています。ドキュメントもとてもしっかりしていました。ただ、ドキュメントが詳しすぎて理解に一苦労し、また、Try It Onlineと提出時では実行環境がやや異なっていたので苦労しました。

📦files🔴
🏁🍇
🔂t⏩0 50🍇
    🍦x➗➖⛷🚀➕✖8🍺🚂🔪🍺🔡🍺📓🍩📥📄9 0 8 2 1 1 2
    🍊😛🚴x🚵x🍇
        😀🔤1🔤
    🍉
    🍓🍇
        😀🔤0🔤
    🍉
🍉
🍉

やっているのは4行目で入力を10進数に変換して8倍、1を足してルートに入れたのをxに代入して、あとはfloor(x)とceil(x)を比較しています。
1-ceil(x)+floor(x)を出力した方が短いと気付いたのですが、その時には挑戦権を失っていました…

Glass

{M[m
(_a)A!(_s)S!(_o)O!(_i)I!
z<50>=
/z
    zz*<1>(_a)s.?=
    t(_i)l.?=
    x<0>=
    y<1>=
    j<8>=
    /j
        jj*<1>(_a)s.?=
        xx*y*t*j*(_s)i.?(_s)(sn).?<48>(_a)s.?(_a)m.?(_a)a.?=
        yy*<2>(_a)m.?=
    \
    j<1>=
    y<1>=
    r<0>=
    /y
        yx*<0>(_a)(gt).?=
        rx*<0>(_a)e.?=
        xx*j*(_a)s.?=
        jj*<1>(_a)a.?=
    \
    r*(_o)(on).?
\
]}

2進数をループ回して10進数にして、その後それから1,2,….を引いて毎回数値を確認しているだけです。

何も感想が浮かびません。それほど難しくも無かったので…

Taxi

これはマジキチでした。タクシーを運転してプログラムを動かすとか意味不明です。挙句の果てにドキュメントにある地図が微妙に違っていたり、タクシーの操作の理解に相当苦労させられたりしたのですが、実装していて面白い言語でした。が、実装は大変です。コード量も他の言語と比べて膨大に…

50 is waiting at Starchild Numerology.
Go to Starchild Numerology: west 1st left, 2nd right, 1st left, 1st left, 2nd left.
Pickup a passenger going to Joyless Park.
Go to Joyless Park: west 1st right, 2nd right, 1st right, 2nd left, 4th right.
Go to Post Office: west 1st left, 1st right, 1st left.
[x]
Pickup a passenger going to Chop Suey.
Go to Chop Suey: south 1st left, 1st left, 5th right, 1st left.
Pickup a passenger going to Narrow Path Park.
Pickup a passenger going to Narrow Path Park.
Pickup a passenger going to Narrow Path Park.
Go to Narrow Path Park: north 1st left, 1st right, 1st left.
Go to Chop Suey: west 1st left, 1st left, 2nd right.
Pickup a passenger going to Narrow Path Park.
Pickup a passenger going to Narrow Path Park.
Pickup a passenger going to Narrow Path Park.
Go to Narrow Path Park: north 1st left, 1st right, 1st left.
Go to Chop Suey: west 1st left, 1st left, 2nd right.
Pickup a passenger going to Narrow Path Park.
Pickup a passenger going to The Babelfishery.
Go to Narrow Path Park: north 1st left, 1st right, 1st left.
Go to The Babelfishery: east 1st right.
Pickup a passenger going to Sunny Skies Park.
2 is waiting at Starchild Numerology.
7 is waiting at Starchild Numerology.
Go to Starchild Numerology: north 1st left, 1st left, 1st left, 2nd left.
Pickup a passenger going to Sunny Skies Park.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: west 1st right.
[a]
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left.
Pickup a passenger going to Bird's Bench.
Pickup a passenger going to Multiplication Station.
Go to Bird's Bench: south 1st left, 1st right, 1st right, 1st left.
Go to Narrow Path Park: north 1st right, 1st left, 1st right, 1st right, 2nd left, 5th left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: east 1st right.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: north 1st right, 2nd left.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: north 2nd left, 1st right, 3rd left, 1st left.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st left, 1st left, 1st left.
2 is waiting at Starchild Numerology.
Go to Bird's Bench: south 2nd right, 1st left.
Pickup a passenger going to Multiplication Station.
Go to Starchild Numerology: north 1st right, 1st right, 2nd left.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: west 1st right, 2nd right, 1st right, 4th left.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: south 1st right, 2nd left, 1st right.
Pickup a passenger going to The Underground.
Go to Zoom Zoom: north 1st right.
Go to The Underground: west 1st left, 2nd right.
Switch to plan "b" if no one is waiting.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: south 2nd right, 1st left, 1st right.
Switch to plan "a".
[b]
Go to Sunny Skies Park: south 2nd right, 1st left, 1st right.
Pickup a passenger going to Bird's Bench.
Pickup a passenger going to Riverview Bridge.
Go to Riverview Bridge: north 1st right, 1st right.
Go to Zoom Zoom: west 1st right.
Go to Bird's Bench: west 2nd left, 2nd right, 1st left.
0 is waiting at Starchild Numerology.
Go to Starchild Numerology: north 1st right, 1st right, 2nd left.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: west 1st right.
[c]
Pickup a passenger going to Cyclone.
Go to Bird's Bench: south 2nd right, 1st left.
Pickup a passenger going to What's The Difference.
Go to Cyclone: north 1st right, 1st left, 1st left, 1st right.
Pickup a passenger going to What's The Difference.
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north.
Go to What's The Difference: west 1st right.
Pickup a passenger going to Cyclone.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology: east 1st right, 1st left, 3rd left.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: west 1st right, 3rd right, 1st right, 1st right.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st left, 1st left, 1st left.
Go to Cyclone: north 1st left.
Pickup a passenger going to Equal's Corner.
Pickup a passenger going to Cyclone.
0 is waiting at Starchild Numerology.
Go to Starchild Numerology: north 1st right, 3rd left.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: west 1st left.
Switch to plan "d" if no one is waiting.
Pickup a passenger going to Riverview Bridge.
Go to Sunny Skies Park: north.
Pickup a passenger going to Riverview Bridge.
Go to Riverview Bridge: north 1st right, 1st right.
Go to Cyclone: west 2nd left.
Pickup a passenger going to Riverview Bridge.
Pickup a passenger going to Riverview Bridge.
Go to Zoom Zoom: north.
Go to Riverview Bridge: west 1st left.
"1" is waiting at Writer's Depot.
Go to Writer's Depot: west 2nd left.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right, 2nd right, 1st left.
Switch to plan "f".
[d]
Go to Cyclone: north 4th left.
Pickup a passenger going to Magic Eight.
Pickup a passenger going to Bird's Bench.
0 is waiting at Starchild Numerology.
Go to Starchild Numerology: north 1st right, 3rd left.
Pickup a passenger going to Magic Eight.
Go to Magic Eight: west 1st right, 2nd right, 1st right.
Switch to plan "e" if no one is waiting.
Pickup a passenger going to Riverview Bridge.
Go to Bird's Bench: north 1st left, 1st left, 1st right, 1st left.
Pickup a passenger going to Riverview Bridge.
Go to Sunny Skies Park: north 1st right, 1st left.
Pickup a passenger going to Riverview Bridge.
Go to Riverview Bridge: north 1st right, 1st right.
Go to Zoom Zoom: west 1st right.
"0" is waiting at Writer's Depot.
Go to Writer's Depot: west.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right, 2nd right, 1st left.
Switch to plan "f".
[e]
Go to Bird's Bench: north 1st left, 1st left, 1st right, 1st left.
Go to Sunny Skies Park: north 1st right, 1st left.
Switch to plan "c".
[f]
Go to Joyless Park: south 1st left, 1st left, 4th right.
Pickup a passenger going to The Underground.
Go to The Underground: west 1st left.
Switch to plan "y" if no one is waiting.
Pickup a passenger going to Joyless Park.
Go to Joyless Park: north 1st right.
Go to Post Office: west 1st left, 1st right, 1st left.
Switch to plan "x".
[y]
Go to Taxi Garage: south 2nd left.

実装内容はGlassと全く同じです。これをコピペ無しで全部手で打ち込んで実装したのはいいのですが、完成1時間前に先ほどのGlassを取られてしまい、提出することすら出来ませんでした…(Try It Onlineと言語仕様が異ならない限りACすることは確認済みです)

感想

まあ、初めてコードゴルフ(Esolangも)やったのですが、プロがいる中で戦うのはやはりつらいです…

ショートコーディングのテクニックを知りたいです。

とはいえ、まあまあ中盤までは頑張れていたと思うので、もっと精進してはやくプロになりたい…