誰かが衰弱しましたか?


26

防御は、窓から誰かまたは何かを投げる行為です。
ウィキペディア

入力

入力は2つの部分で構成されます。

  • フロアプランと家/建物内の人。

    • v><^は、矢印が示す方向を指している人を表します。入力には1人が含まれます。

    • -そして|壁を表し、#ウィンドウを表します。 空のスペースです。

    入力のこの部分は、単一の文字列または配列/リスト/などとして取得できます。行の。末尾または先頭のスペースはありません。入力は常に長方形になります。

    例:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • 人が移動する距離(文字数)を示す1以上の整数。

出力

出力は

  • 1人がウィンドウの「内側」にいる場合(つまり、入力で指定された距離だけ前方に移動した後、人はの上にいます#)。

  • 2人が衰弱している場合(a #と連絡を取り、さらに先に進みます)。

  • 3人が壁にぶつかった場合(-またはに接触すると|、壁にぶつかると、人は停止し、壁を通り抜けません)。

  • 0 上記のいずれにも当てはまらない場合(そして、人が行ったことはすべて空の空間を旅することです)。

仮定

次のすべてが真であると仮定できます。

  • その人は、入力領域の「範囲外」に移動することはありません。

  • defenestratedされた後、人は他に接触することはありません#-/ |(あなたがあれば心配する必要はありませんので2 及び 1または3両方真です)。

テストケース

次の「フロアプラン」の場合:

-----
|   |
|###|
|   |
| ^ |
In   Out
1    0
2    1
3    2

このフロアプランの場合:

> | # |
In   Out
1    0
2-99 3    * that is, any input 2-99 outputs 3

このフロアプランの場合:

||####|#|#|##|<
In   Out
any  3

最終テストケース:

|v|
|#|
| |
| |
| |
| |
In   Out
1    1
2-5  2  

7
この課題のタイトルを防御テストに

1
追加の質問:これは、ピットの場合を除きます。
コナーオブライエン

2
CᴏɴᴏʀO'Bʀɪᴇɴ@Has someone been for-sparta'd?
猫の

編集が拒否された理由):
cat

@cat他の人の質問に対する編集であるため、彼らは入力が必要です。
コナーオブライエン

回答:


10

JavaScript(ES6)、147 146バイト

(p,n)=>eval('l=p.search`\n`+1;m=p.match`[<>v^]`;for(r=d=i=0;i++<n&r<3;r-1?0:d=2)r=(c=p[m.index+i*({v:l,"<":-1,">":1}[m]||-l)])>"#"?3:c>" ";+r||d')

@NinjaBearMonkeyのおかげで1バイト節約できました

説明

フロアプランを文字列および移動回数として取得します。数値を返します。

(p,n)=>                               // p = floor plan as string, n = number of moves
  eval(`                              // use eval to enable for loop without {} or return
    l=p.search\`\n\`+1;               // l = line length
    m=p.match\`[<>v^]\`;              // m = the position and orientation of the person
    for(
      r=                              // r = result at the current step
        d=                            // d = 2 if the person has been defenestrated
          i=0;                        // i = current step
      i++<n&r<3;                      // for each step while the person has not hit a wall
      r-1?0:d=2                       // set d to 2 once the person enters the window
    )
      r=(                             // r = 0 if on " ", 1 if on "#" or 3 if on "|" or "-"
        c=p[m.index+i*                // c = character after current step
          ({v:l,"<":-1,">":1}[m]||-l) // get the index offset of each step
        ]
      )>"#"?3:c>" ";
    +r||d                             // return the result of the current step or d
  `)

テスト


3
テストスニペットが好きです!
GamrCorps

ಠ_ಠまったく同じことを投稿しようとしていました。
コナーオブライエン

CᴏɴᴏʀO'Bʀɪᴇɴ母@、私は...あまりにもその気持ちを知っている
user81655

いい答え、ところで!とても賢い。
コナーオブライエン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.