Слідкуйте за крапками


22

Змагання

Дано прямокутну сітку символів

ABCDE
FGHIJ
КЛМНО
PQRST

і сітка з однаковими розмірами крапок і пробілів

. . .
  . . .
  . .  
  . . .  

Виведіть рядок, який генерується, слідуючи крапками через сітку, починаючи з верхнього лівого кута. Цей приклад дасть результатABGLQRSNIJE

Примітки

  • Ви можете приймати сітки для введення як 2D-масиви або найближчу альтернативу вашій мові замість багаторядкового рядка.
  • Ви можете використовувати значення NULL своєї мови замість пробілів. Але вам потрібно використовувати крапки, щоб позначити шлях.
  • Вам не потрібно відокремлювати крапки на одній лінії з пробілами. Я просто додав їх для читабельності.
  • Найменша можлива сітка має розмір 1х1.
  • Точка початку та кінця матиме лише одного сусіда. У крапках між ними завжди будуть точні два вертикальних або горизонтальних сусідів. Це гарантує, що шлях однозначно.
  • Шлях не піде по діагоналі.
  • Символи в сітці будуть або всіма великими або малими символами в діапазоні, [a-z]що є найбільш зручним для вас.
  • Шлях завжди починатиметься у верхньому лівому куті.

Правила

Тестові кейси

Сітка №1

ABCABCW
DEFGHUQ
XLUSDQZ
ASUKWXI
WUKOAIM
AIAIOUP
. .          
  . . .      
      .      
. . . .      
.            
.            
=> ABEFGSKUSAWA
. . . . . . .
            .
. . . .
. . . .
. .
. . . . . . .
=> ABCABCWQZIMPUOIAIAWAXLUUK

Сітка №2

Зверніть увагу на потрійні пробіли у другому рядку першого та другого прикладів.

AB
CD
.  
   
=> А
. .
   
=> AB
.  
. .
=> ACD

Сітка №3

А
.
=> А

Щасливе кодування!


Ви впевнені, що другий тест для сітки №1 правильний? Я думаю, вихід повинен бути ABCABCUQXIUOIAIAWAXLUUK.
vaultah

@vaultah Thaks натяк, виправив його. Мав точки в сітці один стовпчик далеко зліва.
Денкер

Чи потрібно нам приймати вхід з будь-яким іншим символом пробілом, як тут, чи це можуть бути лише літери та нові рядки (і ніяких зайвих пробілів у крапці матриці)?
msh210

@ msh210 Як сказано в виклику, ви можете використовувати якесь значення NULL замість пробілів, якщо ви, звичайно, приймаєте дані як двовимірний масив.
Денкер

Я мав на увазі, не маючи нічого, навіть нульового байта.
msh210

Відповіді:


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>


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.