"নট" বা "না"?


144

এমন একটি প্রোগ্রাম লিখুন যা একটি জটলা স্ট্রিংয়ের একটি ASCII শিল্প উপস্থাপনের প্রক্রিয়া করে এবং সিদ্ধান্ত নেয় যে এটি সরল লুপের সাথে অবিচ্ছিন্ন হতে পারে কিনা। জট অক্ষরগুলি ব্যবহার করে -এবং |অনুভূমিক এবং উল্লম্ব বিভাগগুলিকে +উপস্থাপন করতে এবং কোণগুলি উপস্থাপন করার জন্য উপস্থাপিত হয়। স্ট্রিংগুলি নিজের উপর দিয়ে যে জায়গাগুলি চলে যায় সেগুলি নীচে উপস্থাপিত হয়:

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

স্ট্রিংয়ের প্রান্তগুলি এক সাথে সংযুক্ত; কোন শিথিল প্রান্ত নেই।

যদি আপনার প্রোগ্রাম স্থির করে যে স্ট্রিংটিকে একটি সাধারণ লুপে আটকানো যায় না, তবে এটি শব্দটি আউটপুট করে KNOT। অন্যথায়, এটি শব্দ আউটপুট করা উচিত NOT

এটি একটি চ্যালেঞ্জ, সুতরাং সংক্ষিপ্ততম বৈধ উত্তর (উত্স কোডের বাইটগুলিতে মাপা) জিতবে।

সীমা

ASCII ইনপুটটিতে 80 টি বর্ণের 25 টি লাইন থাকবে। আপনি ধরে নিতে পারেন যে সমস্ত লাইন একই দৈর্ঘ্যের ফাঁক দিয়ে প্যাডযুক্ত।

উদাহরণ

ইনপুট:

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

আউটপুট:

KNOT

ইনপুট:

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

আউটপুট:

NOT

তথ্যসূত্র


36
+1 দুর্দান্ত প্রশ্ন। লোকেদের এই গিঁট তত্ত্বটিতে ঝাঁপিয়ে পড়তে উত্সাহিত করার জন্য এইটির উপর একটি অনুদান রাখার প্রলোভন।
ডিজিটাল ট্রমা

2
আমরা কী ধরে নিতে পারি এটি একটি গিঁট (সম্ভবত আনকনট) বা এটি> 1 সংযুক্ত উপাদানগুলির একটি লিঙ্ক হতে পারে?
এমএস 210

@ msh210 হ্যাঁ, আপনি এটা একটি একক গিঁট :-) এর অনুমান করতে পারেন
খুঁতখুঁতে ossifrage

উত্তর:


94

পাইথন 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

বাহ, এটি দুর্দান্ত।
চটজলদি ossifrage

3
আপনি কি আপনার কোডের একটি অদ্বিতীয় সংস্করণ পোস্ট করতে পারেন?
জে আন্তোনিও পেরেজ

এছাড়াও, আপনার প্রোগ্রামের সময় জটিলতা কি?
জে আন্তোনিও পেরেজ

3
@ জর্জিপেরেজ আমার কাছে আলাদা আলাদা বর্ণা ;্য সংস্করণ নেই; প্রোগ্রামটি বোঝার সর্বোত্তম উপায় হ'ল ডায়নিকভের কাগজটি যা আমি যুক্ত করেছিলাম তা পড়া। জটিলতা হ'ল মারাত্মক ক্ষয়ক্ষতিযুক্ত; যতদূর আমি জানি, বহু বহু সময়ের আলগোরিদিম বিদ্যমান কিনা তা এখনও একটি উন্মুক্ত সমস্যা।
অ্যান্ডারস কাসেরগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.