รูปหลายเหลี่ยมนั้นคือใคร


14

วิธีที่สะดวกและมีประโยชน์เพื่อเป็นตัวแทนของพื้นผิวทอพอโลยีอยู่กับรูปหลายเหลี่ยมพื้นฐาน แต่ละด้านของรูปหลายเหลี่ยมจับคู่กับอีกด้านหนึ่งและสามารถเป็นแบบขนานหรือแบบขนาน เช่นนี่คือรูปหลายเหลี่ยมพื้นฐานของพรู :

ฐานรองดอก

เพื่อหาสาเหตุว่าทำไมมันถึงเป็นพรูเราสามารถจินตนาการว่ารูปหลายเหลี่ยมของเราเป็นแผ่นกระดาษ ในการสร้างพื้นผิวที่เหมาะสมเราต้องการดัดกระดาษของเราเพื่อให้ขอบที่สอดคล้องกันเรียงกันกับลูกศรของมันในลักษณะเดียวกัน สำหรับตัวอย่างของพรูเราสามารถเริ่มต้นด้วยการกลิ้งกระดาษเป็นทรงกระบอกเพื่อให้ขอบสีฟ้าทั้งสอง (ป้ายชื่อ b) เชื่อมต่อกัน ตอนนี้เราเอาหลอดของเราแล้วงอเพื่อให้ทั้งสองขอบสีแดง (ป้าย a) เชื่อมต่อซึ่งกันและกัน เราควรมีรูปโดนัทหรือที่เรียกว่าพรู

นี่อาจเป็นเรื่องหลอกลวง หากคุณพยายามทำเช่นเดียวกันกับรูปหลายเหลี่ยมต่อไปนี้โดยที่หนึ่งในขอบนั้นไปในทิศทางตรงกันข้าม:

ขวดไคลน์

คุณอาจพบว่าตัวเองมีปัญหา นี่เป็นเพราะรูปหลายเหลี่ยมนี้แสดงถึงขวด Kleinซึ่งไม่สามารถฝังในสามมิติ นี่คือแผนภาพจากวิกิพีเดียที่แสดงว่าคุณสามารถพับรูปหลายเหลี่ยมนี้เป็นขวด Klein ได้อย่างไร:

พับขวด Klein


ในขณะที่คุณอาจเดาได้ว่างานที่นี่คือการใช้รูปหลายเหลี่ยมพื้นฐานและกำหนดพื้นผิวมัน สำหรับรูปหลายเหลี่ยมสี่เหลี่ยม (พื้นผิวเดียวที่คุณจะต้องใช้ในการจัดการ) มีพื้นผิวที่แตกต่างกัน 4 แบบ

พวกเขาเป็น

  • ฐานรองดอก

  • ขวดไคลน์

  • รูปทรงกลม

  • ระนาบ Projective

ตอนนี้นี่ไม่ใช่ดังนั้นฉันไม่ได้คาดหวังให้คุณถ่ายภาพเป็นอินพุทแทนเราจะใช้สัญกรณ์ที่สะดวกในการแสดงรูปหลายเหลี่ยมพื้นฐาน คุณอาจสังเกตเห็นในสองตัวอย่างข้างต้นว่าฉันตั้งชื่อขอบที่สอดคล้องกันด้วยตัวอักษรเดียวกัน (ทั้ง a หรือ b) และฉันให้ขอบบิดเป็นเครื่องหมายเพิ่มเติมเพื่อแสดงการบิดของมัน หากเราเริ่มที่ขอบด้านบนและเขียนฉลากสำหรับแต่ละขอบตามเข็มนาฬิกาเราจะได้สัญกรณ์ที่แสดงถึงรูปหลายเหลี่ยมพื้นฐานแต่ละอัน

ตัวอย่างเช่น Torus ให้จะกลายเป็นAbabและขวดไคลน์จะกลายเป็นAbab สำหรับความท้าทายของเราเราจะทำให้มันง่ายยิ่งขึ้นแทนที่จะทำเครื่องหมายขอบที่บิดเป็นลบเราจะทำให้ตัวอักษรเหล่านั้นเป็นตัวพิมพ์ใหญ่แทน

งาน

รับสายกำหนดว่ามันหมายถึงรูปหลายเหลี่ยมพื้นฐานและการส่งออกค่าที่สอดคล้องกับพื้นผิวที่เหมาะสมของมันคือ คุณไม่จำเป็นต้องตั้งชื่อพื้นผิวให้ถูกต้องคุณเพียงแค่ต้องการค่าเอาต์พุตที่แตกต่างกัน 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

Trickier Tests

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

คือเหตุผลที่ababพรูและaabbขวด Klein?
Neil

@Neil ababเป็นตัวอย่างในวรรคแรกคุณสามารถดูคำอธิบายได้ นี่คือภาพที่แสดงว่าทำไมถึงaabbเป็นแบบเดียวกันกับabAbขวด Klein
โพสต์ Rock Garf Hunter

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

หากหนึ่งในคู่ตรงกับกรณี (ในกรณีอื่น ๆ ของคู่จะต้องตรงกับกรณี) นั่นคือขวด Klein อีกทางเลือกหนึ่งถ้าคู่ที่ตรงกับกรณี แต่กลับกันก็เป็นขวด Klein

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

หากในอีกทางหนึ่งทั้งคู่จะกลับรายการ แต่มีเพียงคู่เดียวที่ตรงกับกรณีและนั่นคือระนาบ projective

i`(.)..\1
S

และถ้าทั้งคู่กลับด้าน แต่ไม่ตรงกับตัวเรือนนั่นก็คือทรงกลม ( i`.(.)\1.ก็ใช้ได้เหมือนกัน)

....
P

ทุกอย่างอื่นเป็นระนาบ projective


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

ลิงก์ monadic ที่ใช้สตริงและส่งคืนค่าที่สอดคล้องและแตกต่างกันห้าค่าต่อไปนี้:

  • [-1,-1] - อินพุตไม่ถูกต้อง
  • [0,0] - ระนาบโปรเจค
  • [1,0] - ขวดไคลน์
  • [2,0] - ทรงกลม
  • [2,1] - พรู

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

รูปหลายเหลี่ยมพื้นฐานใด ๆ คือ:

  • ภายใต้การหมุนไม่เปลี่ยนแปลง - คน ๆ หนึ่งอาจหันกระดาษเหมือนพวงมาลัย
  • ไม่เปลี่ยนแปลงภายใต้เงาสะท้อน - อาจพลิกกระดาษ
  • ไม่เปลี่ยนแปลงภายใต้การพลิกกลับกรณี - หนึ่งอาจสลับas และAs และ / หรือสลับbs และBs โดยไม่มีผลกระทบ - เนื่องจากเราต้องการจับคู่ทิศทางคำแนะนำป้ายจริงไม่สำคัญ

เช่นนี้มีคลาสที่เทียบเท่าเก้าคลาส รหัสจะสร้างรายการของจำนวนเต็มสี่จำนวนแต่ละตัวแทนหนึ่งตัวอย่างของหนึ่งในเก้าคลาสที่เท่าเทียมกัน, สร้างการหมุนสี่ครั้งของแต่ละ, สะท้อนแต่ละของเหล่านั้นแล้วตรวจสอบว่ามีการแปลรูปแบบของการป้อนข้อมูลในแต่ละรายการ มีการสั่งคลาสP,P,P,K,K,K,S,S,Tดังนั้นการใช้ดัชนีจำนวนเต็ม 0-based หารด้วยแต่ละ[3,8]ผลลัพธ์ให้ผลลัพธ์ที่ถูกต้องสี่รายการ (การจัดทำดัชนีคือ 1-based และอะตอม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เป็นระนาบโปรเจค

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.