Đa giác đó là ai?


14

Một cách thuận tiện và hữu ích để biểu diễn các bề mặt tôpô là với một đa giác cơ bản . Mỗi bên trên một đa giác khớp với một bên khác và có thể là song song hoặc chống song song. Ví dụ, đây là đa giác cơ bản của hình xuyến :

Torus

Để tìm hiểu tại sao đây là một hình xuyến, chúng ta có thể tưởng tượng đa giác của chúng ta là một tờ giấy. Để làm cho bề mặt phù hợp, chúng tôi muốn uốn cong giấy của chúng tôi để các cạnh tương ứng thẳng hàng với mũi tên của chúng đi theo cùng một cách. Đối với ví dụ hình xuyến của chúng ta, chúng ta có thể bắt đầu bằng cách cuộn giấy vào một hình trụ sao cho hai cạnh màu xanh (có nhãn b) được kết nối. Bây giờ chúng tôi lấy ống của chúng tôi và uốn cong nó để hai cạnh màu đỏ (được dán nhãn a) kết nối với nhau. Chúng ta nên có một hình dạng bánh rán, còn được gọi là hình xuyến.

Điều này có thể nhận được một chút phức tạp hơn. Nếu bạn cố gắng làm tương tự với đa giác sau, trong đó một trong các cạnh sẽ đi theo hướng ngược lại:

Chai Klein

bạn có thể thấy mình gặp rắc rối Điều này là do đa giác này đại diện cho chai Klein không thể được nhúng trong ba chiều. Dưới đây là sơ đồ từ wikipedia cho thấy cách bạn có thể gấp đa giác này vào một chai Klein:

Gấp một chai Klein


Như bạn có thể đã đoán nhiệm vụ ở đây là lấy một đa giác cơ bản và xác định bề mặt của nó. Đối với đa giác bốn mặt (các bề mặt duy nhất bạn sẽ được yêu cầu xử lý) có 4 bề mặt khác nhau.

họ đang

  • Torus

  • Chai Klein

  • Quả cầu

  • Mặt phẳng chiếu

Bây giờ đây không phải là vì vậy tôi không mong đợi bạn lấy hình ảnh làm đầu vào thay vào đó chúng tôi sẽ sử dụng một ký hiệu thuận tiện để thể hiện đa giác cơ bản. Bạn có thể nhận thấy trong hai ví dụ ở trên mà tôi đặt tên các cạnh tương ứng có cùng chữ cái (a hoặc b) và tôi đã cho cạnh xoắn một dấu bổ sung để hiển thị xoắn của nó. Nếu chúng ta bắt đầu ở cạnh trên và viết nhãn cho mỗi cạnh khi chúng ta đi theo chiều kim đồng hồ, chúng ta có thể nhận được một ký hiệu đại diện cho mỗi đa giác cơ bản.

Ví dụ, Torus được cung cấp sẽ trở thành abab và Chai Klein sẽ trở thành ab - ab . Đối với thử thách của chúng tôi, chúng tôi sẽ làm cho nó đơn giản hơn nữa, thay vì đánh dấu các cạnh xoắn bằng âm, thay vào đó chúng tôi sẽ làm cho các chữ cái đó được viết hoa.

Bài tập

Cho một chuỗi xác định nếu nó đại diện cho một đa giác cơ bản và đưa ra một giá trị tương ứng với bề mặt thích hợp của nó. Bạn không cần đặt tên chính xác cho các bề mặt, bạn chỉ cần 4 giá trị riêng biệt đầu ra, mỗi giá trị đại diện cho một trong 4 bề mặt với giá trị thứ năm thể hiện đầu vào không chính xác. Tất cả các trường hợp cơ bản được đề cập trong phần Thử nghiệm đơn giản , mọi chiếc xe sẽ được đồng hình hóa với một trong những hoặc không hợp lệ.

Quy tắc

  • Các mặt sẽ không luôn luôn được gắn nhãn a và b, nhưng chúng sẽ luôn được gắn nhãn bằng các chữ cái.

  • Đầu vào hợp lệ sẽ bao gồm 4 chữ cái, hai loại một và hai loại khác. Bạn phải luôn xuất ra bề mặt chính xác cho đầu vào hợp lệ.

  • Bạn nên từ chối (không xuất bất kỳ giá trị nào trong 4 giá trị đại diện cho bề mặt) đầu vào không hợp lệ. Bạn có thể làm bất cứ điều gì khi từ chối một đầu vào, miễn là nó có thể phân biệt được với 4 bề mặt

  • Đây là vì vậy mục tiêu là giảm thiểu số lượng byte trong mã nguồn của bạn.

Xét nghiệm

Các bài kiểm tra đơn giản

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

Trickier Test

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

Tại sao là ababmột hình xuyến và aabbmột chai Klein?
Neil

@Neil abablà ví dụ trong đoạn đầu tiên, bạn có thể xem đó để giải thích. Dưới đây là một hình ảnh cho thấy tại sao aabbgiống như abAbmột chai Klein.
Đăng Rock Garf Hunter

1
Những đầu vào xấu nào chúng ta phải xử lý và xác định là xấu? Tất cả các chuỗi có thể? ASCII có thể in? Bất kỳ giới hạn về chiều dài? Nếu chúng ta viết một hàm, nó có thể được truyền vào một đối tượng không phải chuỗi không? Thực sự, toàn bộ doanh nghiệp xử lý đầu vào này đánh tôi như một thách thức tắc kè hoa.
xnor

1
@WheatWizard Trong trường hợp đó, bạn có thể vui lòng làm rõ điều đó trong tiêu đề và nội dung không? Nó đọc giống như toán học cho đến khi Rules và thậm chí có thể dễ dàng bỏ lỡ yêu cầu về trò chơi điện tử để xác nhận thay vì chỉ phân loại.
xnor

2
Một cách riêng biệt, tôi nghĩ rằng một lời giải thích bị thiếu về những gì làm cho một chuỗi được phân loại thành một thể loại nhất định, vì bạn dường như không mong đợi mọi người thực hiện toán học đằng sau phân loại. Tôi nghĩ rằng tôi có thể giải đố các quy tắc từ các trường hợp thử nghiệm, nhưng đó là xa lý tưởng.
xnor

Câu trả lời:


6

Võng mạc , 123 byte

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

Hãy thử trực tuyến! Cảm ơn @Jonathan ALLen đã chỉ ra một lỗi trong mã của tôi và cả cách lưu một số byte; Tôi cũng đã tự đánh gôn thêm một số byte để tôi không thể tin anh ta cho một con số cụ thể. Giải trình:

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

Nếu hai chữ cái đầu tiên giống nhau (bỏ qua trường hợp), di chuyển chữ cái đầu tiên thành thứ tư. Điều này làm giảm số lượng các trường hợp mà tôi cần phải kiểm tra.

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

Nếu không có chính xác bốn chữ cái, hoặc hai chữ cái đầu tiên giống nhau hoặc hai chữ cái cuối cùng không trùng lặp hai chữ cái đầu tiên, sau đó xóa mọi thứ.

(..)\1
T

Hình xuyến là trường hợp dễ dàng: một cặp chữ cái, trường hợp khớp lặp lại.

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

Nếu một trong các cặp khớp với vỏ (trong trường hợp khác của cặp phải khớp với vỏ), thì đó là chai Klein. Ngoài ra, nếu cặp khớp với vỏ nhưng bị đảo ngược, thì đó cũng là một chai Klein.

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

Nếu mặt khác, cặp đảo ngược, nhưng chỉ một trong các cặp khớp với trường hợp, thì đó là một mặt phẳng chiếu.

i`(.)..\1
S

Và nếu cặp đảo ngược nhưng không khớp với trường hợp, thì đó là một hình cầu. ( i`.(.)\1.cũng sẽ làm việc.)

....
P

Mọi thứ khác là một mặt phẳng chiếu.


1
@Jonathan ALLan Cảm ơn vì tiền boa; hy vọng phiên bản này có xác nhận tốt hơn.
Neil

Giá như tôi có thể tự mình tìm ra logic: p
Jonathan Allan

1

Thạch , 52 51 58 byte

7 byte, tôi thấy rằng ánh xạ tôi sử dụng không hoạt động đối với một số trường hợp (ví dụ tắt) trường hợp thay đổi trường hợp.

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

Một liên kết đơn âm lấy một chuỗi và trả về năm giá trị nhất quán, riêng biệt sau:

  • [-1,-1] - đâu vao không hợp lệ
  • [0,0] - mặt phẳng chiếu
  • [1,0] - Chai Klein
  • [2,0] - quả cầu
  • [2,1] - hình xuyến

Hãy thử trực tuyến! hoặc xem thử nghiệm .

Làm sao?

Bất kỳ đa giác cơ bản là:

  • không thay đổi khi quay - người ta có thể lật giấy như vô lăng
  • không thay đổi dưới sự phản chiếu - người ta có thể lật tờ giấy
  • không thay đổi trong trường hợp đảo ngược - người ta có thể hoán đổi as và As và / hoặc hoán đổi bs và Bs không có hiệu lực - vì chúng tôi muốn khớp với hướng mà nhãn thực tế là không quan trọng.

Như vậy có chín lớp tương đương. Mã tạo danh sách gồm bốn số nguyên, mỗi số đại diện cho một ví dụ của một trong chín lớp tương đương, tạo bốn phép quay của mỗi lớp, phản ánh từng số đó và sau đó kiểm tra xem một dạng dịch của đầu vào có tồn tại trong mỗi danh sách không. Các lớp được sắp xếp theo thứ tự P,P,P,K,K,K,S,S,T, do đó, lấy số nguyên chỉ số dựa trên 0 chia cho mỗi [3,8]sản lượng cho bốn kết quả đầu ra hợp lệ (lập chỉ mục là dựa trên 1 và nguyên tử etrả về 0cho sự không tồn tại, do đó trừ 1và chia số nguyên cho mỗi [3,8]sản lượng [-1,-1]cho trường hợp không hợp lệ ).

“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]

Lưu ý: 11 byte ( ŒlĠL€⁼2,2ȧ⁸) chỉ xác nhận chuỗi đầu vào là dạng chính xác - không có mã này, mọi trường hợp ví dụ đều vượt qua ngoại trừ ab1ađược đánh giá như thể nó là abBamột mặt phẳng chiếu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.