冒険者の冒険


12

チャレンジ

あなたの仕事は、Adve the Adventurerが不気味な(ハロウィーンの)迷路を移動するのをアニメートすることです。Adveは; しかし、彼は性格が流動的であるため、別の性格で表現されることを気にしません。

Adveをアニメーション化するには、各フレームを印刷します。フレームとは、現在の位置を含む地図です。Adveは1ターンごとにスペースを1つ進め、バックトラックすることはありません。彼は最初の行から始まり、最後の行で終わります。

入力

区切り文字または文字列配列を持つ文字列のような任意の合理的な形式。入力は、可能なパスを1つだけ含む3 * 3より大きいマップであると想定できます。文字だけの存在になります#

出力

フレーム。

迷路の例(OK ...ラビリンス

これは、Adveを含まないマップです。最初と最後のフレームはこの空のマップです(このマップは9x15です):

### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###

これはなので、バイト単位の最短コードが勝ちです!

これの正確な出力は、ここで見つけることができます(37フレーム)。

これはなので、バイト単位の最短コードが勝ちです!


最初と最後の行には常に単一の空のセルがありますか?常に単一の可能なパスがありますか(分岐はありません)?
ルイスメンドー

@LuisMendo、はい、「唯一の可能なパス」があります
ダニエル

1
入り口は常に一番上になりますか?
破壊可能なレモン

@DestructibleWatermelon、はい、出口は下部にあります。
ダニエル

4
彼の本当の名前はデイブですが、彼はすべて混乱しています。
mbomb007

回答:


4

Perl、84バイト

@Ton Hospelに、約30バイトのゴルフの正しい方向に案内してくれてありがとう!

バイトカウントには、82バイトのコードと-0pフラグが含まれます。

/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  

最後の2つのスペースがあり、最後の改行はないことに注意してください(それ以外の場合は機能しません)。

Adveが抜け出すために必要なすべてのフレームを出力として迷路を入力として使用します。Adveはa &ではなくa であり、後者はutf8ではないことに注意してください(perlはデフォルトでutf8を使用しません)。-0pEフラグを付けて実行します:

perl -0pE '/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  ' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

目のために、私はこのアニメーション版も作成しましたが、これは少し長くなりますが、各プリントとスリープの間のターミナルをクリアします。0.15秒なので、Adveが実際に動いているように見えます。

perl -0nE 'system(clear);/.*/;say y/A/ /r;select($,,$,,$,,0.15);s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:say"\e[H",y/A&/  /r' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

私はそれが最善のアルゴリズムだと思うが、それはまだ20以上のバイトでダウンgolfedすることができます...
トンHospel

これまで@TonHospel -9バイト(を削除しましたが$s="@+"、以前@+は正規表現が成功した場合にのみ変更されることに気づきませんredoでしwhileた。1バイトまたは2バイトを保存する代わりに)。もっとゴルフする方法についてのヒントはありますか?y///どうにかしてそれらを取り除くs///か、短くする必要があると思います...
ダダ

@TonHospel(ただし、ソリューションに取り組んで投稿したい場合は、同じアルゴリズムか何かであるため、それを保持しないでください。私はまったく気にしません;))
ダダ

正規表現変数がループ内に保持されるかどうかは、非常に微妙です。y///あなたは方向を示すために何かを必要とするので、(ただし、通知をあなたはどちら側に選択してもらう)細かいですが、主な改善は、置換の組み合わせから来る
トンHospel

@TonHospel確かに、私はそれを見たはずですが、それらを結合するのに必要な正規表現ではないことを確認するためにs/ &/&A/、結合してs/& /A&/一緒に(そして一緒に隣に)努力しすぎました!どうもありがとう!(そしてゴルフの仕方を教えてくれてありがとう!)
ダダ

3

JavaScript(ES6)、137

(@ETHproductionsで1バイト保存)

m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`
`)||[...r,m]

少ないゴルフ

m=>{
  d = o = 1+m.search`\n`; // offset to next row and starting direction
  p = m.search` `-o; // starting position, 1 row above the first
  for( r=[m]; // r is the output array, start with empty maze
       // try moving in 3 directions (no back)
       // if no empty cell found, we have exit the maze
       [d,o/d,-o/d].some(q => 1/m[d=q,q+=p]? p=q : 0);
       r.push(q.join``) // add current frame
     )
     q=[...m], q[p] = 0; // build frame, '0' used to mark Adve position
  return [...r,m] // add last frame with maze empty again
}

テスト

F=
m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`\n`)||[...r,m]

function go() {
  var i=I.value,r=F(i),
      frame=x=>(x=r.shift())&&(O.textContent=x,setTimeout(frame,100))
  frame()
}

go()
#I { width:10em; height: 19em; font-size:10px}
#O { white-space:pre; font-family: monospace; font-size:10px; vertical-align: top; padding: 4px}
<table><tr><td>
<textarea id=I>### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###
</textarea><button onclick='go()'>go</button></td><td id=O></td></tr></table>


ええと、愚かな、ありがとう@ETHproductions
edc65

すごい仕事。私はおそらく160バイト前後になるだろう
-ETHproductions
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.