“KNOT” veya “NOT”?


144

Karışık bir dize ASCII sanat temsilini işleyen ve basit bir döngüye dolaştırılıp karıştırılamayacağına karar veren bir program yazın. Karışmayan karakterleri kullanarak -ve |yatay ve dikey bölümleri +temsil etmek ve köşeleri temsil etmek için temsil edilir. Dizenin kendi üzerinden geçtiği yerler şu şekilde temsil edilir:

            |                           |   
         -------                     ---|---
            |                           |   
(Horizontal segment on top)   (Vertical segment on top)

İpin uçları birbirine bağlanır; Gevşek bir uç yok.

Programınız dizenin basit bir döngüye dolaştırılmayacağına karar verirse, sözcüğü çıkarmalıdır KNOT. Aksi takdirde, sözcüğü çıkarmalıdır NOT.

Bu bir mücadelesidir, bu nedenle en kısa geçerli cevap (kaynak kod baytlarıyla ölçülür) kazanacaktır.

Sınırları

ASCII girişi, 25 karaktere kadar 80 karakterden oluşacaktır. Tüm çizgilerin aynı uzunlukta boşluklarla doldurulduğunu varsayabilirsiniz.

Örnekler

Giriş:

+-------+    +-------+    
|       |    |       |    
|   +---|----+   +-------+
|   |   |        |   |   |
+-------|------------|---+
    |   |        |   |    
    +---+        +---+    

Çıktı:

KNOT

Giriş:

+----------+         
|          |         
|    +--------------+
|    |     |        |
|    |   +-|----+   |
|    |   | |    |   |
|    +-----+    |   |
|        |      |   |
|        +------|---+
|               |    
+---------------+    

Çıktı:

NOT

Referanslar


36
+1 Harika bir soru. İnsanları bu düğüm teorisine atlamaları için cesaretlendirmek için buna bir heves koymaya çalıştım.
Dijital Travma

2
Bunun bir düğüm olduğunu düşünebilir miyiz (muhtemelen bilinmeyen) veya> 1 bağlı bileşenlerin bir bağlantısı olabilir mi?
msh210

@ msh210 Evet, tek bir düğüm olduğunu varsayıyorum :-)
squeamish ossifrage

Yanıtlar:


94

Python 3, 457 316 306 bayt

E=enumerate
V={'+'}
Q=[[(-j,i,k)for i,u in E(open(0))for j,v in E(u)for k in[{v}&V,'join'][u[j:j+2]=='|-']]]
while Q:
 a,b,c,d,*e=A=tuple(x//2for y,x in sorted((y,x)for x,y in E(Q.pop())));e or exit('NOT')
 if{A}-V:V|={A};Q+=[[c,d,a,b]+e,A,A[2:]+A[:2]][a<c<b<d:][c<a<d<b:]
 if b==d:Q=[[a,c]+e]
exit('KNOT')

Ha?

Program önce düğümü aşağıdaki kısıtlamalara sahip olan dikdörtgen bir şemaya dönüştürür:

  1. Aynı çizgide iki dikey veya yatay segment yoktur.
  2. Yatay segment üzerinde dikey segment geçmez.

Örneğin, ilk test senaryosu aşağıdaki dikdörtgen diyagrama dönüştürülür:

+-----------+            
|           |            
|           | +-------+  
|           | |       |  
| +-------+ | |       |  
| |       | | |       |  
| |     +---+ |       |  
| |     | |   |       |  
| |     | +---+       |  
| |     |             |  
| |     |       +-------+
| |     |       |     | |
+-----+ |       |     | |
  |   | |       |     | |
  | +---+       |     | |
  | | |         |     | |
  | | +-------------+ | |
  | |           |   | | |
  | |           | +---+ |
  | |           | | |   |
  | |           | | +---+
  | |           | |      
  +-+           | |      
                | |      
                +-+      

dikey segmentlerin y koordinatlarının sırasını sağdan sola benzersiz olarak temsil ediyoruz:

(5,10, 1,9, 8,10, 9,12, 5,12, 1,4, 0,3, 2,4, 3,7, 6,8, 7,11, 2,11, 0,6)

Daha sonra, Ivan Dynnikov, “Bağlantıların yay sunumu” bölümünde açıklandığı gibi dikdörtgen diyagramın sadeleştirmelerini arar . Monotonik sadeleştirme ”, 2004 . Dynnikov, unknot'un dikdörtgen şeklindeki herhangi bir diyagramından, önemsiz diyagramda biten basitleştirici hareketler dizisi olduğunu kanıtladı. Kısaca, izin verilen hamle şunları içerir:

  1. Dikey (veya yatay) bölümleri döngüsel olarak geçirme;
  2. Belirli yapılandırma kısıtlamaları altında ardışık dikey (veya yatay) segmentleri değiştirme.
  3. Diyagramın en köşesinde yer alan bitişik üç köşeyi tek bir köşeyle değiştirmek.

Resimler için kağıda bakınız. Bu açık bir teorem değil; Reidemeister, kullanılan geçiş sayısını artırmayan hareketler yaparsa tutmaz. Ancak yukarıdaki belirli türdeki sadeleştirmeler için doğru olduğu ortaya çıktı.

(Uygulamayı sadece dikey parçalara izin vererek basitleştiriyoruz, aynı zamanda tüm düğümün yatay ile dikey olarak değiştirilmesine izin veriyoruz.)

gösteri

$ python3 knot.py <<EOF
+-------+    +-------+    
|       |    |       |    
|   +---|----+   +-------+
|   |   |        |   |   |
+-------|------------|---+
    |   |        |   |    
    +---+        +---+    
EOF
KNOT
$ python3 knot.py <<EOF
+----------+         
|          |         
|    +--------------+
|    |     |        |
|    |   +-|----+   |
|    |   | |    |   |
|    +-----+    |   |
|        |      |   |
|        +------|---+
|               |    
+---------------+    
EOF
NOT
$ python3 knot.py <<EOF  # the Culprit
        +-----+  
        |     |  
+-----------+ |  
|       |   | |  
|   +-+ | +---|-+
|   | | | | | | |
| +-|-------+ | |
| | | | | |   | |
+-|-+ | | +---+ |
  |   | |       |
  +---|---------+
      | |        
      +-+        
EOF
NOT
$ python3 knot.py <<EOF  # Ochiai unknot
    +-----+    
    |     |    
  +-|---------+
  | |     |   |
  | | +-+ |   |
  | | | | |   |
+-|-|---|-|-+ |
| | | | | | | |
| | | +---|---+
| | |   | | |  
+-------+ | |  
  | |     | |  
  | +-------+  
  |       |    
  +-------+    
EOF
NOT
$ python3 knot.py <<EOF  # Ochiai unknot plus trefoil
    +-----+ +-----+
    |     | |     |
  +-|---------+   |
  | |     | | |   |
  | | +-+ | +---+ |
  | | | | |   | | |
+-|-|---|-|-+ +---+
| | | | | | |   |  
| | | +---|-----+  
| | |   | | |      
+-------+ | |      
  | |     | |      
  | +-------+      
  |       |        
  +-------+        
EOF
KNOT
$ python3 knot.py <<EOF  # Thistlethwaite unknot
      +---------+        
      |         |        
    +---+ +---------+    
    | | | |     |   |    
    | +-------+ |   |    
    |   | |   | |   |    
    |   | | +---+   |    
    |   | | | |     |    
    |   | +-------+ |    
    |   |   | |   | |    
    |   +-------+ | |    
    |       | | | | |    
+-----------+ | | | |    
|   |         | | | |    
| +-----------+ | | |    
| | |           | | |    
| | +-------------+ |    
| |             |   |    
| |             +-----+  
| |                 | |  
| |                 +---+
| |                   | |
+---------------------+ |
  |                     |
  +---------------------+
EOF
NOT
$ python3 knot.py <<EOF  # (−3,5,7)-pretzel knot
      +-------------+
      |             |
    +-|-----+       |
    | |     |       |
  +-|-+   +-------+ |
  | |     | |     | |
+-|-+   +---+   +---+
| |     | |     | |  
| |   +---+   +---+  
| |   | |     | |    
| | +---+   +---+    
| | | |     | |      
| +---+   +---+      
|   |     | |        
|   |   +---+        
|   |   | |          
|   | +---+          
|   | | |            
|   +---+            
|     |              
+-----+              
EOF
KNOT
$ python3 knot.py <<EOF  # Gordian unknot
+-------------+                 +-------------+
|             |                 |             |
| +---------+ |                 | +---------+ |
| |         | |                 | |         | |
| | +-------------+         +-------------+ | |
| | |       | |   |         |   | |       | | |
| | | +---------+ |         | +---------+ | | |
| | | |     | | | |         | | | |     | | | |
| +-------+ | +-------+ +-------+ | +-------+ |
|   | |   | |   | |   | |   | |   | |   | |   |
+-------+ | +-------+ | | +-------+ | +-------+
    | | | |     | | | | | | | |     | | | |    
    | +-------+ | | | | | | | | +-------+ |    
    |   | |   | | | | | | | | | |   | |   |    
    +-------+ | | | | | | | | | | +-------+    
        | | | | | | | | | | | | | | | |        
        | +-----+ | | | | | | +-----+ |        
        |   | |   | | | | | |   | |   |        
        +---------+ | | | | +---------+        
            | |     | | | |     | |            
          +---------+ | | +---------+          
          | | |       | |       | | |          
          | | +-----------------+ | |          
          | |         | |         | |          
          | +---------------------+ |          
          |           | |           |          
          +-----------+ +-----------+          
EOF
NOT

Vay, bu mükemmel.
pembemsi ossifrage,

3
Kodunuzun eski bir versiyonunu gönderir misiniz?
J. Antonio Perez,

Ayrıca, programınızın zaman karmaşıklığı nedir?
J. Antonio Perez,

3
@JorgePerez Ayrı bir ungolfed versiyonum yok; Programı anlamanın en iyi yolu Dynnikov'un bağladığım makalesini okumak. Karmaşıklık korkunç derecede üstel bir şeydir; Bildiğim kadarıyla polinom zaman algoritmasının olup olmadığı hala açık bir problem.
Anders Kaseorg
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.