कौन है बहुभुज?


14

टोपोलॉजिकल सतहों का प्रतिनिधित्व करने का एक सुविधाजनक और उपयोगी तरीका एक मौलिक बहुभुज के साथ है । बहुभुज पर प्रत्येक पक्ष दूसरे पक्ष से मेल खाता है और समानांतर या विरोधी समानांतर हो सकता है। उदाहरण के लिए यहाँ एक धार का मूल बहुभुज है :

टोरस्र्स

यह पता लगाने के लिए कि यह एक टोरस है जिससे हम कल्पना कर सकते हैं कि हमारा बहुभुज कागज की एक शीट है। उचित सतह बनाने के लिए हम अपने कागज को मोड़ना चाहते हैं ताकि संबंधित किनारों को अपने तीर के साथ उसी तरह से रेखाबद्ध किया जा सके। हमारे टोरस उदाहरण के लिए हम पेपर को एक सिलेंडर में रोल करके शुरू कर सकते हैं ताकि दो नीले किनारे (लेबल वाले बी) जुड़े हों। अब हम अपनी ट्यूब लेते हैं और इसे मोड़ते हैं ताकि दो लाल किनारों (लेबल वाले) एक दूसरे से कनेक्ट हो जाएं। हमारे पास एक डोनट आकार होना चाहिए, जिसे टोरस भी कहा जाता है।

यह थोड़ा पेचीदा हो सकता है। यदि आप निम्नलिखित बहुभुज के साथ ऐसा करने की कोशिश करते हैं जहां किनारों में से एक विपरीत दिशा में जा रहा है:

क्लेन बोतल

आप खुद को किसी परेशानी में पा सकते हैं। ऐसा इसलिए है क्योंकि यह बहुभुज क्लेन बोतल का प्रतिनिधित्व करता है जिसे तीन आयामों में एम्बेड नहीं किया जा सकता है। यहां विकिपीडिया से एक आरेख दिखाया गया है कि आप इस बहुभुज को एक क्लेन बोतल में कैसे मोड़ सकते हैं:

एक क्लेन बोतल को तह करना


जैसा कि आपने अनुमान लगाया होगा कि यहां कार्य एक मूल बहुभुज लेना है और यह निर्धारित करना है कि यह किस सतह पर है। चार पक्षीय बहुभुजों के लिए (केवल सतहों को आपको संभालना आवश्यक होगा) 4 अलग-अलग सतहें हैं।

वो हैं

  • टोरस्र्स

  • क्लेन बोतल

  • क्षेत्र

  • प्रक्षेप्य तल

अब यह इसलिए मैं आपसे इनपुट के रूप में इमेज लेने की उम्मीद नहीं करता हूं, इसके बजाय हम मूल बहुभुज का प्रतिनिधित्व करने के लिए एक सुविधाजनक नोटेशन का उपयोग करेंगे। आपने ऊपर दिए दो उदाहरणों में देखा होगा कि मैंने एक ही अक्षर (या तो या बी) के साथ संबंधित किनारों को नाम दिया है, और मैंने मुड़ को दिखाने के लिए अतिरिक्त किनारे को एक अतिरिक्त चिह्न दिया है। यदि हम ऊपरी किनारे पर शुरू करते हैं और प्रत्येक किनारे के लिए लेबल लिखते हैं क्योंकि हम दक्षिणावर्त जाते हैं तो हम एक अंकन प्राप्त कर सकते हैं जो प्रत्येक मौलिक बहुभुज का प्रतिनिधित्व करता है।

उदाहरण के लिए प्रदान की गई टोरस अबाब बन जाएगी और क्लेन बोतल एब - एबी बन जाएगी । हमारी चुनौती के लिए हम इसे और भी सरल बना देंगे, एक नकारात्मक के साथ मुड़ किनारों को चिह्नित करने के बजाय हम उन अक्षरों को पूंजीकृत करेंगे।

कार्य

एक स्ट्रिंग को देखते हुए अगर यह एक मूल बहुभुज का प्रतिनिधित्व करता है और एक मूल्य का उत्पादन करता है जो इसकी उचित सतह के अनुरूप है। आपको सतहों को वास्तव में नाम देने की आवश्यकता नहीं है, आपको बस 4 आउटपुट अलग-अलग मानों की आवश्यकता है प्रत्येक 4 सतहों में से एक को पांचवें इनपुट के साथ अनुचित इनपुट का प्रतिनिधित्व करता है। सभी मूल मामले सरल टेस्ट अनुभाग में शामिल किए गए हैं , प्रत्येक कार एक या अमान्य में से आइसोमॉर्फिक होगी।

नियम

  • पक्षों को हमेशा ए और बी के साथ लेबल नहीं किया जाएगा, लेकिन उन्हें हमेशा अक्षरों के साथ लेबल किया जाएगा।

  • वैध इनपुट में 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क्लेन बोतल क्यों है ?
नील

@ नील ababपहले पैराग्राफ में उदाहरण है, आप स्पष्टीकरण के लिए वहां देख सकते हैं। यहाँ एक चित्र दिखा रहा है कि क्यों aabbवही है abAbजो क्लेन बोतल है।
पोस्ट रॉक गार्फ हंटर

1
खराब इनपुट को हमें क्या संभालना है और खराब को पहचानना है? सभी संभव तार? मुद्रण योग्य ASCII? लंबाई पर कोई सीमा? यदि हम एक फ़ंक्शन लिखते हैं, तो क्या यह एक गैर-स्ट्रिंग ऑब्जेक्ट पास किया जा सकता है? वास्तव में, यह पूरा इनपुट प्रोसेसिंग व्यवसाय मुझे गिरगिट चुनौती के रूप में प्रभावित करता है।
xnor

1
@HeatWizard उस मामले में, क्या आप शीर्षक और निकाय में स्पष्ट कर सकते हैं? यह नियम तक सभी तरह से गणित को पढ़ता है, और यहां तक ​​कि सिर्फ वर्गीकरण के बजाय मान्य करने के लिए गेमचिंग की आवश्यकता को याद करना आसान है।
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 टिप के लिए धन्यवाद; उम्मीद है कि इस संस्करण में बेहतर सत्यापन है।
नील

अगर केवल मैं ही तर्क को हल कर सकता था: पी
जोनाथन एलन

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] - टोरस

इसे ऑनलाइन आज़माएं! या परीक्षण सूट देखें।

कैसे?

कोई भी मूल बहुभुज है:

  • रोटेशन के तहत अपरिवर्तित - एक स्टीयरिंग व्हील की तरह कागज को मोड़ सकता है
  • प्रतिबिंब के तहत अपरिवर्तित - एक कागज को पलट सकता है
  • मामले में उलट-फेर के तहत अपरिवर्तित - कोई भी स्वैप aऔर 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एक अनुमानित विमान था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.