ランレングスCarelyちゃんに参戦してみるよ! | Dev Driven 開発・デザインチーム ランレングスCarelyちゃんに参戦してみるよ! | 働くひとと組織の健康を創る iCARE

BLOG

ランレングスCarelyちゃんに参戦してみるよ!

2022/12/04

こんばんは、iCAREのおぎじゅんです。
これはiCARE Dev Advent Calendar 2022の第1レーン4日目の記事です。昨日の3日目の記事でVPoEのくどうさんが恰好のお題を出してくれたので乗っかってみます。
早速ですが、以下のコードを実行してみてください。

print "0v,12,0u,n1,0m,1k,0l,n1,0i,1s,0h,n1,0f,1y,0e,n1,0d,1z,13,0c,n1,0b,1z,17,0a,n1,09,1e,0i,1e,08,n1,07,1d,0o,1c,07,n1,06,1c,0s,1c,05,n1,05,1b,0w,1b,04,n1,04,1a,0z,01,1a,03,n1,03,1a,09,13,0e,13,0a,19,02,n1,03,19,0a,14,0c,14,0l,n1,02,19,0c,11,0g,11,0m,n1,01,19,0z,0i,n1,01,19,0z,0i,n1,01,19,0z,0i,n1,01,18,0d,12,0g,11,0m,n1,01,18,0f,13,0a,12,0o,n1,01,18,0j,17,0s,n1,01,18,0z,0j,n1,01,19,0z,02,11,0f,n1,01,19,0v,1e,08,n1,02,19,0r,1j,06,n1,02,19,0p,1n,04,n1,03,19,0n,1p,03,n1,03,1a,0l,1r,02,n1,04,1a,0k,1s,01,n1,05,1b,0i,1s,01,n1,06,1c,0g,1s,01,n1,06,1e,0e,1r,02,n1,06,1i,0b,1q,02,n1,05,1r,04,1n,04,n1,05,1s,05,1l,04,n1,04,1a,01,1k,05,1k,03,n1,03,16,09,1i,0a,14,04,17,02,n1,03,12,0i,1g,0k,12,02,n1,0z,0s,n1".split(',').map{ |e| e[0]*e[1].to_i(36)}.join.gsub('n', "\n")

元のコードの986byteに対して、767byteまで減りました。

ざっくりアイデアを解説すると、Rubyでは文字列と数値をto_sやto_iで相互に変換することができますが、その際に基数を指定することができます。一般的な10進数や2進数、16進数だけでなく、36進数までの任意の基数を指定できます。
そこで、繰り返しの数値を36進数1文字表記にして、36文字で足りないところは2回繰り返すことにすれば流さの部分を固定長にできます。あとは基本的な動作は全て昨日のコードを踏襲しました。

さて、もちろん縮めようと思えばもっと縮められるのですが、いきなりカリカリにチューニングしてもつまらないので、あえてツッコミどころを残した状態で公開しておきます。
社内の人はこのまま12月中にどこまで縮められるかチャレンジして欲しいw