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.