Postępuj zgodnie z kropkami

22

Wyzwanie

Biorąc pod uwagę prostokątną siatkę znaków

ABCDE
FGHIJ
KLMNO
PQRST

oraz siatkę o takich samych wymiarach kropek i spacji

. . .
  . . .
  . .  
  . . .  

Wyjmij ciąg, który jest generowany przez podążanie kropkami przez siatkę, zaczynając od lewego górnego rogu. Ten przykład przyniesieABGLQRSNIJE

Notatki

  • Siatki wejściowe można traktować jako tablice 2D lub najbliższą alternatywę w swoim języku zamiast ciągu wielowierszowego.
  • Zamiast spacji możesz użyć wartości NULL swojego języka. Ale musisz użyć kropek, aby zaznaczyć ścieżkę.
  • Nie musisz oddzielać kropek na tej samej linii spacjami. Właśnie dodałem je dla czytelności.
  • Najmniejsza możliwa kratka ma rozmiar 1x1.
  • Kropka początkowa i końcowa będzie miała tylko jednego sąsiada. Kropki między nimi zawsze będą miały dokładnie dwóch pionowych lub poziomych sąsiadów. To gwarantuje, że ścieżka jest jednoznaczna.
  • Ścieżka nie będzie przekątna.
  • Znaki w siatce będą wszystkimi dużymi lub małymi znakami z zakresu, [a-z]co jest dla ciebie najwygodniejsze.
  • Ścieżka zawsze zaczyna się w lewym górnym rogu.

Zasady

Przypadki testowe

Siatka nr 1

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

Siatka nr 2

Zwróć uwagę na potrójne spacje w drugiej linii pierwszego i drugiego przykładu.

AB
Płyta CD
.  
   
=> A
. .
   
=> AB
.  
. .
=> ACD

Siatka nr 3

ZA
.
=> A

Happy Coding!

Denker
źródło
Czy na pewno drugi przypadek testowy dla siatki nr 1 jest poprawny? Myślę, że wynik powinien być ABCABCUQXIUOIAIAWAXLUUK.
vaultah
@vaultah Thaks za podpowiedź, poprawione. Miał kropki w siatce o jedną kolumnę daleko po lewej stronie.
Denker,
Czy musimy akceptować wprowadzanie przy każdym innym znaku spacji, tak jak tutaj, czy może to być tylko litery i znaki nowej linii (bez dodatkowych spacji w matrycy kropkowej)?
msh210
@ msh210 Jak powiedziano w wyzwaniu, możesz użyć pewnego rodzaju wartości NULL zamiast spacji, oczywiście biorąc pod uwagę dane wejściowe jako tablicę 2D.
Denker,
Miałem na myśli, w ogóle, bez bajtu zerowego.
msh210

Odpowiedzi:

4

APL, 63 bajty

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

Jest to funkcja, która pobiera dwie macierze znaków (muszą to być macierze), siatka znaków jako argument lewy, a siatka kropek jako argument prawy. Macierz kropek może być mniejsza niż matryca znaków.

Wyjaśnienie:

  • (,⍵='.')/,⍳⍴⍵: uzyskaj pozycje kropek w kolejności wiersz-kolumna
  • 1↓: upuść pierwszy (wiadomo, że jest w 1 1 )
  • (⊂1 1){... }: zaczynając od1 1 , uruchom następującą funkcję, która podąża ścieżką (jej lewy argument to jego bieżąca pozycja, prawy argument to niewidoczne pozycje). Działa, wybierając za każdym razem najbliższą niewidzianą kropkę. (Jeśli założenia z pytania się utrzymują, jest to poprawne.)
    • ×≢⍵:: jeśli nadal są niezamówione pozycje:
      • +/¨2*⍨⍺-⍵: znajdź odległość Manhattan między każdą pozycją a bieżącą pozycją
      • V←(+=⌊/): dla każdej pozycji sprawdź, czy odległość jest równa najmniejszej odległości, i zapisz ją V.
      • ⍵/⍨~: wybierz wszystkie pozycje, dla których tak nie jest, oto pola do odwiedzenia w następnej kolejności
      • (V/⍵): znajdź pozycję, dla której ma to miejsce, będzie to następne pole
      • : uruchom ponownie funkcję z tymi nowymi argumentami
      • ⍺,: wynikiem jest bieżąca pozycja, a następnie wynik tej operacji dla reszty listy
    • ⋄⍺: w przeciwnym razie po prostu zwróć bieżącą pozycję i zatrzymaj (jest to ostatnia)
  • ⍺[... ]: dla każdej pozycji wybierz odpowiedni element w siatce znaków.

Przypadki testowe:

      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
marinus
źródło
3

JavaScript (ES6), 122 bajty

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``

Wyjaśnienie

Pobiera siatki jako ciągi wielowierszowe.

Wygląda na przyzwoitą próbę, ale zabrakło mi czasu podczas gry w golfa, więc prawdopodobnie można to poprawić.

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>

użytkownik 81655
źródło