“KNOT” හෝ “NOT”?


145

ASCII කලා නිරූපණය නිරූපණය කරන වැඩසටහනක් ලියන්න, එය සරල ලූපයකට සම්බන්ධ කළ හැකිද නැද්ද යන්න තීරණය කරයි. මෙම කල්ලියේ නිතරග චරිත භාවිතා නියෝජනය වේ -හා |තිරස් සහ සිරස් අංශ නියෝජනය කිරීමට, සහ +කොන් නියෝජනය කිරීමට. නූල තමා පසුකර යන ස්ථාන පහත පරිදි නිරූපණය කෙරේ:

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

නූලෙහි කෙළවර එකට සම්බන්ධ වේ; ලිහිල් කෙළවරක් නැත.

ඔබේ වැඩසටහන සරල ලූපයකට සම්බන්ධ කළ නොහැකි බව තීරණය කරන්නේ නම්, එය වචනය ප්‍රතිදානය කළ යුතුය KNOT. එසේ නොමැති නම්, එය වචනය ප්‍රතිදානය කළ යුතුය NOT.

මෙය අභියෝගයකි, එබැවින් කෙටිම වලංගු පිළිතුර (ප්‍රභව කේතයේ බයිට් වලින් මනිනු ලැබේ) ජය ගනී.

සීමාවන්

ASCII ආදානය අක්ෂර 80 කින් පේළි 25 කින් සමන්විත වේ. සියලුම රේඛා එකම දිගට අවකාශයන්ගෙන් පිරී ඇති බව ඔබට උපකල්පනය කළ හැකිය.

උදාහරණ

ආදානය:

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

ප්‍රතිදානය:

KNOT

ආදානය:

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

ප්‍රතිදානය:

NOT

යොමුව


36
+1 නියම ප්‍රශ්නය. එම ගැට න්‍යායට පනින්නට ජනතාව දිරිමත් කිරීම සඳහා මේ සඳහා ත්‍යාගයක් දීමට පෙළඹුණි.
ඩිජිටල් කම්පනය

2
අපට එය ගැටයක් යැයි සිතිය හැකිද (සමහර විට නොදන්නා) හෝ එය සම්බන්ධිත සංරචක 1 ක සම්බන්ධකයක් විය හැකිද?
msh210

@ msh210 ඔව්, ඔබට එය තනි ගැටයක් යැයි උපකල්පනය කළ හැකිය :-)
r3mainer

Answers:


98

පයිතන් 3, 457 316 306 බයිට්

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')

හහ්?

වැඩසටහන මුලින්ම ගැටය සෘජුකෝණාස්රාකාර රූප සටහනකට පරිවර්තනය කරයි, එය පහත සඳහන් සීමාවන් ඇත:

  1. එකම පේළියේ සිරස් හෝ තිරස් කොටස් දෙකක් නොමැත.
  2. තිරස් කොටසකට ඉහළින් සිරස් ඛණ්ඩයක් නොමැත.

උදාහරණයක් ලෙස, පළමු පරීක්ෂණ නඩුව පහත දැක්වෙන සෘජුකෝණාස්රාකාර රූපසටහනට පරිවර්තනය වේ:

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

දකුණේ සිට වමට සිරස් කොටස්වල y ඛණ්ඩාංක අනුක්‍රමය මගින් අපි අද්විතීය ලෙස නිරූපණය කරමු:

(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)

ඉන්පසු එය අයිවන් ඩයිනිකොව් විස්තර කර ඇති පරිදි සෘජුකෝණාස්රාකාර රූප සටහන සරල කිරීම සඳහා සොයයි, “සබැඳිවල චාප ඉදිරිපත් කිරීම්. ඒකාකාරී සරල කිරීම ”, 2004 . නොකැඩූ ඕනෑම සෘජුකෝණාස්රාකාර රූප සටහනකින්, සුළු රූපසටහනෙන් අවසන් වන චලනයන් සරල කිරීමේ අනුපිළිවෙලක් ඇති බව ඩයිනිකොව් ඔප්පු කළේය. කෙටියෙන්, අවසර ලත් පියවරයන්ට ඇතුළත් වන්නේ:

  1. සිරස් (හෝ තිරස්) කොටස් චක්‍රීයව අවසර දීම;
  2. නිශ්චිත වින්‍යාස සීමාවන් යටතේ අඛණ්ඩ සිරස් (හෝ තිරස්) කොටස් මාරු කිරීම.
  3. රූප සටහනේ කෙළවරේ පිහිටා ඇති යාබද සිරස් තුනක් එක් ශීර්ෂයකින් ආදේශ කිරීම.

පින්තූර සඳහා කඩදාසි බලන්න. මෙය පැහැදිලි ප්‍රමේයයක් නොවේ; ඒ වෙනුවට හරස් මාර්ග ගණන වැඩි නොකරන රයිඩමිස්ටර් චලනයන් භාවිතා කරන්නේ නම් එය නොපවතී. නමුත් ඉහත සඳහන් කළ සරල කිරීම් සඳහා එය සත්‍යයක් බවට පත්වේ.

(අපි ක්‍රියාත්මක කිරීම සරල කරන්නේ සිරස් කොටස් වලට පමණක් අවසර දීම පමණක් නොව, සම්පූර්ණ ගැටය සිරස් අතට තිරස් අතට හුවමාරු කර ගැනීමට ඉඩ සලසමිනි.)

නිරූපණය

$ 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

ඇවැත්නි, මෙය විශිෂ්ටයි.
r3mainer

3
ඔබේ කේතයේ නොගැලපෙන අනුවාදයක් පළ කළ හැකිද?
ජේ. ඇන්ටෝනියෝ පෙරෙස්

එසේම, ඔබේ වැඩසටහනේ කාල සංකීර්ණත්වය කුමක්ද?
ජේ. ඇන්ටෝනියෝ පෙරෙස්

3
Orge ජෝර්ජ්පෙරෙස් මට වෙනමම ගොල්ෆ් නොකළ අනුවාදයක් නොමැත; වැඩසටහන තේරුම් ගැනීමට ඇති හොඳම ක්‍රමය නම් මා සම්බන්ධ කළ ඩයිනිකොව්ගේ කඩදාසි කියවීමයි. සංකීර්ණත්වය භයානක on ාතීය දෙයක්; මා දන්නා පරිදි, බහුපද කාල ඇල්ගොරිතමයක් තිබේද යන්න තවමත් විවෘත ගැටළුවකි.
ඇන්ඩර්ස් කසෝර්ග්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.