ドットをたどる


22

チャレンジ

文字の長方形グリッドを考える

ABCDE
FGHIJ
クルムノ
PQRST

そして、ドットとスペースと同じ寸法のグリッド

。。。
  。。。
  。。  
  。。。  

左上隅から始まるグリッドをドットでたどって生成される文字列を出力します。この例では次のようになりますABGLQRSNIJE

ノート

  • 入力グリッドは、複数行の文字列ではなく、2D配列または言語の最も近い代替物として使用できます。
  • スペースの代わりに、言語のNULL値を使用できます。ただし、パスをマークするにはドットを使用する必要があります。
  • 同じ行にドットをスペースで区切る必要はありません。読みやすくするために追加しました。
  • 最小のグリッドのサイズは1x1です。
  • 開始点と終了点には、隣人が1人だけいます。それらの間のドットには、常に正確に2つの垂直または水平の隣人がいます。これにより、パスが明確になります。
  • パスは斜めになりません。
  • グリッド内の文字は、[a-z]最も便利な範囲内のすべて大文字または小文字のいずれかになります。
  • パスは常に左上隅から始まります。

ルール

  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

テストケース

グリッド#1

ABCABCW
デフフク
XLUSDQZ
ASUKWXI
ウコイム
アイアイオープ
。。          
  。。。      
      。      
。。。。      
。            
。            
=> ABEFGSKUSAWA
。。。。。。。
            。
。。。。
。。。。
。。
。。。。。。。
=> ABCABCWQZIMPUOIAIAWAXLUUK

グリッド#2

最初と2番目の例の2行目にあるトリプルスペースに注意してください。

AB
CD
。  
   
=> A
。。
   
=> AB
。  
。。
=> ACD

グリッド#3

A
。
=> A

ハッピーコーディング!


Grid#1の2番目のテストケースは正しいですか?出力はになるはずですABCABCUQXIUOIAIAWAXLUUK
vaultah

ヒントを@vaultah Thaksが修正しました。グリッドのドットが1列左にありました。
デンカー

ここにあるように、他のすべての文字をスペースで入力する必要がありますか、それとも単なる文字と改行(およびドットマトリックスに余分なスペースがない)を使用できますか?
msh210

@ msh210チャレンジで述べたように、もちろん入力を2D配列として取得する場合、スペースの代わりに何らかのNULL値を使用できます。
デンカー

何も意味せず、ヌルバイトすら意味しませんでした。
msh210

回答:


4

APL、63バイト

{⍺[(⊂1 1){×≢⍵:⍺,(V/⍵)∇⍵/⍨~V←(+=⌊/)+/¨2*⍨⍺-⍵⋄⍺}1↓(,⍵='.')/,⍳⍴⍵]}

これは、2つの文字行列(それらは行列でなければなりません)、文字グリッドを左引数として、ドットグリッドを右引数として取る関数です。ドットのマトリックスは、文字のマトリックスよりも小さい場合があります。

説明:

  • (,⍵='.')/,⍳⍴⍵:ドットの位置を行と列の順序で取得します
  • 1↓:最初のものをドロップします(にあることが知られています1 1
  • (⊂1 1){... }:から開始して1 1、パスをたどる次の関数を実行します(左の引数は現在の位置、右の引数は未訪問の位置です)。毎回、最も近い未訪問のドットを選択することで機能します。(質問からの仮定が保持される場合、これは正しいです。)
    • ×≢⍵::未訪問のポジションがまだある場合:
      • +/¨2*⍨⍺-⍵:各位置と現在の位置の間のマンハッタン距離を見つける
      • V←(+=⌊/):各位置について、その距離が最小距離に等しいかどうかを確認し、これをに保存しVます。
      • ⍵/⍨~:これが当てはまらないすべてのポジションを選択します。これらは次にアクセスするフィールドです
      • (V/⍵):それは対象の位置を見つけるある場合に、これは、次のフィールドになります
      • :これらの新しい引数を使用して関数を再度実行します
      • ⍺,:結果は現在の位置であり、リストの残りの部分でこれを実行した結果が続きます
    • ⋄⍺:それ以外の場合は、現在の位置を返し、停止します(最後の位置です)
  • ⍺[... ]:各位置について、文字グリッド内の対応する要素を選択します。

テストケース:

      f←{⍺[(⊂1 1){×≢⍵:⍺,(V/⍵)∇⍵/⍨~V←(+=⌊/)+/¨2*⍨⍺-⍵⋄⍺}1↓(,⍵='.')/,⍳⍴⍵]}
      ⍝ example
      g0  ← 4 5⍴'ABCDEFGHIJKLMNOPQRST'
      d0  ← 4 5⍴'..  . . .. . .  ... '
      ⍝ test case 1
      g1  ← 6 7⍴'ABCACBWDEFGHUQXLUSDQZASUKWXIWUKOAIMAIAIOUP'
      d1a ← 6 7⍴'..      ...      .   ....   .      .      '
      d1b ← 6 7⍴'.......      ....   .. ..  ..     ........'
      ⍝ test case 2
      g2  ← 2 2⍴'ABCD'
      d2a ← 1 1⍴'.'
      d2b ← 1 2⍴'..'
      d2c ← 2 2⍴'. ..'
      ⍝ test case 3
      g3  ← 1 1⍴'A'
      d3  ← 1 1⍴'.'

      g0 f d0
ABGLQRSNIJE
      (⊂g1) f¨ d1a d1b
┌────────────┬─────────────────────────┐
│ABEFGSKUSAWA│ABCACBWQZIMPUOIAIAWAXLUUK│
└────────────┴─────────────────────────┘
      (⊂g2) f¨ d2a d2b d2c
┌─┬──┬───┐
│A│AB│ACD│
└─┴──┴───┘
      g3 f d3
A

3

JavaScript(ES6)、122バイト

c=>g=>c[l=~c.search`
`,i=p=0]+[...g].map(_=>i|!p?c[i=(d=n=>g[i-n-p?i-n:c]>" "&&(p=i)-n)(1)||d(-1)||d(l)||d(-l)]:"").join``

説明

グリッドを複数行の文字列として受け取ります。

まともな試みのように感じますが、ゴルフ中に時間を使い果たしたので、おそらく改善されるでしょう。

var solution =

c=>g=>
  c[                            // add the starting letter to the output
    l=~c.search`
`,                              // l = line length
    i=p=0                       // i = current index, p = previous index
  ]+
  [...g].map(_=>                // loop
    i|!p?                       // if we have not finished yet
      c[i=                      // find the next index and return it's letter
        (d=n=>                  // d = function to check for a dot at offset n
          g[
            i-n-p?i-n           // if i - n != p, get the character at index i - n
            :c                  // else get index "c" (will return undefined, not a dot)
          ]>" "                 // if the character is a dot
          &&(p=i)-n             // set p to i and return i - n
        )
        (1)||d(-1)||d(l)||d(-l) // search for the next adjacent dot
      ]
    :""                         // if we have finished, return no letter
  )
  .join``                       // output all the returned letters
<textarea id="Characters" rows="6" cols="30">ABCABCW
DEFGHUQ
XLUSDQZ
ASUKWXI
WUKOAIM
AIAIOUP</textarea>
<textarea id="Grid" rows="6" cols="30">.......
      .
...   .
. ..  .
.     .
.......</textarea><br />
<button onclick="result.textContent=solution(Characters.value)(Grid.value)">Go</button>
<pre id="result"></pre>


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.