Ikuti titik-titiknya

22

Tantangan

Diberikan kotak karakter persegi panjang

ABCDE
FGHIJ
KLMNO
PQRST

dan kotak dengan dimensi titik dan spasi yang sama

. . .
  . . .
  . .  
  . . .  

Keluarkan string yang dihasilkan dengan mengikuti titik-titik melalui grid mulai dari sudut kiri atas. Contoh ini akan menghasilkanABGLQRSNIJE

Catatan

  • Anda dapat menggunakan kisi input sebagai array 2D atau alternatif terdekat dalam bahasa Anda alih-alih string multiline.
  • Anda dapat menggunakan nilai NULL dari bahasa Anda alih-alih spasi. Tetapi Anda harus menggunakan titik untuk menandai jalan.
  • Anda tidak perlu memisahkan titik pada garis yang sama dengan spasi. Saya baru saja menambahkannya agar mudah dibaca.
  • Grid sekecil mungkin memiliki ukuran 1x1.
  • Titik awal dan akhir hanya memiliki satu tetangga. Titik-titik di antara mereka akan selalu memiliki dua tetangga vertikal atau horizontal yang tepat. Ini menjamin bahwa jalannya tidak ambigu.
  • Jalan tidak akan menuju diagonal.
  • Karakter dalam kisi akan berupa semua karakter huruf besar atau kecil dalam rentang [a-z]apa pun yang paling nyaman bagi Anda.
  • Jalan akan selalu dimulai di sudut kiri atas.

Aturan

  • Fungsi atau program lengkap diizinkan.
  • Aturan default untuk input / output.
  • Celah standar berlaku.
  • Ini adalah , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.

Uji kasus

Kisi # 1

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

Kisi # 2

Perhatikan spasi rangkap di baris kedua dari contoh pertama dan kedua.

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

Kisi # 3

SEBUAH
.
=> A

Selamat Coding!

Denker
sumber
Apakah Anda yakin kotak uji kedua untuk Kotak # 1 sudah benar? Saya pikir hasilnya harus ABCABCUQXIUOIAIAWAXLUUK.
vaultah
@vaultah Thaks untuk petunjuknya, koreksi. Memiliki titik-titik di grid satu kolom jauh di sebelah kiri.
Denker
Apakah kita perlu menerima input dengan karakter lain sebagai spasi, seperti di sini, atau bisakah itu hanya huruf dan baris baru (dan tidak ada spasi tambahan dalam dot matrix)?
msh210
@ msh210 Seperti yang dikatakan dalam tantangan, Anda dapat menggunakan semacam nilai NULL alih-alih spasi, mengingat tentu saja Anda mengambil input sebagai array 2D.
Denker
Maksud saya, tanpa apa-apa, bahkan byte nol.
msh210

Jawaban:

4

APL, 63 byte

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

Ini adalah fungsi yang mengambil dua matriks karakter (mereka harus matriks), kisi karakter sebagai argumen kirinya dan kisi titik sebagai argumen kanannya. Matriks titik mungkin lebih kecil dari matriks karakter.

Penjelasan:

  • (,⍵='.')/,⍳⍴⍵: dapatkan posisi titik-titik, dalam urutan kolom-baris
  • 1↓: drop yang pertama (diketahui berada di 1 1)
  • (⊂1 1){... }: mulai dari 1 1, jalankan fungsi berikut, yang mengikuti jalur (argumen kirinya adalah posisi saat ini, argumen kanan adalah posisi yang belum dikunjungi). Ini bekerja dengan memilih titik yang belum dikunjungi terdekat setiap kali. (Jika asumsi dari penangguhan pertanyaan, ini benar.)
    • ×≢⍵:: jika masih ada posisi yang belum dikunjungi:
      • +/¨2*⍨⍺-⍵: temukan jarak Manhattan antara setiap posisi dan posisi saat ini
      • V←(+=⌊/): untuk setiap posisi, lihat apakah jaraknya sama dengan jarak terkecil, dan simpan di V.
      • ⍵/⍨~: pilih semua posisi yang bukan ini masalahnya, ini adalah bidang yang akan dikunjungi berikutnya
      • (V/⍵): Menemukan posisi yang merupakan kasus, ini akan menjadi kolom berikutnya
      • : jalankan fungsi lagi dengan argumen baru ini
      • ⍺,: hasilnya adalah posisi saat ini, diikuti oleh hasil melakukan ini untuk sisa daftar
    • ⋄⍺: jika tidak, kembalikan posisi sekarang dan berhenti (yang terakhir)
  • ⍺[... ]: untuk setiap posisi, pilih elemen yang sesuai di kotak karakter.

Kasus uji:

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

Penjelasan

Mengambil kisi sebagai string multiline.

Terasa seperti usaha yang layak tetapi saya kehabisan waktu saat bermain golf sehingga mungkin bisa ditingkatkan.

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>

pengguna81655
sumber