Üçgen Izgaralar: Basit Bağlantılı Çok Elmaslar


9

Bir biz olsak da üçgen ızgaralar tekme , ben eşdeğer olduğunu işaret etmek istiyorum Polyominoes üçgen ızgara üzerinde. Bunlara çok elmas denir ve eşkenar üçgenleri kenarları boyunca birbirine yapıştırarak oluşturulan şekillerdir. Bu meydan okumada, bir üçgen ızgaranın hangi alt kümelerinin çok elmaslı olduğuna ve içlerinde delik olup olmadığına karar vereceksiniz. İçinde bir delik bulunan bir elmas yapmak sadece 9 üçgen gerektirdiğinden, kodunuzun mümkün olduğunca kısa olması gerekir.

Izgara

Giriş için Martin üçgen ızgara düzenini kullanacağız :

üçgen ızgara

Üçgenlerin merkezlerinin kabaca dikdörtgen bir ızgara oluşturduğuna ve sol üst üçgenin yukarı doğru "işaret" olmasına dikkat edin. Bu ızgaranın bir alt kümesini tanımlayabiliriz, daha sonra, hangi üçgenlerin dahil olduğunu ve hangilerinin dahil olmadığını belirten dikdörtgen bir "yıldız haritası" vererek. Örneğin, bu harita:

** **
*****

bir delik içeren en küçük poliadiyuma karşılık gelir:

9-elmas delikli

delikler

Yukarıdaki örnekte olduğu gibi, bir delik (bir bölge olmayan bölgeler tarafından kuşatılmış olan polyiamond, bir kısmı içeren bir polyiamond olan ) topolojik olarak, konuşma değil, basit bağlantılı .

Meydan okuma

Yukarıda açıklandığı gibi bir "yıldız haritası" girdi olarak alan bir işlev veya program yazın ve yalnızca üçgen ızgaranın belirtilen altkümesi basitçe bağlı bir poliadiyse doğruluk verir .

Daha fazla örnek

*** ***
*******

poliadiyeye karşılık gelir

13-elmas deliksiz

ki bu basitçe bağlanır.


*   *
** **
 ***

poliadiyeye karşılık gelir

9-elmas deliksiz

ki bu basitçe bağlanır.


**  **
*** **
 ****

karşılık gelir olmayan -polyiamond

İlginç olmayan 13 üçgen

hangi basitçe o bile bağlı olmaz idi bir polyiamond.

Giriş Özellikleri

  • Giriş yalnızca yıldız, boşluk ve satır beslemelerinden oluşacaktır.
  • Girişin ilk karakteri her zaman bir boşluk veya yıldız işareti olacaktır (ızgaranın sol üst köşesindeki yukarı dönük üçgene karşılık gelir).
  • İlk ve son satırlarda her zaman en az bir yıldız işareti olacaktır.
  • İlk satırdan sonraki satırların boş kalmayacağının garantisi yoktur. Bir satırdaki iki satır besleme meşru bir girişte görünebilir.
  • Çizgi uzunluklarının hepsinin aynı olması gerekmez.

Kazanma Koşulu

Bu , bayt cinsinden çok kısa cevap kazanır.

Test Durumları

Gerçek haritalar:

1) *

2) *
   *

3) **

4) *** ***
   *******

5) *   *
   ** **
    ***

6) *
   **
    *

7)    **
     ***
   ****

8) ****
   **   *
    *****

9) ***********
   **    **  **
    ****  **  **
              **
   ************

Falsy haritaları:

1) *
   *
   *

2) * *

3) *
    *

4)  **
   **

5) ***

   ***

6) ** **
   *****

7) **  **
   *** **
    ****

8)  *
    *

9) *****
   **   *
    *****

1
güzel soru. Üçgen ızgaralar bir şey olmaya gidiyoruz, onlar örneğin olarak temsil edilmesini önerebilir AV VA\nVAVAVyerine ** **\n*****bu daha kolay bir insan görselleştirmek için yapar gibi. Martin ASCII diyagramlarından birinde zaten bir düzenleme yaptım.
Level River St

Özellikle insan tarafından okunabilirlikle ilgilenmedim, hayır. Küçük kalırken bir programın okuması daha kolay olacak her şeyi yapmak istedim.
quintopia

Yani temelde, yanlış iff sadece köşeleri "bağlı" bir bölüm varsa?
Michael Klein

1
Veya hiç bağlı olmayan parçalar varsa. Martin bu şekilde koydu: Rakam ve toprak her ikisi de kenarlar boyunca bağlıysa, düzlemi yeniden renklendirmek için 2 sel dolgusu yeterlidir.
quintopia

Yanıtlar:


4

Salyangoz , 95 bayt

F&
lr|=((ul.)2 ,l~a~)d|!((ul.)2 ,l~a~)u}\*}+l\ ,~a~|{\ (lr|=((ul.)2 ,l~a~)d|!((ul.)2 ,l~a~)u}+~

Makroları veya herhangi bir geri başvuruyu uygulamadığım için bu gerçekten yinelemeden muzdaripti. Yaptığı şey, her yıldız için, en üst satırda en soldaki yıldıza giden bir yol olup olmadığını kontrol etmektir; ve her boşluk için, ızgaranın kenarına giden bir yol vardır.

F&                         ,, option F: pad lines with spaces to the length of the longest
                           ,, option &: print 1 iff match succeeds from every cell
lr                         ,, direction left or right, or
      | =((ul.)2 ,l~a~) d  ,, direction down, if we are an even number of orthogonal moves from the top left
      | !((ul.)2 ,l~a~) u  ,, or, direction up if we are odd number of moves from the top left
    }  \*                  ,, literal '*'
}+                         ,, 1 or more times
l\ ,~a~                    ,, check that we are on the leftmost * in the top line

|                          ,, the part before this is for starting on '*'; part after for starting on ' '

{ \                        ,, literal ' '
    (   lr                 ,, direction left or right, or
      | =((ul.)2 ,l~a~) d  ,, same drill as before...
      | !((ul.)2 ,l~a~) u 
}+                         ,, 1 or more times
~                          ,, end on an out of bounds cell

Nasıl çalıştığını anlamıyorum ama tamamen işe yarıyor.
quintopia

3

CJam, 101 98 bayt

qN/_z,f{' e]}{S2*f+W%z}4*:eeee::f+:~{_(aL{+_{_2,.+1$2,.-@_:+1&!2*(a.+}%2${a1$&},\;@1$-@@}h;\;-}2*!

Çevrimiçi deneyin.

Sonunda CJam'a bir sel dolgusu uygulama korkumun üstesinden geldim. Beklediğim kadar çirkin ve kesinlikle golf olabilir.

Genel fikir, iki taşkın dolgusu yapmaktır (bunlar aslında ziyaret edilmemiş hücreler listesinden çıkarma olarak uygulanır). İlk geçiş kenardan erişilebilen tüm boşlukları kaldıracaktır. İkinci geçiş daha sonra ilk *sırada okuma sırasını seçecek ve buradan erişilebilen tüm üçgenleri kaldıracaktır. Sadece ve sonuçta elde edilen liste boşsa, çok elmas basitçe bağlanmıştı:

  • Çok elmaslı bir deliğe sahipse, ilk taşkın dolgusu o deliğe ulaşamaz ve çıkaramaz.
  • Giriş, bağlantısı kesilmiş birkaç elmastan oluşuyorsa, ikinci sel dolgusu hepsine erişemez ve bunları kaldıramaz.
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.