TRICK FINAL 5作品入選

RubyKaigi 2018で、意味不明なプログラムコンテスト「TRICK FINAL」に6作品投稿して5作品が入選しました!
1つくらいは入選するかなと思ったけど予想以上に評価されて嬉しい(3位悔しい)

https://git@github.com/tric/trick2018

どうやって作ったか、git log公開します。
興味あればどうぞ。難読化前のコードも含まれてるので読みやすいはず。
(試行錯誤していけそうだぞ、とわかった時にinitial commitしてるのでその時点で割と出来上がってるけども)
イデアは過去にやったことのブラシュアップだったり考えたけどやらなかったのを思い出して、記憶のゴミ箱から拾い集めました。

1作目 png viewer(3位)

https://gist.github.com/tompng/fc18db09114f4e3ba52de593303b8580
フォーマット(Zlib+method_missingでアスキーアート化)をまず決めて、そのあとでネタとして画像viewerを選んだ
予約語が現れるのを避けるためにSyntaxErrorをcatchして再生成試すようにした。もっと別の方法があったかもしれない

2作目 infinite monkey(選外佳作)

https://gist.github.com/tompng/e24fd79f303393244d003225baba0931
ランダムな6文字をevalしたらたまたまruby tric と出るような乱数のseedを力任せにCPUぶん回して探すことで作った

3作目 wineglass(5位)

https://gist.github.com/tompng/c87ff0b298867491ce47343fe9a5a4e2
method_missing -, +, -@, +@を使ってワイングラス・おちょこ用のDSLを作った
整形は割と簡単で、まずある程度コードゴルフ→整形→短くしたコードを一部崩して長くして瓶の形を細かく調整
ワインボトルで余った文字を水滴の部分で吸収できて整形しやすかった。

4作目 christmas(11位)

https://gist.github.com/tompng/923ad9fb233cdb37fbc032ff6200c98e
Merryの部分が3DデータをMath系の関数で表現したもの、残りがレンダラになってます。
レンダリングの前処理がすごく重いので、その待ち時間にMerry Christmas!の文字を出してます。(プログレスバーみたいな感じ)
かなり力を入れたけども、rubyらしい黒魔術成分はないです。

5作目 brainf*ck(7か8位)

https://gist.github.com/tompng/0a9a407b57d34b75c0b46c6a8b7e56c5
部品を横に繋げても動くコード(かつQuineみたいな)
誰もやってないすごい良いアイデアのつもりだったけどColinさんのライフゲームが上下左右連結で完全に上を行ってた

6作目 whitespace(10位)

https://gist.github.com/tompng/c445259784f99a5bb52d44f9092b450c
全角の空白文字を混ぜたら見た目と実際のコードが乖離できるサンプル。
空白をこっそり混ぜた、一見まともに見えるプルリクを送りつけてmergeさせる攻撃が成立する実証コードかもしれない

1位、2位の二人が本当に強かった。
アニメーション(escape sequence入り)がQuineにできるってのがかなり衝撃だったし、
縦横繋げるのも今後は当たり前の技術になってしまうのかなぁ

短くてすごいコード書ける人にはすごく憧れる(書こうと試してできたのが佳作のあれ)
parse.y読み込んだとか なるほどそこまでやれば思いつく(かもしれない)のかー
次回があればああいうのを書きたいな