今回は出題者としてコンテストに参加しました
なかなか楽しかったです
結果はこちら→http://karu.ninja-web.net/hoj/contest3.html

問題:0846~0856 http://herbert.tealang.info/problems.php

前回のmasさんのbest化重視の割と簡単めなセットでのコンテストとは逆にちょっと難しめの問題をいくつか増やしてみました。制限バイト数をきつくすることで誰も解けなさそうなものを入れてみたのですがあまりよろしくなかったですかね。。また従来のコンテストと違ってあらかじめレベル順(クリアする難易度を基準にしました)に整列させてみました(詐称もたくさんあるかもしれませんが)
問題数やタイトルについては最近ややハマっているjubeatをリスペクトしてみました。いかがだったでしょうか
あと壁を使った問題があまり無かったことについては僕の作文力がそっちほうこうにあまり無いことに起因します。。(過去問を見てもわかると思います)ごめんなさい。
ちなみに
Ktya解,コンテストでのbest
でかくと
level1 13 13
level2 16 16
level3 27 28
level4 23 22
level5 24 26
level6 27 25
level7 31 28
level8 29 #
level9 34 31
level10 21 #
では解説(といっても最適解でない可能性が多分にしてありますしそもそも僕のレベルで解説とかほざいていいのかというのもありますが)を僕の作ったときの予定とかもふまえて書いておきます
level1 - small Windmill
制限 20
Ktya解
13B
d:ssssl
a:sdlda
a
一回目、二回目の通り簡単な問題にしました。制限も緩めで誰もが解けるようにという具合で。
あと僕はsolverというものを持っていないのでランダムウォーク的な解が出てきてしまうのを避けるのが感覚依存になってしまうんですよね。。むむう。
問題の方はまず同じパーツを無限に行うパターンが下
15B
a:sssssllssssla
a
これはd:sssslなどとすれば縮みます
13B
d:ssssl
a:sdlda
a
次に有限回繰り返す方針。今回は歩数が4であることも利用できるので4倍関数をを考えます
a(X):XXXX
a(sa(s)rra(s)l)(15B)
rr=llとすればa( )lという形が二つあるのでこれは縮められます
a(X):XXXXl
a(sa(s)la(s))14B
このままだとa(s)を二回使っているのがいかにももったいないです。「じゃあ2倍関数」と思う人もいるかもしれませんが次のようにすると4倍関数でもよいです
a(X):XXXXr
a(sa(a(s)r))(13B)
このように往復系のものは偶数回やれば何でもよいので4倍関数で間に合います.(筆者はこれを「ゴシゴシ」と呼んでたりします)
ゴシゴシするとうまく行く問題も結構あるのでぜひ試してみてください

level2 - Megane
制限 30
Ktya解
16B
a(X):XXrr
a(a(a(a(a(a(sr))a())r)))
こちらも制限内で解くならわりと愚直な問題です.
bestはややテクニック重視にしてみました.
経路的には((srsl×4 左 srsl×4 右)×2 後ろ向く)×2という感じで書いてみると
a:srsl //srslを一つの文字にしておく
b(X):XX //×2というのが出てきたので二倍関数をつくる(×4にもつかえる)
b(b(b(b(a))lb(b(a))r)rr)
これは21Bとなりクリアです
次にsrsl×4の部分が二回出てきたのでこちらもまとめてみます
a:srsl
b(X):XX
b(b(b(b(b(a))l)rr)rr)(20B)
ここで忘れがち(僕だけかもしれませんが)なのがaは一回しか使っていないので直接書いた方がよいということ
b(X):XX
b(b(b(b(b(srsl))l)rr)rr)(18B)あ
この解まではすんなりとたどり着けるといいと思います。問題はここから。
)rrという形が多いのに注目します。これをbにまとめてしまってみようと言う試みを。
b(X):XXrr
b(b(b(b(b(srsl)rr)r)))(18B)
r×4が何も変わらないという性質を利用して上のように調節します。
これではbyte数がかわらなかったので「無駄だった」と思うかもしれませんが実はこの新しく作った関数b(X)はb()でrrを表現できているのです!Herbertでは()は文字数に含まないのでこのような利用はぜひ身につけておきましょう
b(X):XXrr
b(b(b(b(b(srsl)b())r)))(17B)
さて今回はさらに(ちょっと人工的に作ったこともあり)srslがb(sr)と表現できたりします。
これで16Bまで減るのでした
b(X):XXrr
b(b(b(b(b(b(sr))b())r)))(16B)

今回用いた関数f(X):XXrrはrrおよびsrslというわりとよく使うものをf(),f(sr)と各々1B縮められる上に二倍関数としての効果も持っているので覚えておくと役に立つかもしれません(筆者が使いこなせてない感ありますがw)

level3 Herbert kart
制限35B

こちらは最初はデザイン重視で長文チックなものを出そうという計画の中で作られました
今までのコンテストではあまりなかったとおもいます。
ただあまりに長すぎると時間的に厳しいと思ったので少なめになりそうなものを。
また筆者は長文がかなり苦手なので正直解説には期待しないでほしいですw

まずはなぞってみます
(54B)
これではさすがにオーバーしますw
見た感じ多そうなsrsをいったん一つの文字にしてみましょう
a:srs
salaslarslalasssalaaslslasalaa(34B)
はいwwこれだけでクリアですっw正直ごめんなさい
laという文字も多いのでこちらもbとおくと
a:srs
b:la
sabsbrsbbsssabaslsbsaba(30B)
bとsが対応していそうだということでc(X):bXsとおいてみます。
また回収した後はどんな動きが入ってもよいのでsを付与して考えてみます
a:srs
b:la
c(X):bXs
sac()cRc(c())sac(a)lsc()ac(a)(28B)
よく見ると実行部にbはもう登場していないので直接cに込めます
a:srs
c(X):laXs
sac()c(r)c(c())sac(a)lsc()ac(a)(27B)
というわけでこの程度しか考えておりませんでした。ごめんなさい

level4 - Four balls
制限35B
Ktya解
a(X):XXXXXXr
b:srsl
a(a(a(ss)a(bb)r))
今度もレベル4ということでFourと。
制限がそこそこ緩いですがちょっとパスゲーっぽい感じにしてみました、が逆詐称気味だったかもです。。
経路としては正方形に×印を書いたものが4つあるものとなります
さて次にたどり方ですが。
まず同じ模様を4つたどるのでどうやら4n倍関数がよさそうです。
ということで手法が二つあると思います
A:ゴシゴシを利用
先ほど(1番)解説したゴシゴシを利用します(往復するものは+2n倍関数でよいというもの)
(((ギザギザ進んで真ん中の方まで行くってもどる s×12)r)×4)r)×4
ここでまずは4倍関数の方針から
a(X):XXXX
b:srsl
a(a(a(bba(b)rr)a(sss)r)r)(26B)
)rが気になるのでa(X):XXXXrとして
a(X):XXXXr
b:srsl
a(a(a(a(bba(b)l)r)la(sss)))(25B)
bの使い方がややきに食わない(本来使いたくない)ので6倍関数を使ってみることを考えます
今度は6が4の倍数でないので元の位置に戻らなくなる問題が発生します
ここでa(a( ))というかたちにして無理矢理4の倍数にします(36倍関数)
a(X):XXXXXX
a(a(a(a(a(srsl)rr)a(ss)r))r)(24B)
ちょっと実行時間が長めです。ごめんなさい

また度を超えたゴシゴシをしてみるとこんなのもありますw
a(X):XXXXXXXXXXXXr
a(a(a(a(srsl)r)la(s)))(27B,これも実行時間長め)

手法B 今度は直角三角形をイメージしてみます
((12歩 右 ギザギザ 後ろ)×4)右×4
まずは正当派から
a(X):XXXXr
b:srsl
a(a(a(sss)a(bbb)r))(23B)
このように前のやり方ではちょっと工夫をしなくてはいけない上に実行時間も長かったところがこの方法ではらくにかけてしまいます


最後に、模範解で示したものを
a(X):XXXXXXr
b:srsl
a(a(a(ss)a(bb)r))(23B)
正直説明ができませんw
こんなかんじでランダムウォーク風味な解があってもおかしくないですね.

level5 - Many squares
制限 40B
Ktya解
a(X):XXXXr
d:srsl
a(a(a(d))a(a(sd))a(a(ds)))

a(X):XXXXr
a(a(a(srsl))a(a(sa(sr)sls)r))

これは経路見極め力を見る問題にしてみました。微妙に問題名がヒントになってたりします。経路がわかればたいしたことは無いです
「しかし経路がむずいじゃないか!!」
という人もいそうなのでこの問題でのちょっと経路の探し方でも
まず外ふちの正方形の方に注目します
これの対辺の中点を結んだ線にどうやら灰マスはなさそうです。
またこの大きな正方形は辺に同じ図形が8つあるので4倍関数がうまく使えそうです
たとえば
a(X):XXXXで
ssa(rs)rsl
が基本単位です
これを用いると
a(X):XXXXr
a(a(a(ssa(rs)sl)))
という書き方で大まかの点が通れるとわかります。問題は残りです
byte数に余裕があるので無理矢理とるのもありですがここは4倍関数を素直につかって
a(a(srsl))というとりかたがあることがあてられればおkです
(23B)

level 6 Windmills
制限32B
Ktya解a(X,Y):sa(sX,Y-1)b(srXr)s
b(X):XXXX
b(b(a(,6)r)r)

Herbertでは鉄板となっているWindmillシリーズ、複数形にしてみました
((数歩進んでから5,4,3,2,1,0をなぞる 右)×4 右)×4
という具合です。4倍関数は使いそうな様子。
次にパーツの作成。
大きいものから出てくるのでこういうときは数字を使います
また進む距離も6なので数値関数に混ぜられます
a(X,Y):sa(sX,Y-1)rXlslXr
a(,6)
でパーツが作れます

これより
b(X):XXXX
a(X,Y):sa(sX,Y-1)rXlslXr
b(b(a(6,)r)r)(28B)
という解ができます
a(X,Y)の後ろ側にやや無駄を感じるので「ゴシゴシ」の応用をして
b(X):XXXX
a(X,Y):sa(sX,Y-1)b(srXr)s
b(b(a(,6)r)r)(27B)
として1B減らすことができます

level 7 Kousaten
制限36B
Ktya解
a(X):slsra(X-1)
b(X,Y,Z,W):lZb(Xs,Y-1,WWZ,Xa(Y)X)
b(l,12,,)

微妙に長文っぽいものを目指して作ったのですが実際にやってみたらそこそこまともな解き方があったという問題.
・今までの動きを保存
・減るものと増えるものがある→数値と文字
・変数を増やすことでbyte数を減らしさらに向きを調整
というわりと総合的な問題となって結構お気に入りの問題です
経路としては
((X歩前進 12-X回ギザギザ 左 X歩前進 左)×2をX=0~kまで行って左)をk=0~5まで
行う)
という問題です
ここには過去の動きを保存するという操作が必要です(フラクタル問題で頻出)
またX歩のほうを文字にし12-Xの方を数式で処理します
すると次のようになります
a(X):srsla(X-1)
b(X,Y,Z):Zl

level8 Snow Cristal
制限 29B
Ktya解
a(X,Y):Ya(sX,b(XXYrrXlXrXrX))
b(X):XXXX
a(,rr)


タイトルは微妙にSnow Gooseを意識してみましたwちょうどレベル8ですしねw
さて本問題、割ときれいな形があるわけですが、これは実はフラクタルです。
正方形に十字がくっついたフラクタル。
その作り方に気づくのがかなり難しかったようです。。
解けそうな人も直接書いていたようなので。。
これをbossにしてしまえばよかったと反省
個人的にこの図形気に入ってるんですけどどうですかね.実際に結晶みたいですし
b(X):XX
とすれば普通に縮みますね見落としてました




level9 59 shou tasu amari…
制限 40B
Ktya 解
a(X,Y,Z):sa(X-Y,Y,Z)a(X-1,1,Y-X)
b(X,Y):b(X-1,ra(59,X-1,1)r)YYs
b(59,)

さて、これはコンテスト初の試みなのですが、数学ゲーを出してみました。
Herbertで数学的なことができるというのは僕が魅かれたところの一つであります.
そこでTwitter IDにもつかってる59を使ってみたいなと思ったのでこれを出題。過去問にも59を使う問題があったりします
タイトルにどれだけ情報を入れるかかなり迷いましたが結局ネタバレ全開にしました。というかこれに関しては規則に気づくことが本質じゃないかなーと思ったので
結局問題としては逆詐称となってしましたが

要は
(右 59をkで割ったあまり+ 59をkで割った商 の分進む 右)一歩前進
をk=1から増やしていく関数を作ってねって言う問題。プログラミングっぽく言うと
59%k + 59/k みたいな。



level10 - Boss of this contest!
制限 21B
Ktya解 21B
a(X):ssrXsl
b(X):a(a(XXXX))b(a()X)
b(r)

過去二回のコンテストでは全完達成者がいるようなセットだったので今回は実験的に結構難しい、解くだけでワンチャンみたいな問題を作ってみました。
ただ答えがランダムウォークとかbyte数が多いだけとかだとさすがにつまらないので割と正面から勝負してみました。
実際コンテストやるまでこれの存在がどれくらい影響を及ぼすのかわかんなかったのですがどうなんでしょう

答えを見るとすごい簡単に見えてしまいますね。

解いてくださった皆さんおつかれさまでした

以上
(また書き足しますんで最後の方の解説がテキトーなのは許してください)