O Çokgen kim?


14

Topolojik yüzeyleri temsil etmenin kullanışlı ve kullanışlı bir yolu temel bir çokgendir . Bir çokgendeki her bir taraf başka bir tarafla eşleşir ve paralel veya anti-paralel olabilir. Örneğin, burada bir torusun temel çokgeni :

yumru

Bunun neden bir torus olduğunu anlamak için çokgenimizin bir kağıt olduğunu hayal edebiliriz. Düzgün bir yüzey elde etmek için, ilgili kenarların okları aynı şekilde olacak şekilde kağıdımızı bükmek istiyoruz. Torus örneğimiz için, kağıdı iki mavi kenarın (b etiketli) bağlanması için bir silindire yuvarlayarak başlayabiliriz. Şimdi tüpümüzü alıyoruz ve iki kırmızı kenar (a etiketli) birbirine bağlanacak şekilde büküyoruz. Torus olarak da adlandırılan bir çörek şekline sahip olmalıyız.

Bu biraz daha hileli olabilir. Kenarlardan birinin zıt yöne gittiği aşağıdaki çokgenle aynı işlemi yapmaya çalışırsanız:

Klein Şişe

kendinizi belada bulabilirsiniz. Bunun nedeni, bu çokgenin üç boyuta gömülemeyen Klein şişesini temsil etmesidir . İşte wikipedia'dan bu çokgeni bir Klein şişesine nasıl katlayabileceğinizi gösteren bir diyagram:

Bir Klein Şişesini Katlama


Tahmin edebileceğiniz gibi, buradaki görev temel bir çokgen almak ve bunun hangi yüzey olduğunu belirlemek. Dört taraflı çokgenler için (işlemeniz gereken tek yüzey) 4 farklı yüzey vardır.

Onlar

  • yumru

  • Klein Şişe

  • küre

  • Projektif düzlem

Şimdi bu değil, bu yüzden bir görüntüyü girdi olarak almanızı beklemiyorum, bunun yerine temel çokgeni temsil etmek için uygun bir gösterim kullanacağız. Yukarıdaki iki örnekte, aynı harfe (veya a veya b) karşılık gelen kenarları adlandırdığımı ve bükülmüş kenara, bükülmesini göstermek için ek bir işaret verdiğimi fark etmiş olabilirsiniz. Üst kenardan başlayıp saat yönünde giderken her kenarın etiketini yazarsak, her bir temel çokgeni temsil eden bir gösterim alabiliriz.

Örneğin Torus olacak İşletmesi abab ve Klein Şişe olacaktı abab . Zorluğumuz için bunu daha da basit hale getireceğiz, bükülmüş kenarları negatif ile işaretlemek yerine, bu harfleri büyük harfe dönüştüreceğiz.

Görev

Bir dize verildiğinde temel bir çokgeni temsil edip etmediğini belirleyin ve uygun yüzeye karşılık gelen bir değer verin. Yüzeyleri tam olarak adlandırmanız gerekmez, her biri 4 yüzeyden birini temsil eden 4 çıkış ayrı değerine ihtiyacınız vardır ve beşinci değer yanlış girişi temsil eder. Tüm temel durumlar Basit Testler bölümünde ele alınmıştır, her araba bir veya geçersiz izomorfik olacaktır.

kurallar

  • Taraflar her zaman a ve b ile etiketlenmez, ancak her zaman harflerle etiketlenir.

  • Geçerli giriş, ikisi biri diğeri ikisi olmak üzere 4 harften oluşacaktır. Geçerli giriş için her zaman doğru yüzeyi çıkarmalısınız.

  • Geçersiz girişi reddetmelisiniz (yüzeyleri temsil eden 4 değerden hiçbirini çıkarmayın). Bir girişi reddederken, 4 yüzeyden ayırt edilebilir olduğu sürece her şeyi yapabilirsiniz

  • Bu bu yüzden amaç kaynak kodunuzdaki bayt sayısını en aza indirmektir.

Testler

Basit Testler

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 Testleri

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

Neden ababbir torus ve aabbbir Klein şişesi?
Neil

@Neil ababilk paragraftaki örnektir, orada bir açıklama arayabilirsiniz. İşte neden Klein şişesiyle aabbaynı olduğunu gösteren bir resim abAb.
Rock Garf Hunter Post

1
Hangi kötü girdilerle başa çıkmak ve kötü olarak tanımlamak zorundayız? Tüm olası dizeler? Yazdırılabilir ASCII? Uzunluk sınırı var mı? Bir işlev yazarsak, dize olmayan bir nesneye geçirilebilir mi? Gerçekten, tüm bu girdi işleme işi bukalemun meydan okuması olarak beni vuruyor.
xnor

1
@WheatWizard Bu durumda, lütfen başlıkta ve gövdede bunu netleştirebilir misiniz? Kurallara kadar matematik gibi okur ve hatta sınıflandırma yapmaktan ziyade doğrulamak için oyun mekaniği gereksinimini kaçırmak kolaydır.
xnor

2
Ayrı olarak, bence bir dizenin belirli bir kategoride sınıflandırılmasını sağlayan şeyin bir açıklaması eksik, çünkü insanların sınıflamanın arkasındaki matematiği yapmasını beklemiyorsunuz gibi görünüyor. Test senaryolarındaki kuralları çözebileceğimi düşünüyorum, ama bu ideal olmaktan uzak.
xnor

Yanıtlar:


6

Retina , 123 bayt

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

Çevrimiçi deneyin! @JonathanAllen kodumu bir hata işaret ve ayrıca bazı bayt kaydetmek için teşekkür ederiz; Ben de kendime daha fazla bayt golf böylece belirli bir rakam için kredi olamaz. Açıklama:

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

İlk iki harf aynı ise (büyük / küçük harf göz ardı edilirse), ilk harfi dördüncü olacak şekilde hareket ettirin. Bu, test etmem gereken vaka sayısını azaltır.

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

Tam olarak dört harf yoksa veya ilk iki harf aynıysa veya son iki harf ilk ikisini çoğaltmazsa, her şeyi silin.

(..)\1
T

Torus kolay durumdur: bir çift harf, tekrarlanan eşleşen durum.

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

Çiftlerden biri büyük / küçük harfle eşleşirse (bu durumda diğer çiftin büyük / küçük harf eşleşmesi gerekir), bu bir Klein şişesidir. Alternatif olarak, çift büyük / küçük harf eşleşir ancak ters çevrilirse, aynı zamanda bir Klein şişesidir.

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

Öte yandan, çift tersine çevrilirse, ancak çiftten sadece biri durumla eşleşirse, bu projektif bir düzlemdir.

i`(.)..\1
S

Ve eğer çift tersine çevrilir ancak ikisi de büyük / küçük harf eşleşmezse, o zaman bir küredir. ( i`.(.)\1.ayrıca işe yarar.)

....
P

Diğer her şey yansıtmalı bir düzlemdir.


1
@JonathanAllan Tavsiye için teşekkürler; umarım bu sürüm daha iyi bir doğrulamaya sahiptir.
Neil

Sadece mantığı kendim halledebilseydim: p
Jonathan Allan

1

Jöle , 52 51 58 bayt

+7 bayt, kullandığım eşlemenin bazı (örnek dışı) durum değişikliği senaryolarında işe yaramadığını gördüm.

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

Bir dize alan ve aşağıdaki beş farklı, tutarlı değeri döndüren monadik bir bağlantı:

  • [-1,-1] - Geçersiz Giriş
  • [0,0] - projektif düzlem
  • [1,0] - Klein şişesi
  • [2,0] - küre
  • [2,1] - torus

Çevrimiçi deneyin! veya test takımına bakın .

Nasıl?

Herhangi bir temel çokgen:

  • dönüş altında değişmeden - kağıt direksiyon gibi döndürülebilir
  • yansıma altında değişmeden - kağıt ters çevrilebilir
  • büyük / küçük harf değişimi tersine çevrildiğinde - as ve As ile ve / veya bs ve Bs ile herhangi bir etki yaratmadan değiştirilebilir - çünkü asıl etiket önemsizdir.

Bu haliyle dokuz denklik sınıfı vardır. Kod, her biri dokuz eşdeğerlik sınıfının bir örneğini temsil eden dört tamsayıdan oluşan listeler oluşturur, her birinin dört rotasyonunu oluşturur, bunların her birini yansıtır ve daha sonra her bir listede çevrilmiş bir giriş formunun olup olmadığını kontrol eder. Sınıflar sıralanmıştır P,P,P,K,K,K,S,S,T, bu nedenle 0 tabanlı indeks tamsayısının her bir [3,8]verime bölünmesi dört geçerli çıktıyı verir (indeksleme 1 tabanlıdır ve atom yokluk için egeri döner 0, bu nedenle geçersiz durum için verimlerin 1her birine göre çıkarma ve tamsayı bölme ).[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]

Not: 11 bayt ( ŒlĠL€⁼2,2ȧ⁸) yalnızca giriş dizesini doğru formda olarak doğrular - bu kod olmadan projektif düzlem ab1agibi değerlendirilenler dışında her örnek durum geçer abBa.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.