Folgen Sie den Punkten

22

Die Herausforderung

Gegeben ein rechteckiges Zeichenraster

ABCDE
FGHIJ
KLMNO
PQRST

und ein Raster mit den gleichen Abmessungen von Punkten und Räumen

. . .
  . . .
  . .  
  . . .  

Geben Sie die Zeichenfolge aus, die generiert wird, indem Sie den Punkten durch das Raster in der oberen linken Ecke folgen. Dieses Beispiel würde ergebenABGLQRSNIJE

Anmerkungen

  • Sie können die Eingabegitter als 2D-Arrays oder die nächstliegende Alternative in Ihrer Sprache anstelle einer mehrzeiligen Zeichenfolge verwenden.
  • Sie können den NULL-Wert Ihrer Sprache anstelle von Leerzeichen verwenden. Sie müssen jedoch Punkte verwenden, um den Pfad zu markieren.
  • Sie müssen keine Punkte in derselben Zeile durch Leerzeichen trennen. Ich habe sie nur zur besseren Lesbarkeit hinzugefügt.
  • Das kleinstmögliche Raster hat die Größe 1x1.
  • Der Start- und Endpunkt haben nur einen Nachbarn. Die Punkte dazwischen haben immer genau zwei vertikale oder horizontale Nachbarn. Dies garantiert, dass der Pfad eindeutig ist.
  • Der Weg wird nicht diagonal verlaufen.
  • Die Zeichen im Raster sind entweder alle Groß- oder Kleinbuchstaben in dem Bereich, [a-z]der für Sie am bequemsten ist.
  • Der Pfad beginnt immer in der oberen linken Ecke.

Regeln

  • Funktion oder Vollprogramm erlaubt.
  • Standardregeln für die Eingabe / Ausgabe.
  • Es gelten Standardlücken .
  • Dies ist , also gewinnt die niedrigste Byte-Anzahl. Tiebreaker ist eine frühere Vorlage.

Testfälle

Gitter # 1

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

Gitter 2

Beachten Sie die dreifachen Leerzeichen in den zweiten Zeilen des ersten und zweiten Beispiels.

AB
CD
.  
   
=> A
. .
   
=> AB
.  
. .
=> ACD

Gitter # 3

EIN
.
=> A

Viel Spaß beim Codieren!

Denker
quelle
Sind Sie sicher, dass der zweite Testfall für Grid # 1 korrekt ist? Ich denke die Ausgabe sollte sein ABCABCUQXIUOIAIAWAXLUUK.
Gewölbe
@Vaultah Thaks für den Hinweis, korrigiert. Hatte die Punkte im Raster eine Spalte zu weit links.
Denker
Müssen wir wie hier Eingaben mit jedem anderen Zeichen als Leerzeichen akzeptieren, oder können es nur Buchstaben und Zeilenumbrüche sein (und keine zusätzlichen Leerzeichen in der Punktmatrix)?
msh210
@ msh210 Wie in der Challenge bereits erwähnt, können Sie anstelle von Leerzeichen auch eine Art NULL-Wert verwenden, vorausgesetzt, Sie nehmen die Eingabe als 2D-Array.
Denker
Ich meinte, überhaupt nichts, nicht einmal ein Null-Byte.
msh210

Antworten:

4

APL, 63 Bytes

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

Dies ist eine Funktion, die zwei Zeichenmatrizen akzeptiert (sie müssen Matrizen sein), das Zeichenraster als linkes Argument und das Punktraster als rechtes Argument. Die Punktematrix kann kleiner sein als die Zeichenmatrix.

Erläuterung:

  • (,⍵='.')/,⍳⍴⍵: Ermittelt die Positionen der Punkte in der Reihenfolge der Zeilen und Spalten
  • 1↓: Lass den ersten fallen (es ist bekannt, dass er bei ist 1 1)
  • (⊂1 1){... }: 1 1Führen Sie ausgehend von die folgende Funktion aus, die dem Pfad folgt (das linke Argument ist die aktuelle Position, das rechte Argument sind nicht besuchte Positionen). Dies funktioniert, indem jedes Mal der nächste nicht besuchte Punkt ausgewählt wird. (Wenn die Annahmen aus der Frage zutreffen, ist dies richtig.)
    • ×≢⍵:: falls es noch unbesuchte Positionen gibt:
      • +/¨2*⍨⍺-⍵: Ermitteln Sie die Manhattan-Entfernung zwischen jeder Position und der aktuellen Position
      • V←(+=⌊/): Überprüfen Sie für jede Position, ob der Abstand gleich dem kleinsten Abstand ist, und speichern Sie diesen in V.
      • ⍵/⍨~: Wählen Sie alle Positionen aus, für die dies nicht der Fall ist. Dies sind die Felder, die als nächstes besucht werden müssen
      • (V/⍵): Die Position , für die sie finden ist der Fall, wird dies das nächste Feld sein
      • : Führen Sie die Funktion mit diesen neuen Argumenten erneut aus
      • ⍺,: Das Ergebnis ist die aktuelle Position, gefolgt von dem Ergebnis, das Sie für den Rest der Liste erzielt haben
    • ⋄⍺: ansonsten einfach die aktuelle Position zurückgeben und anhalten (es ist die letzte)
  • ⍺[... ]: Wählen Sie für jede Position das entsprechende Element im Zeichenraster aus.

Testfälle:

      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
quelle
3

JavaScript (ES6), 122 Byte

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

Erläuterung

Nimmt die Gitter als mehrzeilige Zeichenfolgen.

Fühlt sich an wie ein anständiger Versuch, aber mir ging beim Golfen die Zeit aus, sodass es wahrscheinlich verbessert werden könnte.

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>

user81655
quelle