Herbert-Warmup Level 5

昨日は飲んできたのでそのまま寝た.んで朝起きてヤフオクをチェック.なんとかモニタを落札せねばならない.あと少しだ頑張ろう.そのあとは昨日始めたHerbertの続きをやってみる.昨日は出かける寸前まで問題を解いていて気づいたら真っ暗だった.どーしてもWarmup Level 5が解けなかったので,これはACM/ICPCでも出てくる不可能問題だと勝手に決めてw実際の問題のほうをやっておりました.

しかしどうも問題が解ける気がしないのですね.そりゃあ長くコードを書けば解けるのですが,制限があるので単純なやり方ではまず無理です.今までの言語でやっていたような再帰を使っても絶対に解けねーと思い,何かちょっと違う再帰(言葉がおかしいですが)を使うはずだと思い,フォーラムを覗いていると,ヒントとしてプロシージャの引数にコマンド(l,rやs)を使えばいいと書かれておりました.

今までのやり方はとりあえず向きを変えて,直進用のプロシージャを呼び出し,直進するたびに+1して再帰させていくのですが,これだと17 Bytesになってしまいます.これを8 Bytesでハーバートに同じ動きをさせないといけないのですね.


f(A):sf(A-1) // Aの数だけ直進
a(A):lf(A)a(A+1) // 直進のたびに歩数を増やす
la(1) // 歩数1でスタート

んでプロシージャの引数にコマンドを使うっていうのは


a(A):Aa(A)
a(lss)

こんな感じになります.これを実行すると,lssというコマンドがAとして扱われるのでAを1回実行して再びa(A)を呼び出すという処理をしています.この引数をうまく使って,再帰のたびにコマンドを付け足していくとうまくいきます.これに気づいて8 Bytesで動いたときはちょっと嬉しかったりしました.現在のランキングはやはり中国が1位ですね.上位に入れるようにちょっとずつ頑張ろうと思います.

http://www.wildnoodle.com/ic2006/UI/Compete/LeaderBoard.aspx