跟随点


22

挑战

给定一个矩形的字符网格

美国广播公司
FGHIJ
克拉姆诺
PQRST

和一个点和空格尺寸相同的网格

。。。
  。。。
  。。  
  。。。  

输出从左上角开始的点通过网格跟随点生成的字符串。这个例子会产生ABGLQRSNIJE

笔记

  • 您可以将输入网格作为2D阵列或您语言中最接近的替代形式,而不是多行字符串。
  • 您可以使用语言的NULL值代替空格。但是,您必须使用点来标记路径。
  • 您无需在同一行上用空格分隔点。我只是为了可读性添加了它们。
  • 最小的网格大小为1x1。
  • 起点和终点只有一个邻居。它们之间的点将始终具有精确的两个垂直或水平邻居。这保证了路径是明确的。
  • 路径不会成对角线。
  • 网格中的字符将[a-z]是最方便的范围内的所有大写或小写字符。
  • 路径将始终从左上角开始。

规则

测试用例

网格#1

中国农业银行
DEFGHUQ
XLUSDQZ
阿苏克西
吴科
友邦
。。          
  。。。      
      。      
。。。。      
。            
。            
=> ABEFGSKUSAWA
。。。。。。。
            。
。。。。
。。。。
。。
。。。。。。。
=> ABCABCWQZIMPUOIAIAWAXLUUK

网格#2

请注意第一个和第二个示例的第二行中的三倍空格。

AB
光盘
。  
   
=>一个
。。
   
=> AB
。  
。。
=> ACD

网格#3

一种
。
=>一个

编码愉快!


您确定Grid#1的第二个测试用例正确吗?我认为输出应该是ABCABCUQXIUOIAIAWAXLUUK
Vault

@vaultah Thaks提供了提示,并对其进行了更正。网格中的点距左侧一列。
Denker'3

我们是否需要像在这里那样将其他每个字符都接受一个空格输入,或者它可以仅仅是字母和换行符(点矩阵中没有多余的空格)吗?
msh210 '16

@ msh210正如挑战中所述,您可以使用某种NULL值而不是空格,当然您可以将输入作为2D数组。
Denker

我的意思是,什么也没有,甚至没有一个空字节。
msh210 '16

Answers:


4

APL,63个字节

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

该函数需要两个字符矩阵(它们必须是矩阵),字符网格作为其左参数,点网格作为其右参数。点矩阵可以小于字符矩阵。

说明:

  • (,⍵='.')/,⍳⍴⍵:按行列顺序获取点的位置
  • 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>


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.