あのポリゴンは誰ですか?


14

トポロジカルサーフェスを表す便利で便利な方法は、基本ポリゴンを使用することです。多角形の各辺は別の辺と一致し、平行または反平行のいずれかになります。たとえば、これはトーラスの基本的なポリゴンです。

トーラス

これがトーラスである理由を理解するために、ポリゴンが紙であると想像できます。適切な表面を作成するために、対応するエッジが矢印が同じ方向に並ぶように紙を曲げます。トーラスの例では、紙を円柱に丸めて、2つの青いエッジ(ラベルb)を接続することから始めます。次に、チューブを取り出して曲げて、2つの赤いエッジ(a)が互いに接続するようにします。トーラスとも呼ばれるドーナツ型にする必要があります。

これには少し注意が必要です。エッジの1つが反対方向に向いている次のポリゴンで同じことをしようとすると:

クラインボトル

トラブルに巻き込まれる可能性があります。これは、このポリゴンが3次元に埋め込むことができないクラインボトルを表しているためです。このポリゴンをクラインボトルに折り畳む方法を示すウィキペディアの図を次に示します。

クラインボトルの折りたたみ


ご想像のとおり、ここでのタスクは、基本的なポリゴンを取得し、どのサーフェスであるかを判断することです。4面ポリゴン(処理する必要がある唯一のサーフェス)には、4つの異なるサーフェスがあります。

彼らです

  • トーラス

  • クラインボトル

  • 射影平面

これははないので、入力として画像を受け取るとは思わないが、代わりに便利な表記法を使用して基本ポリゴンを表現します。上記の2つの例で、同じ文字(aまたはb)で対応するエッジに名前を付け、ねじれたエッジにねじれを示す追加のマークを付けたことに気付いたかもしれません。時計回りに進んで、上端から開始して各端のラベルを書き留めると、各基本ポリゴンを表す表記を取得できます。

たとえば、提供されたトーラスはababになり、クラインボトルはab - abになります。私たちの挑戦では、ねじれたエッジをネガでマークする代わりに、文字を大文字にします。

仕事

文字列が与えられると、それが基本ポリゴンを表すかどうかを判断し、その適切な表面に対応する値を出力します。サーフェスに正確な名前を付ける必要はありません。それぞれが4つのサーフェスの1つを表す4つの異なる出力値を必要とし、5番目の値が不適切な入力を表します。すべての基本的なケースは「簡単なテスト」セクションで説明されており、すべての車は、1つまたは無効な車と同形です。

ルール

  • 側面には常にaおよびbのラベルが付けられるわけではありませんが、常に文字でラベルが付けられます。

  • 有効な入力は、4つの文字で構成され、2つのタイプと2つのタイプがあります。有効な入力を得るには、常に正しいサーフェスを出力する必要があります。

  • 無効な入力は拒否する必要があります(サーフェスを表す4つの値のいずれも出力しません)。4つのサーフェスと区別できる限り、入力を拒否するときに何でもできます。

  • これはので、目標はソースコードのバイト数を最小限にすることです。

テスト

簡単なテスト

abab Torus
abAb Klein Bottle
abaB Klein Bottle
abAB Projective Plane
aabb Klein Bottle
aAbb Projective Plane
aabB Projective Plane
aAbB Sphere
abba Klein Bottle
abBa Projective Plane
abbA Projective Plane
abBA Sphere

トリッキーテスト

ABAB  Torus
acAc  Klein Bottle
Emme  Projective Plane
zxXZ  Sphere
aaab  Bad input
abca  Bad input
abbaa Bad input
ab1a  Bad input

ababトーラスとaabbクラインのボトルはなぜですか?
ニール

@Neil ababは最初の段落の例です。説明を参照してください。 ここではその理由を示す画像であるaabbのと同じであるabAbクラインの壷であるが。
ポストロックガーフハンター

1
どのような悪い入力を処理し、悪いものとして識別する必要がありますか?すべての可能な文字列?印刷可能なASCII?長さに制限はありますか?関数を記述する場合、非文字列オブジェクトが渡される可能性がありますか?本当に、この入力処理ビジネス全体がカメレオンの挑戦だと思います。
-xnor

1
@WheatWizardその場合、タイトルと本文でそれを明確にしてください。ルールまでずっと数学のように読みます。そこでさえ、分類するだけでなく検証するというゲームを変える要件を見落としがちです。
xnor

2
それとは別に、文字列を特定のカテゴリに分類する理由についての説明が欠けていると思います。なぜなら、人々は分類の背後にある計算を行うことを期待していないように思われるからです。テストケースからルールを解くことができると思いますが、それは理想からはほど遠いです。
xnor

回答:


6

網膜、123バイト

i`(.)(\1..)
$2$1
iG`^([a-z])(?!\1)([a-z])(\1\2|\2\1)$
(..)\1
T
.*(.).\1.*|(.)(.)\3\2
B
(.)..\1|.(.)\2.
P
i`(.)..\1
S
....
P

オンラインでお試しください!@JonathanAllenに、私のコードのバグといくつかのバイトを保存する方法を指摘してくれてありがとう。また、私は自分でもう少しバイトしたので、特定の数字を彼にクレジットすることはできません。説明:

i`(.)(\1..)
$2$1

最初の2文字が同じ場合(大文字と小文字を無視)、最初の文字を4番目に移動します。これにより、テストする必要があるケースの数が減ります。

iG`^([a-z])(?!\1)([a-z])(\1\2|\2\1)$

正確に4文字がない場合、または最初の2文字が同じである場合、または最後の2文字が最初の2文字を複製しない場合、すべてを削除します。

(..)\1
T

トーラスは簡単なケースです:文字のペア、繰り返し一致するケース。

.*(.).\1.*|(.)(.)\3\2
B

ペアのいずれかが大文字と小文字が一致する場合(この場合、ペアのもう一方は大文字と小文字が一致しない必要があります)、それはクラインボトルです。また、ペアが大文字と小文字を一致しているが逆になっている場合は、クラインボトルでもあります。

(.)..\1|.(.)\2.
P

一方、ペアが逆になっているが、ペアの1つだけが大文字と小文字を一致する場合、それは射影平面です。

i`(.)..\1
S

また、ペアが逆になっているが大文字と小文字が一致していない場合、それは球体です。(i`.(.)\1.また動作します。)

....
P

それ以外はすべて射影平面です。


1
@JonathanAllanヒントをありがとう。願わくば、このバージョンの検証が改善されることを願っています。
ニール

P:私だけは、ロジック自分うまくことができれば
ジョナサン・アラン

1

ゼリー52 51 58 バイト

+7バイト、使用したマッピングが一部の(例ではない)ケース変更シナリオで機能しないことがわかりました。

“nḲ⁾⁶ƥ¦ṃṗḋ’b4s4‘µṙJ;U$µ€
,ŒsṢÞṪµŒlĠL€⁼2,2ȧ⁸i@€ṢeЀ¢TṪ’:3,8

文字列を受け取り、次の5つの異なる一貫した値を返すモナドリンク:

  • [-1,-1] - 無効入力
  • [0,0] -射影平面
  • [1,0] -クラインボトル
  • [2,0] - 球
  • [2,1] -トーラス

オンラインでお試しください!またはテストスイートをご覧ください。

どうやって?

基本的なポリゴンは次のとおりです。

  • 回転しても変化しない-紙をハンドルのように回すことができます
  • 反射下で変化しない-紙を裏返すことができます
  • 大文字と小文字を逆にしても変更はありませんa-sとAsを入れ替えたり、bsとBsを入れ替えても効果はありません-方向を一致させたいので、実際のラベルは重要ではありません。

そのため、9つの等価クラスがあります。コードは4つの整数のリストを作成し、それぞれが9つの等価クラスの1つの例を表し、それぞれの4つの回転を作成し、それぞれを反映してから、各リストに入力の翻訳形式が存在するかどうかを確認します。クラスは順序付けられているP,P,P,K,K,K,S,S,Tため、0から始まるインデックス整数をそれぞれで除算すると[3,8]4つの有効な出力が得られます(インデックス付けは1ベースであり、アトムe0存在しない場合に返されるため、無効なケースでは1それぞれの[3,8]収率[-1,-1]で減算して整数で除算します)。

“nḲ⁾⁶ƥ¦ṃṗḋ’b4s4‘µṙJ;U$µ€ - Link 1, symmetries of the 9 equivalence classes: no arguments
“nḲ⁾⁶ƥ¦ṃṗḋ’              - base 250 number                 1704624888339951310984
           b4            - convert to base 4               [1,1,3,0,1,2,2,0,1,2,3,0,0,2,2,0,1,3,1,0,2,1,2,0,2,3,1,0,3,1,2,0,2,0,2,0]
             s4          - split into 4s                   [[1,1,3,0],[1,2,2,0],[1,2,3,0],[0,2,2,0],[1,3,1,0],[2,1,2,0],[2,3,1,0],[3,1,2,0],[2,0,2,0]]
               ‘         - increment (vectorises)          [[2,2,4,1],[2,3,3,1],[2,3,4,1],[1,3,3,1],[2,4,2,1],[3,2,3,1],[3,4,2,1],[4,2,3,1],[3,1,3,1]]
                µ     µ€ - for €ach:                       ...e.g. [2,2,4,1]:
                  J      -   range of length               [1,2,3,4]
                 ṙ       -   rotate left by (vectorises)   [[2,4,1,2],[4,1,2,2],[1,2,2,4],[2,2,4,1]]
                     $   -   last two links as a monad:
                    U    -     upend (reverse each)        [[2,1,4,2],[2,2,1,4],[4,2,2,1],[1,4,2,2]]
                   ;     -     concatenate                 [[2,4,1,2],[4,1,2,2],[1,2,2,4],[2,2,4,1],[2,1,4,2],[2,2,1,4],[4,2,2,1],[1,4,2,2]]

,ŒsṢÞṪµŒlĠL€⁼2,2ȧ⁸i@€ṢeЀ¢TṪ’:3,8 - Main link: string s      e.g. "xOxO"
 Œs                               - swap case                     "XoXo"
,                                 - pair with s                   ["xOxO","XoXo"]
    Þ                             - sort by:
   Ṣ                              -   sort                        ["xOxO","XoXo"]
     Ṫ                            - tail                          "XoXo"
      µ                           - monadic chain separation, call that v
       Œl                         - convert to lowercase          "xoxo"
         Ġ                        - group indices by value        [[2,4],[1,3]]
          L€                      - length of each                [2,2]
             2,2                  - 2 pair 2                      [2,2]
            ⁼                     - equal? (1 if so, 0 if not)    1
                 ⁸                - link's left argument, v       "XoXo"
                ȧ                 - and (v if equal, 0 if not)    "XoXo"
                     Ṣ            - sort v                        "XoXo"
                  i@€             - first index for €ach          [1,3,1,3]
                         ¢        - call the last link (1) as a nilad
                       Ѐ         - map over right:
                      e           -   exists in?                  [0,0,0,0,0,0,0,0,1]
                          T       - truthy indexes                [                9]
                           Ṫ      - tail (empty list yields 0)    9
                            ’     - decrement                     8
                              3,8 - 3 pair 8                      [3,8]
                             :    - integer division (vectorises) [2,1]

注: 11バイト(ŒlĠL€⁼2,2ȧ⁸)は、入力文字列が正しい形式であるとしてのみ検証します。このコードなしab1aではabBa、射影平面であるかのように評価される場合を除き、すべてのサンプルケースはパスします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.