三角グリッド:単純に接続されたポリダイヤモンド


9

三角グリッドキックを使用している間、三角グリッドにはポリオミノに相当するものがあることを指摘しておきます。それらはポリダイヤモンドと呼ばれ、それらのエッジに沿って正三角形を互いに接着することによって形成された形状です。この課題では、三角グリッドのどのサブセットがポリダイヤモンドであるか、およびそれらに穴があるかどうかを決定します。穴が開いたポリダイヤモンドを作るのに必要な三角形は9つだけなので、コードはできるだけ短くする必要があります。

グリッド

入力にはマーティンの三角グリッドレイアウトを使用します。

三角グリッド

三角形の中心がほぼ長方形のグリッドを形成し、左上の三角形が「上を向いている」ことに注意してください。次に、このグリッドのサブセットを記述することができます。次に、含まれる三角形と含まれない三角形を示す長方形の「星図」を指定します。たとえば、次のマップ:

** **
*****

穴を含む最小のポリダイヤモンドに対応します:

9穴付きダイヤモンド

上記の例のように穴(領域ではない領域によって全ての側で囲まれポリイアモンドの一部含まポリイアモンドあるが)トポロジー的に言えば、ない単に接続します

チャレンジ

上記の「スターマップ」を入力として受け取り、三角グリッドの示されたサブセットが単純に接続されたpolyiamondである場合にのみ、真実を出力する関数またはプログラムを記述します。

その他の例

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

ポリダイヤモンドに対応

穴のない13ダイヤモンド

単純に接続されています。


*   *
** **
 ***

ポリダイヤモンドに対応

穴のない9ダイヤモンド

単純に接続されています。


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

ポリダイヤモンドに対応

何も面白くない13の三角形

それがポリダイヤモンドであったとしても、単純に接続されることはありません。

入力仕様

  • 入力は、アスタリスク、スペース、および改行のみで構成されます。
  • 入力の最初の文字は常にスペースまたはアスタリスクになります(グリッドの左上隅にある上向きの三角形に対応)。
  • 最初と最後の行には常に少なくとも1つのアスタリスクがあります。
  • 最初の行の後の行が空にならないという保証はありません。行内の2つの改行が正当な入力に表示される場合があります。
  • 行の長さはすべて同じである必要はありません。

当選条件

これはなので、バイト単位の最短の回答が優先されます。

テストケース

真実の地図:

1) *

2) *
   *

3) **

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

5) *   *
   ** **
    ***

6) *
   **
    *

7)    **
     ***
   ****

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

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

偽の地図:

1) *
   *
   *

2) * *

3) *
    *

4)  **
   **

5) ***

   ***

6) ** **
   *****

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

8)  *
    *

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

1
いい質問だ。三角形のグリッドが物になりそうな場合は、人間が視覚化しやすくするためではAV VA\nVAVAVなく、たとえば、** **\n*****として表示することをお勧めします。マーティンのASCII図の1つを既に編集しました。
Level River St

特に人間の可読性は気にしていませんでした。私は、プログラムが小さいままで読みやすいように何でもしたいと思っていました。
クイントピア2016年

だから、基本的に、コーナーでのみ「つながっている」セクションがある場合は、falseですか?
Michael Klein

1
または、まったく接続されていない部品がある場合。マーティンはこのように言います。図と地面が両方ともエッジに沿って接続されている場合は真であり、平面の色を変更するには2つの塗りつぶしで十分です。
クイントピア2016年

回答:


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

どのように機能するかはわかりませんが、完全に機能します。
クイントピア2016年

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で塗りつぶしを実装することへの恐怖をようやく克服しました。それは私が予想したほど醜いです、そしてそれは間違いなくゴルフすることができます。

一般的なアイデアは、2つの塗りつぶしを実行することです(実際には、未訪問セルのリストからの削除として実装されます)。最初のパスは、エッジから到達可能なすべてのスペースを削除します。次に、2番目のパスは最初のパスを*読み取り順に選択し、そこから到達可能なすべての三角形を削除します。結果のリストが空の場合にのみ、ポリダイヤモンドは単に接続されました:

  • ポリダイヤモンドに穴が開いている場合、最初の塗りつぶしはその穴に到達して削除することができません。
  • 入力が複数の切断されたポリダイヤモンドで構成されている場合、2番目の塗りつぶしはそれらすべてに到達して削除することができません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.