那是谁的多边形?


14

表示拓扑表面的一种方便且有用的方法是使用基本多边形。多边形的每一侧都与另一侧匹配,并且可以是平行的或反平行的。例如,这是圆环的基本多边形:

圆环面

为了弄清楚为什么这是一个圆环,我们可以想象我们的多边形是一张纸。为了制作适当的表面,我们希望弯曲纸张,以使相应的边缘与箭头的方向相同。对于我们的圆环示例,我们可以从将纸卷成圆柱体开始,以便连接两个蓝色边缘(标记为b)。现在,我们将试管弯曲并将其两个红色边缘(标记为a)彼此连接。我们应该有一个甜甜圈形状,也称为圆环形状。

这可能会有点棘手。如果您尝试对以下多边形进行相同处理,则其中一个边沿相反的方向移动:

克莱因瓶

您可能会遇到麻烦。这是因为此多边形代表的Klein瓶子无法嵌入三个维度。这是维基百科的图表,显示了如何将这个多边形折叠成Klein瓶子:

折叠一个克莱因瓶


您可能已经猜到了,这里的任务是获取基本多边形并确定其为哪个表面。对于四个面的多边形(您将需要处理的唯一曲面),有4个不同的曲面。

他们是

  • 圆环面

  • 克莱因瓶

  • 投射平面

现在不是 因此我不希望您将图像作为输入,而是使用方便的符号来表示基本多边形。您可能已经注意到,在上面的两个示例中,我用相同的字母(a或b)命名了相应的边,并且给扭曲的边附加了一个标记以显示其扭曲。如果我们从上边缘开始并沿顺时针方向写下每个边缘的标签,我们将得到一个表示每个基本多边形的符号。

例如,提供的Torus将变为abab,而Klein瓶将变为ab - ab。对于我们的挑战,我们将使其变得更加简单,而不是用负号标记扭曲的边缘,而改为将那些字母大写。

任务

给定一个字符串,确定它是否代表基本多边形,并输出一个与其正确表面相对应的值。您无需精确命名表面,只需要4个输出不同的值即可,每个值代表4个表面之一,第5个值代表不正确的输入。所有基本案例都包含在“ 简单测试”中部分介绍,每辆车将同构或无效。

规则

  • 侧面将不会总是用a和b标记,但是它们总是会用字母标记。

  • 有效输入将包含4个字母,其中两个是一种类型,而另外两种是两种类型。您必须始终输出正确的表面以进行有效输入。

  • 您应该拒绝(不输出代表曲面的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是第一段中的示例,您可以在此处查看解释。 是一张图片,说明为什么aabbabAbKlein瓶子相同。
发布Rock Garf Hunter

1
我们必须处理哪些不良输入并将其识别为不良输入?所有可能的字符串?可打印的ASCII吗?长度有限制吗?如果我们编写一个函数,是否可以将其传递给非字符串对象?确实,整个输入处理业务给我带来了变色龙挑战。
xnor

1
@WheatWizard在这种情况下,请您在标题和正文中注明一下吗?一直到规则为止,它的读法都像数学一样,甚至在那里,很容易错过改变游戏规则的要求,而不是仅仅进行分类。
xnor

2
另外,我认为对于将字符串归为给定类别的原因尚缺乏解释,因为您似乎不希望人们进行分类背后的数学运算。我想我可以从测试案例中弄清楚规则,但这远非理想。
xnor

Answers:


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

如果前两个字母相同(忽略大小写),请将第一个字母移动到第四个字母。这减少了我需要测试的案例数量。

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

如果不完全是四个字母,或者前两个字母相同,或者后两个字母不重复前两个字母,则删除所有内容。

(..)\1
T

圆环是简单的情况:一对字母,重复匹配的情况。

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

如果一对中的一个匹配大小写(在这种情况下,另一对必须匹配大小写),则为克莱因瓶。或者,如果该对匹配大小写但相反,那么它也是一个克莱因瓶。

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

另一方面,如果该对相反,但只有其中一个匹配大小写,则这是一个投影平面。

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

一个单子链接,该字符串采用字符串并返回以下五个不同的一致值:

  • [-1,-1] - 输入无效
  • [0,0] -射影飞机
  • [1,0] -克莱因瓶
  • [2,0] -球体
  • [2,1] -圆环

在线尝试!或查看测试套件

怎么样?

任何基本多边形是:

  • 旋转不变-可以像方向盘一样转动纸张
  • 在反射下保持不变-可以将纸张翻转
  • 在大小写反转的情况下保持不变-可以互换as和As和/或互换bs和Bs无效,因为我们要匹配方向,实际标签无关紧要。

因此,有九个等效类。该代码创建了四个整数的列表,每个整数表示九个等效类之一的示例,创建每个四个等效类的旋转,反映了每个等效类,然后检查每个列表中是否存在输入的转换形式。这些类是有序的P,P,P,K,K,K,S,S,T,因此,将基于0的索引整数除以每个均会[3,8]产生四个有效输出(索引基于1且原子e返回0表示不存在,因此对于无效情况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投影平面进行评估。

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.