三角网格:简单连接的Polyiamonds


9

当我们处于三角形网格踢的时候,我想指出的是,在三角形网格上有一个等同于多米诺骨牌的东西。它们被称为polyiamonds,是通过沿其边缘将等边三角形粘合在一起而形成的形状。在此挑战中,您将要确定三角形网格的哪些子集为多边形,以及它们是否在其中具有孔。因为只需要9个三角形就可以制造出一个带孔的多边形,因此您的代码需要尽可能短。

网格

我们将使用Martin的三角形网格布局作为输入:

三角形网格

注意以下事实:三角形的中心形成一个大致矩形的网格,并且左上三角形“指向”上方。然后,我们可以通过给出矩形“星形图”来描述此网格的子集,该星形图指示包括哪些三角形和不包括哪些三角形。例如,此地图:

** **
*****

对应于包含一个孔的最小的多边形:

9孔钻石

孔洞

其中包含像上面的例子中的孔(区域不是polyiamond,其由所述的两个区在所有侧面包围的部分A polyiamond )不是,拓扑来说,简单地连接

挑战

编写一个函数或程序,当且仅当所指示的三角形网格的子集是简单连接的多边形时,才将如上所述的“星图”作为输入并输出真值。

更多例子

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

对应于polyiamond

13颗无孔钻石

只需连接即可。


*   *
** **
 ***

对应于polyiamond

9颗无孔钻石

只需连接即可。


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

对应于 polyiamond

13个没有意思的三角形

这不会简单地连接,即使它一个polyiamond。

输入规格

  • 输入将仅由星号,空格和换行符组成。
  • 输入的第一个字符将始终是空格或星号(对应于网格左上角的向上指向的三角形)。
  • 第一行和最后一行始终至少会有一个星号。
  • 无法保证第一行之后的行不会为空。连续两个换行符可能会出现在合法输入中。
  • 线长不必全部相同。

获奖条件

这是 ,因此以字节为单位的最短答案会获胜。

测试用例

真实地图:

1) *

2) *
   *

3) **

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

5) *   *
   ** **
    ***

6) *
   **
    *

7)    **
     ***
   ****

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

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

虚假地图:

1) *
   *
   *

2) * *

3) *
    *

4)  **
   **

5) ***

   ***

6) ** **
   *****

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

8)  *
    *

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

1
好问题。如果要成为三角网格,我可以建议以三角网格为代表,AV VA\nVAVAV而不是** **\n*****因为它使人类更容易可视化。我已经对Martin的ASCII图之一进行了编辑。

我并不是特别关注人类的可读性,不是。我想做一些让程序在保持较小尺寸的同时更易于阅读的方法。
quintopia '16

因此,基本上,如果仅存在通过角“连接”的部分,那是错误的?
Michael Klein

1
或者,如果有部分根本没有连接。马丁这样说:正确的是,图形和地面都沿边缘连接,因此2个泛洪填充足以使平面重新着色。
quintopia '16

Answers:


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

我不了解它是如何工作的,但它完全可以工作。
quintopia '16

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中实施洪水填充的恐惧。正如我所预期的那样丑陋,而且绝对可以打高尔夫球。

总体思路是执行两个泛洪填充(实际上是作为未访问单元列表中的删除项实现的)。第一遍将删除边缘所有可到达的空间。然后第二遍将按*阅读顺序选择第一个,并从中删除所有可到达的三角形。当且仅当结果列表为空时,polyiamond才被简单连接:

  • 如果polyiamond有一个洞,则第一个洪水填充将无法到达并移除该洞。
  • 如果输入包含多个断开的多边形,则第二个洪水填充将无法到达并移除所有它们。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.