ここでは各問題に対する自分の考察を書いて行きます.ヒント,と言うタイトルにしようかとも思いましたが,それほどの自信は無いので考察で,そもそもbestからほど遠いものもあるので.自分以外の人が書き足しても全く問題ないです.
まず右下の部分が直線上で縦に並んでいる事に注目して似たようなパーツで取る事を試みましょう. ここで注意するのはa(X):sa(X-1)と言う関数を使わない様にする事と同じパーツで取れるならそうする事の二つです.n歩が書けて便利に見えますがn歩に2Bかかる上に圧縮し辛くなるので結局不利になる事が殆どです.サンプルになりますが右上に行ってから右下,左下,左上と取る手法を取ってみます.パーツはsssrssrsssrrでやってみました. こちら
a:sssrssrsssrr sssssssssrsrslaaaasssaaaarrssrsssssslsrssrraaassssssssrssaaarrsslslarrsslslalsrsrassrsla
圧縮してみます.今回はややテクニカルな関数を使ってみます.
まずはaがそもそもデカいパーツでssrが多く見られるのでこれで置換します
f:ssr a:sffsfr sssssssfsrslaaaasssaaaarrfsssssslsrfraaassssssfssaaarrsslslarrsslslalsrsrafsla
するとa:sffsfrと言う部分を見て何か気付いたでしょうか?
fを無視するとssrとなりこれはfと一致しますね.これはどういう事かと言うと,f(X):sXXsXrと定義するとaをf(f())とたった2byteで書けてしまうという事です.と言う訳でfを関数にして書き換えてみます
f(X):sXXsXr a:f(f()) sssssssf()srslaaaasssaaaarrf()sssssslsrf()raaassssssf()ssaaarrsslslarrsslslalsrsraf()sla
と言う事で89Bになりました.60B辺りを目指すとなるとまだ30Bほど縮めなければ行けない訳ですが.安心しましょう.まだ置換を殆どしていない上に関数の利用も全くと言ってよい程していないので余裕がかなりあります.
ここで自分の場合は幾つか案が浮かんだ訳ですがそのうちの一つで突き進んだ結果をここに書いておきたいと思います.
やはり実行部分で目立ってしまうのが.sの多さですね.これをなんとかfを利用して縮められないかと思う訳ですが.sが連続している部分が多いのがネック.と言う事でいっそのこと,fをpXqも含んだ関数にしてしまいましょう.こういう事です
f(X,Y):sXXsYXr a:f(f(,),) sssssssf(,)srslaaaasssaaaarrf(,)sssssslsrf(,)raaassssssf(,)ssaaarrsslslarrsslslalsrsraf(,)sla
非常に自然な発想なのが分かるでしょうか?二変数目だけみればssYrということでssとrを一文字に出来ますね!
これを用いて圧縮してみれば65付近になると思います.参考までに途中経過(77B)
f(X,Y):sXXsYXr a:f(f(,),)
sssf(,f(,f(,)s)slaaaasf(,aaaa))f(,)ssf(,f(,ls)f(,))aaassssf(,f(,)f(,aaa))sslslarrsslslalsrsraf(,)sla
あとはaaaを置換したり前半部分でfを上手く使ったりすると59Bにはなります(とりあえずそれぐらいになりました)
これ以上の圧縮となると厳しい気がするかもしれませんが.最初のステップ(経路選び,パーツ選び)がちょっと悪いだけです.長さ8の棒を立てる方針にするともう少し縮むでしょう.現best解は棒に毛が生えたものを使用して棒のみで回収出来ないイレギュラーを回避しています.
a:srsl sssssaaaaarrssssssssssssrrssssssrsslaarrsssssssssssaarsaarssrraaarssaaalssaarsaarsssssssssssraassrssssssrrssssssssssssraaaaここからはもちろん色々な手法が考えられます.そのうちの一つを紹介します.
5歩をbとおく 最初に5歩進む上に,12歩という大きな歩数があるので数歩分をおいておくのはアリですね すると以下の様になります
a:srsl b:sssss baaaaarrbbssrrbsrsslaarrbbsaarsaarssrraaarssaaalssaarsaarbbsraassrbsrrssbbraaaa
ここで注意するのはsとbが可換だと言う事です.好きに入れ替えましょう aarsという塊がいくつかあるのでこれを置き換えましょう(fとおいたのはcよりも文字が縦に長くてみやすいからです)
a:srsl b:sssss f:aars baaaaarrsbbsrrsbrsslaarrsbbffsrrafsaaalssffbbraassrsbrrssbbraaaa
sとbを適宜入れ替えています.aの多さとrsがいくつかあるのに目をつけて.aarsをaaとrsに分解しましょう.fの上位互換としてf(X):aaXrsとします. 最後のaaaaはf(f())でつくれますね.これを考慮すれば65Bになります.試してみましょう!
その後は2Bセット(bb)が4つあるのですぐに64Bにはなります. また2Bセットとみるのではなく,sとbを上手く入れ替えて3Bのセット(bbr)を3つつくると63Bになります. また2Bセット4つと(br)する事も出来ます.
その後はssがたくさんあるので(b:sssssに二個ありますね)これを置換すれば61B辺りにはなると思います!