Anybatross YAPC::Fukuoka 2025 で2位タイだった #yapcjapan #anybatross

perlbatross.kayac.com

techblog.kayac.com

前回までの参加記録はこちらで書いていました

今回は総合 -198 で、kurainさん masiuchiさんと並んでの2位タイでした。

提出解

自分の最終的な提出解はこちら

Hole 1: Counter Counter

print$s+=$\=y/8B/0/+y/0469ADO-R//.$/,","for<>

Score: -55 (45 bytes)

Hole 2: BPEagle

s=gets;?A.upto(?Z){(k,),v=s.scan(/(?=(\S\S))/).tally.max_by{_2};v>1&&(s.gsub!k,it;$*<<it+?:+k)};puts$**?,,s

Score: -143 (107 bytes)

遅れての参加

以前はYAPCの開催期間に合わせての開催で、YAPC終了後数日、という期間だったと思うけど、今回は開催期間が長く、YAPCよりも早く開始して 終了後も10日間ほどある、というものだった。

自分はYAPC::Fukuokaで登壇の機会をいただいており その準備で精一杯で、このAnybatrossをやり始めてしまうと絶対に発表準備が終わらなくなる…!と危惧していたので、YAPC::Fukuoka 2日目が終了するまで絶対にAnybatrossを開かないようにしていた。

なので、自分が取り組み始めた11/16には既にほぼ最短解たちが出揃っている状態になっていて、他にも多くの参加者が解を提出していた。

Perlbatrossのときから、「自分のスコアより低いものは他の人の回答を見ることが出来る」という仕様があるため、今回はそれを最大限に利用させてもらった。 最初はできるだけ自分で考えつつできるだけ短くしていって、行き詰まったら近いスコアの他の回答を覗いてヒントを得て それを利用してスコアを伸ばし、また良いスコアの回答を覗けるようになったらそこからアイデアをパクらせてもらい… の繰り返し。 そのおかげで比較的短い時間で今回のスコアまで到達することができた。自分一人の力では全然このスコアには到達しなかったと思う。

感想

Hole 1

shebangが効くかな?と思ったけど結局効果なしで普通に for<> が強かった。

なんかすごい奇抜なテクニックで数えられるかな?と考えたけど結局正規表現でマッチさせるくらいしかなさそうだった。ただ 8B を他の文字に寄せて再度数える、というのはなるほど…と感心した。 y/8B//*2+y/0469ADO-R// より1byte短くなる。

変数を2つ使って改行をそのまま利用する

print$s+=$c=y/8B/0/+y/0469ADO-R//,",$c
"for<>

というのもできたけど長さは変わらず。それなら1行で収まる方が自分は好きかな。 出力の区切りが , じゃなくて だったらこれでもう1byte削れたのになぁ…

print$s+=$\=y/8B/0/+y/0469ADO-R//.$/,$"for<>

カウントしても累積和を先に出力しないといけない、とか絶妙にイヤらしい仕様の問題だった。

Hole 2

最初に問題読んだときは「こんな複雑な問題をゴルフするなんて…」と絶句した。が、やってみると予想外に面白かった。

Perlでは全然無理そうだ…と早々に諦めてRubyで。Rubyは初心者なので tally とかあるの初めて知りましたわ…。shebangperlと同様に -p できるってのも最後まで知らなかった。知ってても結局短くはできなかったと思うけど。

scan(/(?=(\S\S))/) した結果が配列の配列になってしまうのがイヤらしくてしばらく苦戦したが、 (k,),v= のように代入する、というアイデアはChatGPTに相談しまくってようやく発見できた。

あとはそれ以上短くする方法はどうにも思い浮かばず。考えても考えても、というか 考えようにもRubyの言語仕様や標準ライブラリのAPIなどの知識が無さすぎてアイデアの元がまったく無くてどうしようもない感じ。やはりある程度の知識を持ってGolf力を鍛えている言語でないと戦えないんだな、と痛感した。 in とかまったく思いつかなかったし知らなかったし。

生成AI

結論からいうとほぼ役に立たない。この分野に関してはまだまだ人類の知恵が勝利できると言えるだろう。数年後にはこれも凌駕されるんだろうか?

問題を丸投げするだけでもなく、

  • 自分の回答を見せて、もっと短縮する方法あるか訊く
  • 問題を分解し、実現したい処理を列挙して短く書くテクニックやアイデアを出してもらう

など色々な使い方で手伝ってもらおうとしてみたが、大抵は「既にあなたの回答は最短です」としか答えなかったり そもそも正しく動かないとか仕様を満たさないような頓珍漢な回答を出してきたりばっかりだった。

おわりに

今回もとても楽しく、勉強になりました。ありがとうございました!

次は1位を目指せるよう頑張りたい…!PerlだけじゃなくてRubyも勉強しないとな…