1359[otamaro]

初っ端からガチ問.こういうのは時間もかかると敬遠されがちですが,
実際やってみると意外と早いはずです.経路を決めて,準備する定義を大体
そろえたらとりあえず書いてみる.一番悩むのは,実装中よりも経路選択?
実装は,適度にデバッグしながらやるようにすると安全だし中断もしやすいです.

最初に書いたコード(101バイト)

a(T):sa(T-1)
b(X):lsXllsXls
c:a(10)ra(8)
p:srsl
q:b(s)

d:b()b()s
z:cdssdlppb(ss)uuqqqb()lpsd

y:zsqqqsslsdb()b()dlplps
u:b(sssssss)

yrdrslsslpuuuuuu
上半分が左右対称に近いことを利用することも考えましたがあまり良さそうではないので,
流石に端点となる場所から初めて自然に1周しました.たまに太くなぞりつつ.
コード中で,c, z, yなどは,明らかな短縮対象なのですが,実行部分をいくつかに切っておかないと
実装中で間違えたときに戻りにくかったり,パーツを見直すときに分かりにくかったりするので
大体長文をやるときは最初はこんな感じである程度長くなるとブチブチ切って書いていってます.
空行を程度に挟んで見やすさ重視しているのもポイント?

これを圧縮していってもいいのですが,初期位置の移動を流石に工夫したくなった.
どうせ長さ7の棒を作るので,それを初期右移動に使えるのでは?
正面に10歩移動するので,3倍関数を新たに定義しました(85バイト).

t(X):XXX
b(X):lsXllsXls
c:t(t(s))u

p:lsrsl
q:t(b(s))

d:sb()b()s
z:crdsdprpb(ss)uuqb()pd

y:zsqssldt(b())ssppd
u:b(t(ss))

t(yrdt(sr)t(b())t(u))

そろそろ経路はだいぶ固まったので,つなげてどのくらいになるかやってみると79バイトになりました.

t(X):XXX
b(X):lsXllsXls

p:lsrsl
q:t(b(s))
d:sb()b()s
u:b(t(ss))

t(t(t(s))urdsdprpb(ss)uuqb()pdsqssldt(b())ssppdrdt(sr)t(b())t(u))

あとは短縮を考える前に経路の微調整.最初のところも棒連打でよくね?
というわけで初期位置あわせと終盤がまとめられて77バイト.

t(X):XXX
b(X):lsXllsXls

p:lsrsl
q:t(b(s))
d:sb()b()s
u:b(t(ss))

t(t(t(u))urdsdprpb(ss)uuqb()pdsqssldt(b())ssppdrdt(sr)t(b()))

棒の長さに自由度があるところを変更して定義を1つ減らす.76バイト.

t(X):XXX
b(X):lsXllsXls

p:lsrsl
d:sb()b()s
u:b(t(ss))

t(t(t(u))urdsdprpb(ss)uut(b(s))b()pdst(u)ssldt(b())ssppdrdt(sr)t(b()))

あとはssだかlsだかで1バイトでも多く節約すればよい.
色々悩んだ挙句,sXsで圧縮するのが一番良いという結論に…なったが合ってるかは謎.
というわけで最終形の73バイト.

t(X):XXX
b(X):lf(XllsXl)

p:lf(r)l
d:f(b()b())
u:b(t(f()))

f(X):sXs

t(t(t(u))urdf(dprpb(f())uut(b(s))b()pd)t(u)f()ldt(b())f()ppdrdt(sr)t(b()))

経路決める→効率はそれほど気にせずとりあえず書く(コードの見やすさ重視)→
経路見直し→定義の見直し→最後の切り詰め.という流れでしょうか??


1361[imomushi]

ssrsssrsを単位としてウロウロすれば良さそうだと分かり,
どの方向にくっつけるとトラップに入らないかを調べて思考錯誤.
とりあえず最初に解けたときにやつがこれ:

  • [18バイト]a(X):XlXX, a(a(a(ssrsssrs))l)


  • 方向転換との兼ね合いで色々変数変換を試して最終形がこれ.

  • [15バイト]a(X):XXrX, a(a(a(a(s)a(s)l))l)


  • 関数1つ使って増やす感じのソルバーを作った人は,15バイトで検索すれば
    現実的な時間でちゃんと解を吐きだしてくれます.自分は結局使わなかったけど.


    1362[kurukuru]

    流石に上位陣はノータイムで解ける問題.

  • [12バイト]a(X):XXXra(sXs), a(r)

  • 1363[Manjis 1]

    ssssrssrrssrssを増やせばよい.
    パーツにXXrXXが使えそうなので,それで一気に巨大直角二等辺三角形を作る.
    最後まで関数には乗りきらないが,4倍関数を使ってる分,2倍関数より有利なので,
    最終的にはお釣りがくる.最初に書いたコードが最後までBestでした.

  • [18バイト]a(X):XXrXX, b:a(a(ssa(ssr)))b, b

  • 1364[Manjis 2]

    最初に書いたのがこれ:

  • [25バイト]w(X):XX, w(w(w(w(w(w(w(sw(lsssl)s)ssl)l)r))r))
  • 流石に縮みそうな感じがするので(というか抜かれたし)頑張る.
    主に2倍関数の変種のXsX,XssX,XsssXあたりを色々と試す.
    lsssllssslみたいなのをこういう2倍関数で作ろうとすると
    方向転換でかえって損してなかなか縮まず悩んでいたけど,
    lssslsslssslと回っちゃう方が有利だったというオチでしたw
    XssXなどの関数で増やすのは慣れていないとややこしいので,
    不慣れな人はBest解を見たら改めて自分でコーディングしてみることをお勧めします.
    意外と同じ関数使っても未だに間違えたりするから難しいんだよね〜w
    自分の場合の実装過程から.まずは最小単位の増やし方を確定させる.

  • [34バイト]a(X):XssX, a(a(la(a(ra(la(lssslssslsslssslsss))))))


  • 手前に方向転換を入れていくのがポイントでしょうか?あとはこの中身を考えればよい.
    なるべく大きいパーツをa(X)に入れられるようにすると,

  • [26バイト]a(X):XssX, a(a(la(a(ra(la(a(lssslsssl)r))))))


  • あとはこの中身がa(ls)a()lとかになって終了.la()a(sl)でもいいね.

  • [22バイト]a(X):XssX, a(a(la(a(ra(la(a(a(ls)a()l)r))))))



  • 1365[zebra crossing]

    適当に描いてみた系の作問で,特に綺麗な想定解はないです.
    適当に繰り返しにしたいですが,最後がとがっていて行き止まりなので,
    それに合わせて経路構築.どうやっても初期位置がきもかったw

  • [29バイト]p:sss, b:ppp, d:slbbls, c:sdllplldc, rblc


  • 3倍関数とか使えそうだけど結局いまいちだったという結論に.
    XYYYXとかやってたけど30Bくらいで止まってました.
    ちなみにこういう圧縮は,まず関数定義から考える人も居そうだけど,
    まずはこんな感じでパーツを定義して書いてみてから使えそうな関数を
    探した方が,意外と効率良かったり後から見返しやすかったりすると思っています.


    1366[UZU collection 2]

    1周期で a(X,Y):XXXXsa(srsY,lX) a(r,) 流石に数値は使いました.
    再帰で小さい渦から作っていこうとすると長さを減らしていくことになるし
    a(T):sa(T-1)も必要そう.あとは,同じ長さをパーツの前後につけて,育てるものが
    1つになるように,UZU中心からUZU中心までを1パーツとして普通に再帰して完成.

  • [26バイト]a(T):sa(T-1), b(X,T):lXra(T)b(la(T)Xra(T),T-1), b(,12)


  • もっと素直にパーツの境目を組み立てても26B行けるらしい(voter参照).


    1367[square zooming]

    最初にとりあえず書いた絶望的なやつwww

  • [31バイト]a(X,Y):XXXXrsYYYYlsa(rslsX,slsrY), a(l,sls)


  • 短縮悩むなぁとか思ったけど,よく考えたら斜めじゃなくてまっすぐ進めばよいww
    2連打して1育てればいいことが分かったので2変数で成長速度の調整ですね.

  • [18バイト]a(X,Y):XXXXsa(srslY,X), a(r,r)


  • とここまできたら流石に17バイトでした.1周期でsrsl育つことと,Xの初項は
    rの向きを与えないといけないこと,Yの初項の向きは何でもいいことなどを考えるとよい.

  • [17バイト]a(X,Y):XXXXsa(srsY,lX), a(r,)



  • 1368[problem]

    最初にとりあえず書いた絶望的なやつwww

  • [24バイト]a(X):XrXlXlXrXlXrXrXlXla(sX), a()


  • 何も考えなくてもSolveは間に合いそう.Solve.
  • [20バイト]a(X,Y):XYYXYXXYYa(sX,sY), a(r,l)


  • かえって規則が分かりにくくなってしまってますねw
    9個進んでるので上手く書けるとしたら3倍関数周辺が怪しい.
    そう思ってよく見ると,XrXlXがパーツになっている.
  • [19バイト]a(X,Y):YlYrYla(sX,XrXlX), ra(,)


  • XrXlXとYlYrYは,大体f(Xll)みたいな感じなので1つの関数で書ける.
  • [19バイト]a(X):XrXlX, b(X):ra(la(X)l)b(sX), b()


  • 最初のrが嫌なので,rXrXlXに変換してみよう,rXを1つにしてXXllXにしてみよう.
  • [18バイト]a(X):XXllX, b(X):a(a(Xr)a())b(sX), b()


  • llも両立出来るのが強み.最後の変数変換は慣れればコードの機械的変形です.


    1369[Windmill 12]

    何となく経路は見えたけどぴったり乗せる微調整が迷いそうなので,
    それっぽい構文にして部位固定探索でSolverに依頼.
    a(X,Y):XXXXa( [?] ,sY)
    a(, [?] )
    に限定して探索して瞬時に解を得る.

  • [19バイト]a(X,Y):XXXXa(rYYssss,sY), a(,r)


  • 同じ構文で(XXXにしたりしても)18バイトはなさそうなのでこれで満足.縮んでも不思議ではない.


    1371[3 3]

    コンテスト期間中は作問者以外でのBestを維持できていたのと,
    作問者の記録には今の方針では絶望的に及ばなかったので,
    ややいい加減な感じのコードを書いて放置.タイトルから考えるという
    方針も探ったけど厳しかった.経路も半信半疑だったしねぇ.

  • [45バイト] c:ss
    a(X):XX
    b(X):sca(rXrs)cs
    a(b()rslcla(srcrb()b()b())lclb(c)b(cc)b(c)rb())



  • 1372[NANAME]

    シンプル問題.最初にとりあえず0475のコードをコピペして20B(笑)
    流石にそんなことしなくても良さそうなので,繰り返しに乗せる.

  • [21バイト]c:sslssllssrsslsslssc, c


  • 素直に圧縮.
  • [18バイト]b:ss, c:blbllbrblblbc, c


  • 素直に圧縮.
  • [17バイト]b:ssl, c:bblbrrbbbrc, c


  • 素直に圧縮.
  • [16バイト]b(X):ssXl, c:b(b()b())b(b(b()))c, c


  • l,rを過不足なく処理出来たということでこれで提出〜.

    と思っていたら,1か月以上経って(この解説書いてるときに)縮みました.
    [rいくつか]ss[rいくつか]という周期的なのを作る…
    ということは12B構文周辺ワンチャン!
    以前作成した数値の12B構文周りのSolver(再帰Solverより簡単に作れるよ!)
    に依頼してみたらすぐに変な解が出力されたw
  • [15バイト]a(T):ra(253-T-T-T)ssa(T-39), a(252)


  • 再帰乱歩があるかは調べていません.


    1373[NO TITLE]

    最初はMax=255だったので適当にSolveしたww

  • [73バイト]a(X):sa(X-1), rssssla(24)lla(16)rsra(13)lla(13)rsra(10)lla(10)rsra(7)lla(7)rsra(7)lsla(8)rsra(8)lla(11)rsra(11)lla(14)c


  • というのはどうでも良かったねw
    何か見たことある形な気がして考えたら0115と似た形だった.距離を調整すれば良さそう.
    あとは,a(X):[?]a(sX), a([?])に限定してSolverに任せる.最初18Bでやらせたらすぐ出てきて,
    17B調べる→16B調べる→…とやってるとすぐに14Bまで.
  • [14バイト]a(X):XXllXrXla(sX)a()



  • 1374[Batsu 1]

    自作問題.XXrXXで綺麗に書けそうな長さとして作問してます.
    適当に考えた想定解?は18バイトでした.下手だったねぇ.

  • [18バイト]a(X):XXrXX, c:a(a(a(sr)))l, a(a(cc))


  • 17B解は繰り返しでした.繰り返しは3バイト消費するから関数で書いちゃう方がたいてい
    短いのに何で?と思ったが自分の解も1つ定義する羽目になってるからダメですね.
    繰り返しに乗せるので,パターン区切り位置はどこでもOK.
  • [17バイト]a(X):XXrXX, c:a(a(a(a(sr)))l)c, c



  • 1375[Batsu 2]

    自作問題.壁に接しているので,4つ正方形を書いて無限に繰り返せばOK.
    特に想定解なく作ってみました.まずはいい加減にSolve.

  • [25バイト]a(X,Y,T):XXXXa(srslX,sY,T-1)Yla(l,,9), a(,,1)


  • よく考えたら,正方形を密に書くにはXXで十分.中心から外側に移動し,外側が
    次の正方形の中心に近いっていうしばしば見かけるパターンで行けそう?
  • [21バイト]a(X,T):XXa(srslX,T-1)ssra(l,10), a(,1)


  • わーいだいぶ縮んでBest!と思った10分後に抜かれましたw
    2バイト縮めないといけないので,ssrをrだけにしたい感じ?
    調整しながら次の解を見つけるに至る.
  • [19バイト]a(X,T):XXa(srslX,T-1)ra(l,9), a(,1)


  • Flash上で挙動を確認し,行けそうなので解答提出フォームで投げたが
    なぜかClearできず超混乱!何度も正しくコピペしてることとかを確かめたw
    で,よくよく調べてみると,実はこれ真ん中で回収しそびれてますねw
    初項付近で上手く回収すればよくて…とa(,1)をa(,2)とかa(,3)にしようとも考えたが渦ですらなく全然無理.
    よく考えたら,XXXにしてもちゃんと次パーツへのつなぎで最初と向きが変わってくれるのでワンチャン!
  • [19バイト]a(X,T):XXXa(slsrX,T-1)a(r,9), a(,1)


  • 近いところまで行ってからが悩んだ.


    1376[Spring Festival -- Hookes Law]

    バネ問題.方針で結構悩んでいたのだが,いざ書いてみるとBestにはなったので
    とりあえず期間中はそれで満足していました.

  • [34バイト]a(X):XXXX, b(X):a(Xs), lb(a(b()l))rb()b(b(lsls)b(b(rb()b()r)rr)ss)


  • [32バイト]c(X):XsXs, b(X):c(X)c(X), rb(b(b()r))lb()b(b(c(l))b(b(rb()b()r)rr)c())


  • 方針は見ての通りで,最上段と移動中を共通化させています.
    4倍関数に押し込めると全部XsXsXsXsな形に出来たのであとはそれで圧縮してみた.


    1377[Spring Festival -- Hot Spring]

    回収方法ではあまり悩まなかった.素直に書いて20B

  • [20バイト]a:slsr, b:aasr, c:bbbbrslc, c


  • 横移動を改善したり余分に突き抜けてみたり.
  • [19バイト]a:slsr, b:aaal, c:bbbbsc, rc


  • [18バイト]a:rsls, b:aaal, c:bbbsbc, c


  • この辺で長く止まっていたのですが,もっと長くできて関数で増やせました.
  • [17バイト]a(X):XXXX, ra(a(a(a(lsrs)l)s))



  • 1378[Spring Festival -- Hot Spring]

    回収方法ではあまり悩まなかった.素直に書いて20B

  • [20バイト]a:slsr, b:aasr, c:bbbbrslc, c


  • 横移動を改善したり余分に突き抜けてみたり.
  • [19バイト]a:slsr, b:aaal, c:bbbbsc, rc


  • [18バイト]a:rsls, b:aaal, c:bbbsbc, c


  • この辺で長く止まっていたのですが,もっと長くできて関数で増やせました.
  • [17バイト]a(X):XXXX, ra(a(a(a(lsrs)l)s))



  • 1378[flower 2]

    4倍の4倍っぽい.まずは経路を確認した.

  • [16バイト]a(X):XXXXr, a(a(ssrssla(s)))


  • ssが多いことと,2倍関数で書けることを加味してXssXで書きなおす.まず大枠から.
    4倍の4倍をする部分だけ書く.
  • [20バイト]b(X):XssX, b(b(rb(b(rssrsslss))))


  • あとはこの中身を圧縮かけて終了.
  • [16バイト]b(X):XssX, b(b(rb(b(b(r)b()lb()))))


  • 少しずつ変形しないと間違えたり損しやすいです.XssXで関数Solverにかけても良かったか.


    1379[Soko!? 3]

    位置合わせ問題.3歩移動してから作るより,移動しながら作る方が良いかな??

  • [15バイト]a(X):XXXX, a(a(a(a(ss)r)r)s)


  • …と思ったけど,3歩移動してからやっても同じバイト数だったwww


    1380[Longest Path]

    色々悩む問題.前半は壁に突撃できるのでsrsl的な移動だけで足りるが
    後半はどうやっても数歩進むパーツが必要になる.
    前半について必要なsrslの長さを調べたら
    2,4,8,10,14,16,20,22,26
    だったのでこれを成長速度の調整で育てる.後半はこれを再利用.
    帰りは22以下しか使えないので,1つ成長を遅らせる(Z=Xとしているところ).
    これで自然に?書くと42Bに.

  • [42バイト]c:srsl
    b(X,Y,Z,A,B,T):llXXb(ccY,cX,X,B,A,T-1)ABZZBr
    ssb(c,,,lss,l,9)



  • 1381[Random Black Point]

    とりあえずとある問題の同一コードでClear出来そうだったのでコピペして撃破.12B.
    11B以下をSolverでチェックして終了.

  • [12バイト]a(X,Y):Xa(lXrY,Ys), a(,)



  • 1382[polygraph]

    合成数を抜き出す問題.ですが,流石にmod 6で0,2,3,4のところですねw
    6周期とみるのではなく「1育てて1進む」「2育てて2進む」と見て4周期.
    初期位置が困ったのだけど,特殊な初項で解決しました.
    結局3,2,2,1,1,2,2,1,1,2,2,1,1,という感じの数列を作ってあとは普通に再帰.

  • [29バイト]a(X,Y,A,B,C,D):XlXYla(YX,sA,B,C,D,A), a(sl,sss,s,s,,)



  • 1383[Nazo Crystal]

    正方形をくるくる書いて…だと外側が膨らまないので悩む.
    そこが解決すればあとは簡単.外側に棒を立てながら正方形を描く.

  • [25バイト]a(X,Y):XXXXa(YsXsY,lsrYrsl), a(r,)



  • 1384[philosophia]

    Solveは簡単だった.

  • [18バイト]a(X,Y):YYYYa(sX,XXXXY), a(r,r)


  • [17バイト]a(X,Y):YYYa(sX,XXXXY), a(r,r)


  • バイト数が減ってきたのでSolverに頼んでみる.
    a(X,Y):[?]a([?],sY), a([?],[?])で16バイト検索.
  • [16バイト]a(X,Y):Xa(lYsXYrYr,sY), a(,)


  • 絶妙すぎわろた.この構文で15Bは見つからなかったと思いきや,1変数で縮みました.
    しかも経路構成も人間的.上手い.
  • [14バイト]a(X):XXXXsa(sssX), a(r)



  • 戻る inserted by FC2 system