Noktaları takip et.


22

Meydan okuma

Dikdörtgen bir karakter ızgarası verilir

ABCDE
FGHIJ
KLMNO
PQRST

ve aynı boyut ve nokta boyutlarına sahip bir ızgara

. . .
  . . .
  . .  
  . . .  

Sol üst köşeden başlayarak ızgara boyunca noktaları takip ederek oluşturulan dizgeyi çıktılayın. Bu örnek verecekABGLQRSNIJE

notlar

  • Giriş ızgaralarını, çok satırlı bir dize yerine 2B diziler veya dilinizde en yakın alternatif olarak alabilirsiniz.
  • Dilinizi NULL değerini boşluk yerine kullanabilirsiniz. Ancak yolu işaretlemek için noktalar kullanmanız gerekir.
  • Boşluklarla aynı çizgideki noktaları ayırmanız gerekmez. Onları sadece okunabilirlik için ekledim.
  • Mümkün olan en küçük ızgara 1x1 boyutundadır.
  • Başlangıç ​​ve bitiş noktalarında yalnızca bir komşu olacaktır. Aralarındaki noktalar her zaman tam iki dikey veya yatay komşuya sahip olacaktır. Bu yolun açık olduğunu garanti eder.
  • Yol köşegen gitmeyecek.
  • Kılavuzdaki karakterler, [a-z]sizin için en uygun olanı aralığındaki tüm büyük veya küçük harfler olacaktır .
  • Yol her zaman sol üst köşede başlayacaktır.

kurallar

Test durumları

Kılavuz # 1

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

Kılavuz # 2

Birinci ve ikinci örneklerin ikinci satırlarındaki üçlü boşlukları not edin.

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

Kılavuz # 3

bir
.
=> A

Mutlu Kodlama!


Izgara # 1 için ikinci test durumunun doğru olduğundan emin misiniz? Çıktı olması gerektiğini düşünüyorum ABCABCUQXIUOIAIAWAXLUUK.
vaultah

@vaultah Bu ipucu için Thaks, düzeltildi. Izgaradaki noktalar soldan uzakta bir sütuna sahipti.
Denker

Burada diğer karakterlerle birlikte bir boşluk kabul etmemize gerek var mı, yoksa sadece harfler ve yeni satırlar olabilir mi (ve nokta matrisinde fazladan boşluk yok)?
msh210

@ msh210 Meydan okumada belirtildiği gibi, girdiyi 2D dizisi olarak aldığınızdan dolayı, boşluk yerine bir tür NULL değer kullanabilirsiniz.
Denker

Demek istediğim, hiçbir şey ile boş bir bayt bile değil.
msh210

Yanıtlar:


4

APL, 63 bayt

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

Bu, iki karakter matrisi (matris olmalıdır), sol argüman olarak karakter ızgarası ve sağ argüman olarak nokta ızgarası alan bir işlevdir. Noktaların matrisi, karakterlerin matrisinden daha küçük olabilir.

Açıklama:

  • (,⍵='.')/,⍳⍴⍵: nokta sıralarına göre noktaların pozisyonlarını al
  • 1↓: ilkini bırak (olduğu bilinir 1 1)
  • (⊂1 1){... }: başından itibaren 1 1, yolu izleyen şu işlevi çalıştırın (sol argümanı şu anki konumu, sağ argümanı görünmeyen konumlardır). Her seferinde en yakın görünmeyen noktayı seçerek çalışır. (Sorudaki varsayımlar geçerliyse, bu doğrudur.)
    • ×≢⍵:: eğer hala ziyaret edilmemiş pozisyonlar varsa:
      • +/¨2*⍨⍺-⍵: her konum ile o anki konum arasındaki Manhattan mesafesini bulun
      • V←(+=⌊/): Her pozisyon için mesafesinin en küçük mesafeye eşit olup olmadığına bakın ve bunu saklayın V.
      • ⍵/⍨~: durum böyle olmadığı tüm pozisyonları seç, bunlar sonraki ziyaret edilecek alanlardır
      • (V/⍵): O kendisi için pozisyon bulmak olduğunu vaka, bu bir sonraki alanı olacaktır
      • : fonksiyonu bu yeni argümanlarla tekrar çalıştırın
      • ⍺,: sonuç o anki pozisyondur, ardından listenin geri kalanı için bunu yaparsınız.
    • ⋄⍺: aksi takdirde, sadece geçerli pozisyonu döndür ve dur (sonuncusu)
  • ⍺[... ]: her konum için, karakter ızgarasındaki ilgili elemanı seçin.

Test durumları:

      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 bayt

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

açıklama

Izgaraları çok satırlı dizge olarak alır.

İyi bir girişim gibi hissediyorum ama golf oynarken zaman aşımına uğradım, bu yüzden muhtemelen daha iyi olabilirdi.

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>


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.