Трикутні сітки: просто пов'язані поліаманти


9

Поки ми тримаємося трикутними сітками , я хотів би зазначити, що на трикутній сітці є еквівалент поліоміно . Їх називають поліамантами , і вони являють собою форми, утворені склеюванням рівносторонніх трикутників разом по їх краях. У цьому виклику ви вирішите вирішити, які підмножини трикутної сітки є поліамантами та чи мають у них отвори. Оскільки для виготовлення багатокутника з отвором у ньому потрібно лише 9 трикутників, ваш код повинен бути якомога коротшим.

Сітка

Ми будемо використовувати схему трикутної сітки Мартіна для введення:

трикутна сітка

Зверніть увагу на те, що центри трикутників утворюють приблизно прямокутну сітку і що верхній лівий трикутник «вказує» вгору. Тоді ми можемо описати підмножину цієї сітки, надавши прямокутну "зіркову карту" із зазначенням, які трикутники включені, а які не входять. Наприклад, ця карта:

** **
*****

відповідає найменшому поліаманту, який містить отвір:

9-алмаз з отвором

Отвори

Поліамант, який містить отвір, як у наведеному вище прикладі (область, яка не є частиною поліамону, яка оточена з усіх боків регіонами, які є ), топологічно не пов'язана просто .

Змагання

Напишіть функцію або програму, яка приймає як вхід «зіркову карту», ​​як описано вище, і виводить форму, якщо і лише тоді, коли зазначений підмножина трикутної сітки є просто з’єднаним поліамантом .

Більше прикладів

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

відповідає поліаманту

13-алмаз без отвору

яка просто пов'язана.


*   *
** **
 ***

відповідає поліаманту

9-іаманд без отвору

яка просто пов'язана.


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

відповідає не -поліям

13 трикутників, які нічого не цікавого

які не були б просто зв'язані, навіть якщо б це було був поліамант.

Спеціальність введення

  • Вхід буде складатися лише з зірочок, пробілів та каналів рядків.
  • Першим символом введення завжди буде пробіл чи зірочка (відповідна висхідному трикутнику у верхньому лівому куті сітки).
  • У першому та останньому рядках завжди буде хоча б одна зірочка.
  • Немає гарантій, що рядки після першого рядка не будуть порожніми. Двома каналами рядків підряд можуть відображатися в законному введенні.
  • Довжина рядків не повинна бути однаковою.

Умова виграшу

Це є , тому найкоротша відповідь у байтах виграє.

Випробування

Карти Truthy:

1) *

2) *
   *

3) **

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

5) *   *
   ** **
    ***

6) *
   **
    *

7)    **
     ***
   ****

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

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

Фальшиві карти:

1) *
   *
   *

2) * *

3) *
    *

4)  **
   **

5) ***

   ***

6) ** **
   *****

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

8)  *
    *

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

1
приємне запитання. Якщо трикутні сітки стануть річчю, я можу запропонувати їх представити як, наприклад, AV VA\nVAVAVзамість того ** **\n*****, щоб людині було легше візуалізувати. Я вже вніс редагування однієї з діаграм ASCII Мартіна.
Рівень Св. Св.

Я особливо не переймався читабельністю людини, ні. Я хотів зробити все, що було б простіше для читання програми, залишаючись маленькими.
Кінтопія

Отже, у фальшивому iff є розділ, "з'єднаний" лише кутами?
Майкл Кляйн

1
Або якщо є частини, які взагалі не з'єднані. Мартін висловив це так: Правда, якщо фігура і земля з'єднані уздовж країв, так що для заливки площини достатньо двох заповнювачів.
Кінтопія

Відповіді:


4

Равлики , 95 байт

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}+~

Це насправді страждало від дублювання, оскільки я не реалізував макроси або будь-які зворотні посилання. Що потрібно зробити, це перевірити, чи існує для кожної зірки шлях до самої лівої зірки на верхній лінії; і для кожного простору є шлях до краю сітки.

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

Я не розумію, як це працює, але це повністю працює.
Кінтопія

3

CJam, 101 98 байт

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

Спробуйте в Інтернеті.

Нарешті я подолав свій страх здійснити заливку в CJam. Це приблизно так некрасиво, як я очікував, і це, безумовно, можна пограти в гольф.

Загальна ідея полягає у виконанні двох заповнювачів (які реально реалізуються як видалення зі списку невізованих комірок). Перший прохід видалить усі місця, доступні від краю. Потім другий прохід вибере перший *у порядку читання та видалить із цього всі трикутники. Якщо і тільки якщо отриманий список порожній, поліамант був просто з'єднаний:

  • Якщо в поліаманті була дірка, перша заливка не зможе дістати та вийняти цю діру.
  • Якщо вхід складається з декількох від'єднаних поліамантів, друга заливна заливка не може дістатись та видалити їх усі.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.