그 다각형은 누구입니까?


14

토폴로지 표면을 표현하는 편리하고 유용한 방법은 기본 다각형을 사용하는 것 입니다. 다각형의 각면은 다른면과 일치하며 평행 또는 반 평행 일 수 있습니다. 예를 들어 다음은 원환 체 의 기본 다각형입니다 .

큰 쇠시리

이것이 왜 원환 체인지 알아 내기 위해 다각형이 한 장의 종이라고 상상할 수 있습니다. 적절한 표면을 만들기 위해 해당 가장자리가 화살표와 같은 방향으로 정렬되도록 용지를 구부리고 싶습니다. 원환 체 예제의 경우, 두 개의 파란색 가장자리 (b로 표시)가 연결되도록 용지를 실린더에 넣는 것으로 시작합니다. 이제 우리는 튜브를 가져 와서 두 개의 빨간 가장자리 (a로 표시)가 서로 연결되도록 구부립니다. 우리는 원환 체라고도 불리는 도넛 모양을 가져야합니다.

조금 까다로울 수 있습니다. 모서리 중 하나가 반대 방향으로 진행되는 다음 다각형으로 동일한 작업을 시도하는 경우 :

클라인 병

문제가 생길 수도 있습니다. 이것은이 다각형이 3 차원으로 삽입 될 수없는 클라인 병 을 나타 내기 때문 입니다. 다음은이 다각형을 클라인 병에 접는 방법을 보여주는 위키 백과의 다이어그램입니다.

클라인 병 접기


여기서 추측 할 수 있듯이 기본 다각형을 취하고 표면을 결정하는 것입니다. 4면 다각형 (처리해야하는 유일한 표면)의 경우 4 개의 서로 다른 표면이 있습니다.

그들은

  • 큰 쇠시리

  • 클라인 병

  • 구체

  • 프로젝션 비행기

이제 이것은 아닙니다 가 아니므로 이미지를 입력으로 사용하지 않을 것이라고 생각합니다. 대신 기본 다각형을 나타내는 편리한 표기법을 사용합니다. 위의 두 예에서 동일한 문자 (a 또는 b)로 해당 모서리의 이름을 지정했으며 꼬인 모서리에 꼬임을 표시하기 위해 추가 표시를 주었다는 것을 알 수 있습니다. 위쪽 가장자리에서 시작하여 시계 방향으로 갈 때 각 가장자리의 레이블을 적어두면 각 기본 다각형을 나타내는 표기법을 얻을 수 있습니다.

예를 들어 제공된 원환 체는 abab 이되고 Klein Bottle은 ab - ab가됩니다. 됩니다. 우리의 도전을 위해 우리는 꼬인 가장자리를 음수로 표시하는 대신 더 간단하게 만들 것입니다. 대신 글자를 대문자로 만듭니다.

직무

주어진 문자열이 기본 다각형을 나타내는 지 확인하고 적절한 표면에 해당하는 값을 출력합니다. 표면의 이름을 정확하게 지정할 필요는 없습니다. 각각 4 개의 표면 중 하나를 나타내는 4 개의 출력 고유 값이 필요합니다. 모든 기본 사례는 간단한 테스트 에서 다룹니다. 섹션 , 모든 차량은 차량 중 하나에 동종 또는 동종입니다.

규칙

  • 변에는 항상 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

@Neil abab은 첫 번째 단락의 예이므로 설명을 찾을 수 있습니다. 다음 은 클라인 병과 aabb같은 이유를 보여주는 이미지 abAb입니다.
Post Rock Garf Hunter 2

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

처음 두 글자가 같은 경우 (대소 문자 무시) 첫 번째 글자를 네 번째 글자로 이동하십시오. 이를 통해 테스트해야 할 사례 수가 줄어 듭니다.

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 팁 주셔서 감사합니다; 잘만되면이 버전은 더 나은 유효성 검사를합니다.
Neil

내가 논리를 스스로 해결할 수 있다면 : p
Jonathan Allan

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] -원환 체

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

어떻게?

모든 기본 다각형은 다음과 같습니다.

  • 회전하지 않고 변하지 않음-스티어링 휠처럼 종이를 돌릴 수 있음
  • 반사되지 않은 상태에서 용지를 뒤집을 수 있음
  • 변화에 따라 케이스 반전 - 일 5 월 스왑 as와 A의 및 / 또는 스왑 b의와는 B아무 효과이야 - 우리가 방향을 일치시킬 이후 실제 라벨이 하찮은이다.

따라서 9 개의 등가 클래스가 있습니다. 이 코드는 각각 9 개의 등가 클래스 중 하나의 예를 나타내는 4 개의 정수 목록을 작성하고 각 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.