自動操縦モード


10

左上隅から始まるヘリコプターは、地面に向かって(この質問では、2D空間で)下降しています。自動操縦モードと手動モードがあります。

自動操縦モードは次のように動作します。

  • 真下のスペースが空いていれば下へ。
  • それ以外の場合は、ステップを完全にランダムに左または右に移動します。(この方法で複数のステップを移動する場合があります。)

そして、地面にぶつかるまで、これらの2つのステップを繰り返し続けます。手動モードはよりスマートで、上方向への移動や巧妙な操作が必要な場合でも、地面への最適な経路を見つけます。

あなたの仕事は

  1. オートパイロットは、指定されたシナリオで合格します。
  2. オートパイロットは、特定のシナリオで失敗する可能性があります。
  3. 自動操縦は失敗しますが、手動モードは成功します、または
  4. どちらのモードも失敗します(地面への有効な経路がありません)。

入力

  • 1dまたは2dの空でない配列としてのシナリオを想定し、2つの異なる文字を使用して空きスペースとブロックされたスペースを表します。句読点はオプションです。
  • オプション:配列の次元

出力

どのケースが発生したかを示す4つの定義済み文字の1つ。

サンプルデータ

入力で0(空)と1(ブロック)を使用し、出力で1 2 3 4(上記の番号)を使用

0 0 0 0
0 1 0 0
0 0 0 1
1 1 0 0

出力: 1

0 0 1 0
1 0 0 1
0 0 0 0
0 1 1 0
0 0 0 1

出力:(2自動操縦モードの場合、ヘリコプターは4番目の行の1に遭遇し、行5の終わりにそれ自体をトラップする可能性があります)

0 0 0 1 0
0 1 1 0 0
0 1 0 0 0
0 0 0 1 0
1 1 1 1 0

出力:(3これは上方に移動する必要があるため、自動操縦は失敗します)

1 0 0
0 0 0

出力: 4

0 0 0 0 1
1 1 1 0 0
1 0 0 1 0
0 1 0 0 0
0 0 1 1 1

出力: 4


@MartinBüttner完了しました。補足として、サンドボックスに投稿する方がいいですか、それとも直接投稿してエラーを修正する方がいいですか。2番目のオプションの方が簡単なので、そうしないインセンティブがない限り、なぜオプション1に従うのか想像できません。
ghosts_in_the_code 2016年

7
私が個人的にサンドボックスを好むのは、チャレンジに取り掛かる前に、潜在的なエラー、抜け穴、または欠落しているテストケースについて考える時間を人々に与えるためです。誰かが欠陥のあるチャレンジに対する早期の回答を投稿した場合、既存の回答を無効にしない限り、チャレンジを実際に修正することはできません。
マーティンエンダー

また、入力は常に文字ですか、それともブール値/整数値などにすることができますか?そして出力-それは整数にすることができますか、それとも文字である必要がありますか?
チャールズが

回答:


1

ルビー、259

私はこれをとても楽しんだ。ありがとうございました! 課題は、興味深い課題を伴う非常に楽しい傾向があります。これは、質問の「文字」が整数である可能性があることを前提としています。

ここでの主な改善点は次のとおりです。

  1. の作成 r
  2. 3行目の恐ろしい三項虐待は、恐らくもっと恐ろしいものになる可能性がありますが、何かをもっとはっきりさせます。
->a,h,w{f=->l,s=0,y=[0]{r=w-2<s%w ?w:1,1>s%w ?w:-1,w
v=(l ?r+[-w]:a[s+w]==0?[w]:r).map{|d|a[m=s+d]==0&&!y[m]?m:p}-q=[p]
a[s]>0?q:s/w>h-2?8:v[0]?v.map{|o|f[l,y[o]=o,y]}.flatten-q :r.any?{|i|a[s+i]<1}?p: !0}
g=f[p]
[8,g[0]&&g.all?,g.any?,f[8].any?,!p].index !p}

未使用(少し古くなっていますが、本当に近いです):

# a is a one-dimensional array of 0s and 1s, h is height, w is width
->a,h,w{
  # f recursively walks the array and returns true/false/nil for each path.
  #    True means we can reach ground.
  #    False means we are stuck in a local minimum and cannot escape
  #    Nil means we reached a local dead-end and need to backtrack.
  # l: {true=>"manual", false=>"autopilot"}
  # s: the position index
  # y: an array of booleans - true-ish means we've visited that square before
  #         (this is to prevent infinite loops, esp in manual mode)
  f=->l,s=0,y=[0]{
    # d: all the legal deltas from s (maximally, that's [1,-1,w,-w], aka [LRDU])
    # r: but the right and left get tricky on the edges, so let's pre-calculate those
    #    we'll default to "down" if "left" or "right" are illegal
    r=[w-2<s%w ?w:1,1>s%w ?w:-1]
    # if manual, [LRDU]; if auto, and you can go down, [D]. else, [LR] 
    d=l ?r+[w,-w]:a[s+w]==0?[w]:r
    # v: the legal deltas that you can go to from s (that is, unvisited and unblocked)
    v=d.map{|d|a[m=s+d]==0&&!y[m]?m:p}-[p]


    a[s]>0 ? [p]     # if we're currently blocked, return [nil] (this is only the case when a[0]==1)
      : s/w>h-2 ? !p # if we're at the bottom, return true
        : v[0] ?     # if we have a place to go....
        v.map{|o|f[l,y[o]=o,y]}.flatten-[p] # recurse with each step.
                                            # y[o]=o is a neat trick to make y[o] truthy and return o
          : r.any?{|i|a[s+i]==0} ? # otherwise, we have nowhere to go. If we could visit left/right, but have already been there
            p                      #    this is not a dead-end - return nil to remove this path
            : !!p                  # If we have a true dead-end (auto-mode with a local minimum), false
  }
  # g is the auto flight
  g=f[p]
  # finally, choose the first "true" out of:
  # 0: always 8.  Cuz why not 8?
  # 1: there is at least one auto path, and all are truthy
  # 2: any auto path is truthy
  # 3: any manual path is truthy
  # 4: true
  [8,g[0]&&g.all?,g.any?,f[!p].any?,!p].index !p
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.