Segui i punti


22

La sfida

Data una griglia rettangolare di caratteri

ABCDE
FGHIJ
KLMNO
PQRST

e una griglia con le stesse dimensioni di punti e spazi

. . .
  . . .
  . .  
  . . .  

Emette la stringa che viene generata seguendo i punti attraverso la griglia che inizia nell'angolo in alto a sinistra. Questo esempio darebbeABGLQRSNIJE

Gli appunti

  • È possibile prendere le griglie di input come array 2D o l'alternativa più vicina nella propria lingua anziché una stringa multilinea.
  • Puoi usare il valore NULL della tua lingua invece degli spazi. Ma devi usare i punti per segnare il percorso.
  • Non è necessario separare i punti sulla stessa linea con gli spazi. Li ho appena aggiunti per leggibilità.
  • La griglia più piccola possibile ha la dimensione 1x1.
  • Il punto iniziale e finale avrà un solo vicino. I punti tra loro avranno sempre due vicini verticali o orizzontali esatti. Ciò garantisce che il percorso sia inequivocabile.
  • Il percorso non andrà in diagonale.
  • I caratteri nella griglia saranno tutti caratteri maiuscoli o minuscoli nell'intervallo, a [a-z]prescindere da ciò che è più conveniente per te.
  • Il percorso inizierà sempre nell'angolo in alto a sinistra.

Regole

Casi test

Griglia n. 1

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

Griglia 2

Nota i tre spazi nelle seconde righe del primo e del secondo esempio.

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

Griglia n. 3

UN
.
=> A

Buona programmazione!


Sei sicuro che il secondo caso di test per la griglia n. 1 sia corretto? Penso che l'output dovrebbe essere ABCABCUQXIUOIAIAWAXLUUK.
vaultah

@vaultah Thaks per il suggerimento, corretto. Aveva i punti nella griglia di una colonna molto a sinistra.
Denker

Dobbiamo accettare uno spazio con ogni altro carattere, come qui, o possono essere solo lettere e nuove righe (e nessuno spazio extra nella matrice di punti)?
msh210

@ msh210 Come detto nella sfida, è possibile utilizzare una sorta di valore NULL anziché spazi, dato che ovviamente si prende l'input come un array 2D.
Denker,

Intendevo, senza nulla, nemmeno un byte nullo.
msh210

Risposte:


4

APL, 63 byte

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

Questa è una funzione che accetta due matrici di caratteri (devono essere matrici), la griglia di caratteri come argomento sinistro e la griglia di punti come argomento destro. La matrice di punti può essere più piccola della matrice di caratteri.

Spiegazione:

  • (,⍵='.')/,⍳⍴⍵: ottiene le posizioni dei punti, in ordine di riga-colonna
  • 1↓: rilascia il primo (è noto per essere in 1 1)
  • (⊂1 1){... }: a partire da 1 1, esegui la seguente funzione, che segue il percorso (il suo argomento a sinistra è la sua posizione attuale, il suo argomento a destra sono posizioni non controllate). Funziona selezionando il punto invisibile più vicino ogni volta. (Se le ipotesi della domanda valgono, questo è corretto.)
    • ×≢⍵:: se ci sono ancora posizioni non previste:
      • +/¨2*⍨⍺-⍵: trova la distanza di Manhattan tra ciascuna posizione e la posizione corrente
      • V←(+=⌊/): per ogni posizione, vedere se la sua distanza è uguale alla distanza più piccola e memorizzarla in V.
      • ⍵/⍨~: seleziona tutte le posizioni per cui non è questo il caso, questi sono i campi da visitare successivamente
      • (V/⍵): trova la posizione per cui è il caso, questo sarà il campo successivo
      • : esegue nuovamente la funzione con questi nuovi argomenti
      • ⍺,: il risultato è la posizione corrente, seguita dal risultato di questa operazione per il resto dell'elenco
    • ⋄⍺: altrimenti, torna alla posizione corrente e fermati (è l'ultimo)
  • ⍺[... ]: per ogni posizione, selezionare l'elemento corrispondente nella griglia dei caratteri.

Casi test:

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

Spiegazione

Accetta le griglie come stringhe multilinea.

Sembra un tentativo decente, ma ho finito il tempo mentre giocavo a golf, quindi probabilmente potrebbe essere migliorato.

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>


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.