Symme-Try This Triangle Trial


17

長さが正の三角形の数字1、3、6、10、15 ...)である文字列は、スペースと改行を追加する(および同じ読み上げ順序で保持する)ことにより、「正三角形の三角形」に配置できます。

たとえば、長さ10の文字列ABCDEFGHIJは次のようになります。

   A
  B C
 D E F
G H I J

それが唯一の文字が含まれています除き、そのようなA列を取り込みプログラムや関数を記述0して1。(入力が有効であると想定できます。)

結果の「正三角形の三角形」の場合、表示される対称性のタイプを示す4つの数値のいずれかを出力(印刷またはリターン)します。

  • 2三角形に左右対称がある場合に出力します。つまり、任意の1つのコーナーから反対側の中点への対称線を持ちます。

    例:

     0
    1 1
    
     1
    0 1
    
      0
     0 1
    0 1 0
    
       1
      1 1
     1 0 1 
    0 1 1 1
    
  • 3三角形に回転対称がある場合に出力します。つまり、視覚的な変化なしに120°回転させることができます。

    例:

       0
      1 0
     0 1 1
    0 1 0 0
    
       0
      0 1
     1 0 0
    0 0 1 0
    
        1
       0 1
      1 1 1
     1 1 1 0
    1 0 1 1 1
    
         1
        0 1
       0 0 1
      1 0 0 0
     1 0 0 0 0
    1 0 0 1 1 1
    
  • 6三角形に左右対称と回転対称の両方がある場合に出力します。つまり、2との両方を出力するための条件に一致します3

    例:

    0
    
    1
    
     0
    0 0
    
      1
     0 0
    1 0 1
    
       0
      0 0
     0 1 0
    0 0 0 0
    
  • 1三角形が左右対称でも回転対称でもない場合に出力します。

    例:

      1
     1 0
    0 0 0
    
      0
     0 1
    1 0 1
    
       1
      1 0
     1 1 1 
    1 1 1 1
    
        1
       1 1
      1 1 1 
     0 0 0 1
    1 1 1 1 1
    

バイト単位の最短コードが優先されます。Tiebreakerは以前の回答です。

別に任意末尾の改行から、入力文字列は、空間/改行パディング又は構造を有していないかもしれない-それは普通であるべきである0のと1の。

必要に応じて、およびの代わりに任意の2つの印刷可能なASCII文字を使用できます。01

テストケース

例から直接取られた。

011 -> 2
101 -> 2
001010 -> 2
1111010111 -> 2
0100110100 -> 3
0011000010 -> 3
101111111010111 -> 3
101001100010000100111 -> 3
0 -> 6
1 -> 6
000 -> 6
100101 -> 6
0000100000 -> 6
110000 -> 1
001101 -> 1
1101111111 -> 1
111111000111111 -> 1

入力を120°回転させると、もちろん同じ出力になります。


そのタイトルはただで痛い ......
Rɪᴋᴇʀ

9
@EᴀsᴛᴇʀʟʏIʀᴋそれを無視するためだけにトライ。
カルビンの趣味

@HelkaHombaなぜ...なぜ
...-clismique

回答:


9

CJam、37 29 28 27バイト

3バイトを節約してくれたSp3000に感謝します。

q{T):T/(\s}h]{z_Wf%_}3*])e=

テストスイート。

これはこの挑戦からのいくつかの三角形回転トリックを再利用ます。

これは同じバイト数でも機能します:

q{T):T/(\s}h]3{;z_Wf%_}%)e=

説明

最初に、上記にリンクした三角形の投稿の簡単な要約。三角形を2D(不規則)リストとして表します。たとえば、

[[0 1 1]
 [0 0]
 [0]]

三角形の対称グループには6つの要素があります。三角形を回転させると長さ3のサイクルが、ある軸に沿ってミラーリングすると2のサイクルがあります。便利なことに、回転は2つの異なる反射に対応しています。これを行うには、次のリフレクションを使用します。

  1. リストを転置すると、メインの対角線に沿ってリストが反映されるため、次のようになります。

    [[0 0 0]
     [1 0]
     [1]]
    
  2. 各行を反転することは、上部の2つのコーナーを入れ替える反射を表します。これを、転置の結果に適用します:

    [[0 0 0]
     [0 1]
     [1]]
    

これらの2つの変換を使用し、中間結果を保持することで、入力の6つの対称性をすべて生成できます。

さらに注意すべき点は、次のようなリストでの転置の動作です。

[[0]
 [1 0]
 [1 0 0]
 []]

なぜなら、それが入力を分割した後になってしまうからです。便利なことに、転置後、CJamはすべての行を左にフラッシュします。つまり、これにより実際に余分なものが取り除か[]れ、上記の2つの変換に役立つ形式になります(反射対称を超えて三角形の実際のレイアウトを変更せずに):

[[0 1 1]
 [0 0]
 [0]]

邪魔にならないように、ここにコードを示します。

q       e# Read input.
{       e# While the input string isn't empty yet...
  T):T  e#   Increment T (initially 0) and store it back in T.
  /     e#   Split input into chunks of that size.
  (     e#   Pull off the first chunk.
  \s    e#   Swap with remaining chunks and join them back together
        e#   into a single string.
}h
]       e# The stack now has chunks of increasing length and an empty string
        e# as I mentioned above. Wrap all of that in an array.
{       e# Execute this block 3 times...
  z_    e#   Transpose and duplicate. Remember that on the first iteration
        e#   this gets us a triangle of the desired form and on subsequent
        e#   iterations it adds one additional symmetry to the stack.
  Wf%_  e#   Reverse each row and duplicate.
}3*
        e# The stack now has all 6 symmetries as well as a copy of the
        e# last symmetry.
]       e# Wrap all of them in a list.
)       e# Pull off the copy of the last symmetry.
e=      e# Count how often it appears in the list of symmetries.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.