TSG LIVE! 5 ライブコードゴルフ大会 Day2 writeup

TSG LIVE! 5 ライブコードゴルフ大会 (Day1) writeup の続きです。

Day2 のライブコードゴルフ大会は、外部チームとしてこたつがめさんと %20 さんが招かれ、TSG チームと対戦しました。

Day1

n4o847.hatenablog.com

Day2

YouTube Live のアーカイブはこちらです。

youtu.be

さらに、今回ゲストとして参加してくれたお二方が参加記を書いてくれています。

kotatsugame.hatenablog.com

i-i.hatenablog.jp

問題概要

それ以前のどの数値よりも真に小さいか判定せよ

Szkiくんは甘いものに目がなく、毎日おやつを食べていました。
しかし最近Szkiくんは太ってしまったので、ダイエットのためおやつに制限を設けることにしました。
制限は、「その日のおやつのカロリーが以前のおやつたちのカロリーのいずれよりも真に小さいとき、おやつを食べる」というものです。
今日から50日ぶんのおやつのカロリーが2桁の数値で与えられるので、Szkiくんがおやつを食べた日は1、食べなかった日は0を出力してください。

入力

  • 2桁の数値(01以上99以下)が50個、改行区切りで与えられる。
  • 入力の最後には改行が付与される。

出力

  • 与えられた数値それぞれについて、それ以前に与えられた数値のいずれよりも真に小さいとき1、そうでないとき0を出力せよ。

制約

  • 同じ数値は2度出現しない。
  • 入力の数値は10以上99以下である。
  • 初日については1を出力すること。

入力例

入力例

88
18
21
41
55
46
64
58
67
86
89
28
72
12
77
83
93
61
23
15
53
34
35
81
96
10
76
82
19
51
49
47
59
84
24
87
71
33
20
94
45
56
90
39
85
50
40
26
69
68

出力例

11000000000001000000000001000000000000000000000000

行動の振り返り

ぐわ~~~~~~~~

博多市さんと事前の打ち合わせで、東京周辺は赤がいて Ruby (埼玉)、Python (山梨)、C (長野) など相手が強そうな言語があるので、兵庫周辺から攻めようということになり、Crystal (京都) と Node.js (大阪) は普段書いている博多市にまかせて自分は Aheui (和歌山)、Starry (奈良)、GolfScript (滋賀) の esolang を担当することにしました。……が、

書けない!!!!! たすけて

かなりの時間を Starry に溶かしてしまったのは本当に反省すべきムーブだと思っています。切り替えて Aheui や GolfScript をやってみるも手がつかず……

今考えると書き慣れている Brainfuck (三重) は Crystal に接しているので手をつければよかったのかも知れませんが、当日は全く気づきませんでした。

RubyPython は博多市との話し合いによって縮んでいったので、その点は良かったかなと思っています。

相手が強豪なので汎用言語を避けて esolang に向かっていましたが、結果かなり厳しい展開となってしまいました。

コード

C、Go、PythonRubyPerl、Crystal、GolfScript、><>、WhiteSpace についてはこたつがめさんと %20 さんが解説してくれています。

え、自分が解説するものなくない……?

とはいえ、なんとか書ききれた Starry、まだ縮みそうな ><> (新潟)、今回惜しくも手がつけられなかった Brainfuck について語っていこうかなと思います。

Starry (4359 bytes)

まずライブコードゴルフ大会での基本的な戦略として、esolang では縮めるよりも動くことが大事なので、ループ処理を書かずに回数分の処理を繰り返して書きます。

ということで同じ処理を 49 回繰り返しますが、問題はこの言語に大小判定がないというところです。

しばらくして割り算による大小比較に至りましたが、小さい方の数値を残すのもしんどく、唯一の分岐命令である「非ゼロならジャンプ」を使おうとするも、49 回処理を書いているせいでラベル(空白を並べる数で決まる)が長すぎてコード長制限に引っかかりました。

分岐なしで処理できる方法をずっと考えていて、最終的に出した方針としては

print(1)
a=input()
49 times:
  b=input()
  t=(b+100)/(a+100)
  print(t)
  a=b*t+a*(1-t)

みたいなことをやっています。もっと早く思いつきたかった。

というか、せめてジェネレータを事前に作っておくべきでした。本当にアホ

><> (45 bytes → 22 bytes)

アーカイブを見て知りましたが、こたつがめさんが終了間際で ><> コードを Whitespace に出して焦っていたらしいですね。

TSG チームからは届く余地もなかったですが、><> は好きな言語で、あまりゴルフされていないそうなのでゴルフしてみたのがこちらです。

ff*v
?!~>:iii,+:@,1):n

Brainfuck

都道府県の感覚がなさすぎて、Crystal と隣接していることに気づきませんでした。YouTube のコメント欄で(多分 angel さん?)ゴルフしてくれていたので、ここでも考えてみようかなと思います。

とりあえず AC を目指したのが

->>,+[
  <,
  >[-<++++++++++>]
  <<[->-[[->>+<<]>>>-<<<]
  >>[-<<+>>]>+[-<+<<<[-]>>>>]<<+<<]
  >>[-<<+>>]
  +[+++++>+<]
  >---.[-]
<,,+]

で、空白抜きで 114 bytes になりました。

angel さんは 76 bytes なので結構遠い……

まとめ

サークル外からゲストを募ってライブに出てもらうという初の試みでした。結果は悔しく終わってしまったものの、とても興奮する戦いでした。対戦してくれたこたつがめさんと %20 さんに感謝です。

ライブ内で AtCoder 1 位 2 位という文句で紹介していますが、実はこれは偶然そうなったものです。誰を呼ぶかで悩んで結局自分と関わりのあった人たちに声をかけることとなり、それに応じてくれた方たちにも感謝したいと思います。この方法自体には後悔もあり、枠が決まっている以上結局積極性で選んでしまうのと、そもそも声をかけていない人に認知されないというのと……。でも最終的にゲストになったお二方とも今までのライブゴルフを熱心に観てくれていた方々であり参加したがっていたそうなので、今回の決断は間違っていなかったと思います。

個人の希望でしかありませんが、サークル外の人でも楽しめる機会がまたあればいいと思っています。ありがとうございました。