Làm NP: tìm cụm lớn nhất


22

Lý lịch

Tại thời điểm viết bài này, vấn đề P vs NP vẫn chưa được giải quyết, nhưng bạn có thể đã nghe về bài báo mới của Norbert Blum tuyên bố bằng chứng rằng P! = NP, vốn đã bị nghi ngờ là sai (nhưng chúng ta sẽ thấy).

Vấn đề được thảo luận trong bài báo này là vấn đề clique . Ít nhất đó là những gì tôi đọc được trong một bài báo, vì vậy hãy sửa cho tôi nếu tôi sai, nhưng trong mọi trường hợp, tôi muốn bạn viết một chương trình giải quyết các biến thể sau:

Nhiệm vụ

Giả sử chúng ta có một ngôi trường lớn với rất nhiều học sinh. Mỗi học sinh này có một số bạn bè ở trường này. Một nhóm sinh viên là một nhóm chỉ bao gồm các sinh viên là bạn với nhau .

Chương trình của bạn sẽ nhận được các cặp sinh viên là bạn bè làm đầu vào. Từ thông tin này, chương trình phải tìm kích thước của cụm lớn nhất . Học sinh được xác định bởi ID số nguyên .

Nếu bạn thích các thuật ngữ toán học, điều này có nghĩa là bạn đã cung cấp các cạnh của đồ thị không xác định, được xác định bởi hai nút mỗi nút.

Đầu vào

Đầu vào của bạn sẽ là một danh sách không trống các cặp số nguyên dương, vd [[1,2],[2,5],[1,5]]. Bạn có thể lấy đầu vào này ở bất kỳ dạng hợp lý nào, ví dụ như một mảng các mảng, như các dòng văn bản chứa hai số, mỗi số, v.v ...

Đầu ra

Sản lượng dự kiến ​​là một số duy nhất n >= 2: kích thước của cụm lớn nhất. Với ví dụ đầu vào ở trên, kết quả sẽ là 3, như tất cả học sinh ( 1, 25) là bạn bè với nhau.

Các trường hợp thử nghiệm

[[1,2]]
=> 2

[[1,2],[3,1],[3,4]]
=> 2

[[1,2],[2,5],[1,5]]
=> 3

[[2,5],[2,3],[4,17],[1,3],[7,13],[5,3],[4,3],[4,1],[1,5],[5,4]]
=> 4 (the largest clique is [1,3,4,5])

[[15,1073],[23,764],[23,1073],[12,47],[47,15],[1073,764]]
=> 3 (the largest clique is [23,764,1073])

[[1296,316],[1650,316],[1296,1650],[1296,52],[1650,711],[711,316],[1650,52],
 [52,711],[1296,711],[52,316],[52,1565],[1565,1296],[1565,316],[1650,1565],
 [1296,138],[1565,138],[1565,711],[138,1650],[711,138],[138,144],[144,1860],
 [1296,1860],[1860,52],[711,1639]]
=> 6 (the largest clique is [52,316,711,1296,1565,1650])

Bạn có thể sử dụng triển khai tham chiếu (ngu ngốc) này (in đầu ra thêm bằng -dcờ) để xác minh kết quả của các trường hợp thử nghiệm khác.

Những quy định

  1. Chương trình của bạn không cần một kết quả được xác định trên đầu vào không hợp lệ. Vì vậy, bạn có thể giả định rằng:
    • bạn sẽ luôn nhận được ít nhất một cặp ID
    • mỗi cặp bao gồm hai ID khác nhau
    • không có cặp nào xuất hiện hai lần (hoán đổi vị trí của các ID sẽ vẫn là một cặp)
  2. Thuật toán của bạn không được phép đặt giới hạn trên cho kích thước đầu vào. Tất nhiên các giới hạn và giới hạn kỹ thuật được thiết lập bởi ngôn ngữ / môi trường của bạn (như kích thước ngăn xếp, thời gian tính toán, v.v.) tất nhiên là không thể tránh khỏi.
  3. Sơ hở tiêu chuẩn bị cấm.
  4. Đây là , vì vậy mã ngắn nhất, được đo bằng byte, sẽ thắng.
  5. Nếu thuật toán của bạn có độ phức tạp thời gian đa thức, bạn sẽ ghi điểm -1ngay lập tức bất kể kích thước mã của bạn, nhưng trong trường hợp đó, bạn có thể muốn gửi giải pháp của mình ở một nơi khác. ;)

4
Tôi gần như có thể đảm bảo rằng sẽ có ai đó sẽ làm điều đó (hoặc cố gắng), vì vậy sẽ đơn giản hơn để loại bỏ nó. Nếu bạn muốn thưởng cho mọi người vì đã làm điều đó, bạn có thể đưa ra một khoản tiền thưởng cho câu trả lời ngắn nhất đó là thời gian đa thức.
caird coinheringaahing

4
@cairdcoinheringaahing nếu ai đó làm nó, -1tốt xứng đáng ;)
Felix Palmen

13
@cairdcoinheringaahing Nếu ai đó quản lý để chứng minh rằng P = NP, họ có điểm số thấp nhất tự động đối với một vấn đề golf mã là điều ít quan tâm nhất của chúng tôi. Điều đó nói rằng, Quy tắc 5 không thực sự đóng góp nhiều cho thử thách, vì vậy tôi đồng ý rằng nó nên được gỡ bỏ.
Mego

11
@Mego nó chỉ đóng góp một trò đùa và một phần thưởng nhỏ cho 1M do CMI cung cấp.
Felix Palmen

30
Chà, tôi sẽ không ủng hộ số ít người có cảm giác "hài hước khoa học". Vui lòng không bình luận thêm các đề xuất liên quan đến vấn đề này, cảm ơn :)
Felix Palmen

Câu trả lời:


6

Thạch ,  15 18  16 byte

+3 byte để sửa lỗi trong phương thức của tôi.
-2 byte nhờ dặm (lưu ý rằng n × (n-1) ÷ 2 = NC2 )

ẎQL©c2⁼Lȧ®
ŒPÇ€Ṁ

Một liên kết đơn âm lấy danh sách các mối quan hệ bạn bè (các cạnh) và trả về một số nguyên.

Hãy thử trực tuyến! hình thành tập hợp sức mạnh của các cạnh trong bộ nhớ nên không hiệu quả cả về không gian và thời gian (vâng, đó là O (2 n ) folks)!

Làm sao?

ẎQL©c2⁼Lȧ® - Link 1, isClique?: list, edges  e.g. [[1,3],[2,3],[3,4],[4,1],[4,2],[2,1]]
Ẏ          - tighten                              [ 1,3 , 2,3 , 3,4 , 4,1 , 4,2 , 2,1 ]
 Q         - de-duplicate (gets unique ids)          [1,3,2,4]
  L        - length (get number of people involved)  4
   ©       - (copy to the register)
    c2     - combinations of 2 (z-choose-2)          6
       L   - length (of edges)                       6
      ⁼    - equal?                                  1
         ® - recall value from register              4
        ȧ  - logical and                             4
           - (Note: the number of edges of a clique of size n is n*(n-1) and we're
           -  guaranteed no repeated edges and that all edges are two distinct ids)

ŒPÇ€Ṁ - Link: list of lists, edges
ŒP    - power-set (all possible sets of edges (as lists))
  Ç€  - call last link (1) as a monad for €ach
    Ṁ - maximum

Wow, giải thích khi bạn có thời gian xin vui lòng
Ông Xcoder

@EriktheOutgolfer Tôi đồng ý. Tôi có thể có thể thêm mã để cứu hộ ...
Jonathan Allan



@miles - tốt đẹp, tôi chỉ mất một thời gian cố gắng để có được 15 từ đó, tôi cảm thấy như nó là có thể!
Jonathan Allan

13

Toán học, 34 byte

Tr[1^#&@@FindClique[#<->#2&@@@#]]&  

Về cơ bản FindClique thực hiện công việc và "tìm thấy một cụm lớn nhất trong biểu đồ g."
Tất cả những thứ khác đang chuyển đổi danh sách đầu vào thành biểu đồ

Đầu vào

[{{2, 5}, {2, 3}, {4, 17}, {1, 3}, {7, 13}, {5, 3}, {4, 3}, {4, 1}, {1, 5}, {5, 4}}]

Đầu ra

4

Đầu vào

[{{1296, 316}, {1650, 316}, {1296, 1650}, {1296, 52}, {1650, 711}, {711, 316}, {1650, 52}, {52, 711}, {1296, 711}, {52, 316}, {52, 1565}, {1565, 1296}, {1565, 316}, {1650, 1565}, {1296, 138}, {1565, 138}, {1565 , 711}, {138, 1650}, {711, 138}, {138, 144}, {144, 1860}, {1296, 1860}, {1860, 52}, {711, 1639}}]

Đầu ra

6

thanx @Kelly Lowder cho -10 byte


23
Tất nhiên Mathicala có một nội dung cho việc này.
Erik the Outgolfer

1
Cạo sạch 10 byte bằngTr[1^#&@@FindClique[#<->#2&@@@#]]&
Kelly Lowder

12
FindCliqueಠ ___
Ông

6

Thạch , 20 byte

ŒPẎ€µQL’=ċЀ`ẠµÐfṪQL

Hãy thử trực tuyến!

Tất nhiên điều này không xứng đáng với hàng triệu: p

Điều này sẽ đánh bại Pyth, nếu không phải là µ(...)µ2 byte Ðf.


Kinh ngạc. Tôi cũng có thể từ bỏ bây giờ.
Mark Thomas

@FelixPalmen lực lượng vũ phu: p
Erik the Outgolfer 30/08/17

@EriktheOutgolfer Tôi không có nghĩa là thời gian chạy của mã;)
Felix Palmen

@FelixPalmen Ý tôi là, cách tiếp cận vũ phu không cần suy nghĩ nhiều: p
Erik the Outgolfer 30/08/17

Cung cấp cho MemoryError với trường hợp thử nghiệm lớn nhất :( Tất nhiên vẫn còn hiệu lực, đây là "giới hạn kỹ thuật" - nhưng chỉ vì tò mò, có cách nào để tăng tài nguyên có sẵn với thạch không?
Felix Palmen

3

J , 36 byte

[:>./](#(]*[=2!])#@~.@,)@#~2#:@i.@^#

Hãy thử trực tuyến!

Chạy trong thời gian O (2 n ) trong đó n là số cặp.

Một giải pháp nhanh hơn cho 65 byte là

3 :'$>{._2{~.@((+.&(e.&y)&<|.)@(-.,-.~)&>/#&,/:~@~.@,&.>/)~^:a:y'

Hãy thử trực tuyến!

Giải trình

[:>./](#(]*[=2!])#@~.@,)@#~2#:@i.@^#  Input: list of pairs
                                   #  Length
                           2      ^   2^n
                               i.@    Range [0, 2^n)
                            #:@       Binary
                         #~           Copy
      (                )@             For each
                      ,                 Flatten
                   ~.@                  Unique
                 #@                     Length
        (       )                       Dyad with RHS at previous and LHS as next
               ]                          Get RHS
             2!                           Binomial coefficient, choose 2
            =                             Equals
           [                              Get LHS
          *                               Times
         ]                                Get RHS
       #                                Length
[:>./                                 Reduce using maximum


2

Python 2 , 180 byte

G=input()
m=0
L=len
for i in range(2**L(G)):
 u=[];p=sum([G[j]for j in range(L(G))if 2**j&i],u)
 for j in p:u+=[j][j in u:]
 m=max(m,L(u)*all(p.count(j)==L(u)-1for j in u))
print m

Hãy thử trực tuyến!

-2 nhờ shooqie .
-1 cảm ơn ông Xcoder .
-3 nhờ đệ quy .


Bạn có thể lưu hai byte bằng cách gán lencho một biến
shooqie

183 byte . (x not in y)có nghĩa là 0**(x in y).
Ông Xcoder

@ Mr.Xcoder Tôi biết có một cách để rút ngắn nó! Cảm ơn!
Erik the Outgolfer

Tôi chưa bao giờ sử dụng nó trước đây, chỉ là một mánh khóe xuyên qua tâm trí tôi vài ngày trước nhưng chưa thể tìm ra cách sử dụng nó.
Ông Xcoder

@ Mr.Xcoder Không thành vấn đề, nếu nó hoạt động thì tại sao không? : D BTW bạn cũng có thể thay thế 0**bằng -~-.
Erik the Outgolfer

1

Bình thường, 28 byte

l{sSef<T.{SMQm.{ft{T.Cd2yS{s

Dùng thử trực tuyến

Giải trình

l{sSef<T.{SMQm.{ft{T.Cd2yS{s
                         S{sQ  Get the distinct nodes in the (implicit) input.
                        y      Take every subset.
             m      .Cd2       Get the pairs...
                ft{T           ... without the [x, x] pairs...
              .{               ... as sets.
     f<T                        Choose the ones...
        .{  Q                   ... which are subsets of the input...
          SM                    ... with edges in sorted order.
    e                           Take the last element (largest clique).
l{sS                            Get the number of distinct nodes.

1

Python 3 , 162 159 byte

lambda x,f=lambda x:{i for s in x for i in s}:len(f(x))if all([(y,z)in x or(z,y)in x for y in f(x)for z in f(x)if y<z])else max(c(x.difference({y}))for y in x)

Hãy thử trực tuyến!

Hàm c lấy các đỉnh dưới dạng một tập hợp các bộ dữ liệu được sắp xếp ({(x, y), ...} trong đó x nhỏ hơn y). Một hàm được gọi là "mục" nằm trong tiêu đề TIO để kiểm tra dữ liệu trong danh sách định dạng danh sách chưa sắp xếp . Nếu clique, trả về chiều dài. Nếu không clique, trả về kích thước clique tối đa của các đỉnh, trừ đi một đỉnh cho mỗi đỉnh trong các đỉnh. Vượt quá thời gian cho trường hợp thử nghiệm cuối cùng trong TIO

Cập nhật: phần "hoặc (z, y) trong x" được thêm vào để loại bỏ sự phụ thuộc vào sự sắp xếp "f = lambda x: {i for s in x for i in s}" thay vì itertools.chain được gói.

-minus 3 byte nhờ @Jonathan Allen



Ngoài ra - bạn không cần đặt tên c, vì vậy có thể xóa c=(bạn cần đặt c=\ở cuối tiêu đề và đặt lambdaở đầu khối mã cho TIO)
Jonathan Allan

Ngoài ra, bạn có thể loại bỏs và thay thế s(...)bằng cách {*...}cho phép loại bỏ một số không gian quá.
Jonathan Allan

1
@Jonathan ALLan cảm ơn, sắp xếp cố định
Conner Johnston


1

Thạch , 28 byte

œ^e³;U¤
Œcç/Ðfœ|Ṣ¥/€QµÐĿ-ịḢL

Hãy thử trực tuyến!

Giải pháp nhanh hơn có thể giải quyết trường hợp thử nghiệm cuối cùng trong một giây trên TIO.


Và điều này có gì phức tạp? Nếu nó thấp hơn O (2ⁿ) thì nó đáng giá 1.000.000 đô la.
Erik the Outgolfer

1
@EriktheOutgolfer, bạn đã nhầm, có những thuật toán có thời gian chạy O (1.1888ⁿ) .
rus9384

Thêm vào đó, để có giá trị một triệu, nchỉ có thể xuất hiện trong các căn cứ :)
Felix Palmen

@FelixPalmen hoặc không thể. Dù sao, đối với triệu một trong hai tuyên bố phải được chứng minh.
rus9384

1
Tôi tin rằng đây là O (1.414 ^ n). Bạn có thể thấy hiệu suất kém hơn khi đầu vào là một biểu đồ hoàn chỉnh.
dặm

1

Java + ổi 23.0, 35 + 294 = 329 byte

import com.google.common.collect.*;
a->{int l=0,o=1,c,z=a.size();for(;o>0&l<z;){o=0;c:for(Iterable<int[]>s:Sets.combinations(a,l*(l+1)/2)){Multiset<Integer>m=TreeMultiset.create();for(int[]x:s){m.add(x[0]);m.add(x[1]);}c=m.elementSet().size();for(int e:m.elementSet())if (m.count(e)!=c-1)continue c;l+=o=1;break;}}return z<3?2:l;}

Thuật toán này không phải là đồ thị, mà thay vào đó là tạo ra tất cả các kết hợp của các cặp, có kích thước cụ thể. Tôi đưa tất cả các kết hợp cặp vào nhiều trang và kiểm tra xem tất cả chúng có kích thước dự kiến ​​(số lượng mục duy nhất - 1). Nếu họ làm, tôi tìm thấy một cụm và tôi đi tìm một cái lớn hơn.

Từ thư viện Guava, tôi sử dụng combinationsphương thức mới và kiểu bộ sưu tập công cụ Multiset.

Bị đánh cắp

import com.google.common.collect.*;
import java.util.function.*;

public class Main {

  public static void main(String[] args) {
    ToIntFunction<java.util.Set<int[]>> f
        = a -> {
          int l = 0, o = 1, c, z = a.size();
          for (; o > 0 & l < z;) {
            o = 0;
            c:
            for (Iterable<int[]> s : Sets.combinations(a, l * (l + 1) / 2)) {
              Multiset<Integer> m = TreeMultiset.create();
              for (int[] x : s) {
                m.add(x[0]);
                m.add(x[1]);
              }
              c = m.elementSet().size();
              for (int e : m.elementSet()) {
                if (m.count(e) != c - 1) {
                  continue c;
                }
              }
              l += o = 1;
              break;
            }
          }
          return z < 3 ? 2 : l;
        };
    int[][][] tests = {
      {{1, 2}},
      {{1, 2}, {3, 1}, {3, 4}},
      {{1, 2}, {2, 5}, {1, 5}},
      {{2, 5}, {2, 3}, {4, 17}, {1, 3}, {7, 13}, {5, 3}, {4, 3}, {4, 1}, {1, 5}, {5, 4}},
      {{15, 1073}, {23, 764}, {23, 1073}, {12, 47}, {47, 15}, {1073, 764}},
      {{1296, 316}, {1650, 316}, {1296, 1650}, {1296, 52}, {1650, 711}, {711, 316}, {1650, 52}, {52, 711}, {1296, 711}, {52, 316}, {52, 1565}, {1565, 1296}, {1565, 316}, {1650, 1565}, {1296, 138}, {1565, 138}, {1565, 711}, {138, 1650}, {711, 138}, {138, 144}, {144, 1860}, {1296, 1860}, {1860, 52}, {711, 1639}}
    };
    for (int[][] test : tests) {
      java.util.Set<int[]> s = new java.util.HashSet<int[]>();
      for (int[] t : test) {
        s.add(t);
      }
      System.out.println(f.applyAsInt(s));
    }
  }
}

Tôi sẽ rất ngạc nhiên, hãy xem Tìm kiếm các nhóm tối đa trong các biểu đồ tùy ý - nhưng tôi sẽ mất một thời gian để phân tích mã này, tôi không quá quen thuộc với Java :)
Felix Palmen

@FelixPalmen Tôi thích thử thách này vì vậy câu trả lời của tôi sẽ không có vấn đề gì, nhưng tôi hoàn toàn ổn khi xóa "-1" nếu đó không phải là một phức tạp đa thức. Sau đó tôi có lẽ nên đi xem lại một số cuốn sách: P
Olivier Grégoire

" Kết hợp kích thước xlà đa thức " <- bạn có chắc không? Tôi đoán đó là phương pháp được sử dụng . Giá trị trả về là một AbstractSetvới một trình vòng lặp và forvòng lặp sau sẽ gọi x!lần lặp này nếu tôi không nhầm ...
Felix Palmen

Sửa lỗi: miễn là x < n(với nkích thước hoàn chỉnh của bộ đầu vào), nó n!/(x!(n-x)!)vẫn không phải là đa thức :)
Felix Palmen

@FelixPalmen Rất có thể bạn đúng. Ngoài ra, bạn có nói rằng nếu tôi thực hiện một combinationsphương thức đó X^n(hoàn toàn có thể), tôi có thể có được nó không? Trong khi đó, tôi xóa yêu cầu của mình về "-1".
Olivier Grégoire


0

Mã máy 6502 (C64), 774 703 byte

(Tôi chỉ phải làm điều này, C64 của tôi có thể làm mọi thứ ... hehe)

hexdump:

00 C0 A9 00 A2 08 9D 08 00 CA 10 FA A2 04 9D FB 00 CA 10 FA 20 54 C0 B0 20 AD 
C9 C2 AE CA C2 20 92 C1 B0 31 8D 31 C0 AD CB C2 AE CC C2 20 92 C1 B0 23 A2 FF 
20 FE C1 90 DB 20 6A C2 20 C1 C1 B0 05 20 6A C2 50 F6 A5 FB 8D D3 C2 20 43 C1 
A9 CD A0 C2 20 1E AB 60 A2 00 86 CC 8E 61 C0 20 E4 FF F0 FB A2 FF C9 0D F0 10 
E0 0B 10 0C 9D BD C2 20 D2 FF E8 8E 61 C0 D0 E5 C6 CC A9 20 20 D2 FF A9 0D 20 
D2 FF A9 00 9D BD C2 AA BD BD C2 F0 5C C9 30 30 0E C9 3A 10 0A 9D CD C2 E8 E0 
06 F0 4C D0 E9 C9 20 D0 46 A9 00 9D CD C2 E8 8E BC C0 20 EB C0 AD D3 C2 8D C9 
C2 AD D4 C2 8D CA C2 A2 FF A0 00 BD BD C2 F0 0F C9 30 30 21 C9 3A 10 1D 99 CD 
C2 C8 E8 D0 EC A9 00 99 CD C2 20 EB C0 AD D3 C2 8D CB C2 AD D4 C2 8D CC C2 18 
60 38 60 A2 FF E8 BD CD C2 D0 FA A0 06 88 CA 30 0A BD CD C2 29 0F 99 CD C2 10 
F2 A9 00 99 CD C2 88 10 F8 A9 00 8D D3 C2 8D D4 C2 A2 10 A0 7B 18 B9 53 C2 90 
02 09 10 4A 99 53 C2 C8 10 F2 6E D4 C2 6E D3 C2 CA D0 01 60 A0 04 B9 CE C2 C9 
08 30 05 E9 03 99 CE C2 88 10 F1 30 D2 A2 06 A9 00 9D CC C2 CA D0 FA A2 08 A0 
04 B9 CE C2 C9 05 30 05 69 02 99 CE C2 88 10 F1 A0 04 0E D3 C2 B9 CE C2 2A C9 
10 29 0F 99 CE C2 88 10 F2 CA D0 D9 C8 B9 CD C2 F0 FA 09 30 9D CD C2 E8 C8 C0 
06 F0 05 B9 CD C2 90 F0 A9 00 9D CD C2 60 85 0A A4 09 C0 00 F0 11 88 B9 D5 C2 
C5 0A D0 F4 8A D9 D5 C3 D0 EE 98 18 60 A4 09 E6 09 D0 01 60 A5 0A 99 D5 C2 8A 
99 D5 C3 98 99 D5 C4 18 60 A6 0B E4 09 30 01 60 BD D5 C5 C5 0B 30 09 A9 00 9D 
D5 C5 E6 0B D0 E9 A8 FE D5 C5 8A 29 01 D0 02 A0 00 BD D5 C4 59 D5 C4 9D D5 C4 
59 D5 C4 99 D5 C4 5D D5 C4 9D D5 C4 A9 00 85 0B 18 60 A8 A5 0C D0 08 A9 20 C5 
0D F0 21 A5 0C 8D 1E C2 8D 21 C2 A5 0D 09 60 8D 1F C2 49 E0 8D 22 C2 8C FF FF 
8E FF FF E6 0C D0 02 E6 0D 18 60 86 0E 84 0F A5 0D 09 60 8D 54 C2 49 E0 8D 5F 
C2 A6 0C CA E0 FF D0 10 AC 54 C2 88 C0 60 10 02 18 60 8C 54 C2 CE 5F C2 BD 00 
FF C5 0E F0 04 C5 0F D0 E0 BD 00 FF C5 0E F0 04 C5 0F D0 D5 38 60 A2 00 86 FC 
86 FD 86 FE BD D5 C4 A8 A6 FE E4 FC 10 11 BD D5 C7 AA 20 2B C2 90 14 E6 FE A6 
FE E4 FC D0 EF A6 FD BD D5 C4 A6 FC E6 FC 9D D5 C7 E6 FD A6 FD E4 09 D0 16 A6 
FB E4 FC 10 0F A2 00 BD D5 C7 9D D5 C6 E8 E4 FC D0 F5 86 FB 60 A0 00 84 FE F0 
B5

Bản demo trực tuyến

Cách sử dụng: Bắt đầu với sys49152, sau đó nhập các cặp một trên mỗi dòng như vd

15 1073
23 764
23 1073
12 47
47 15
1073 764

Backsapce không được xử lý trong quá trình nhập (nhưng nếu bạn sử dụngvice , chỉ cần sao chép và dán đầu vào của bạn vào trình giả lập). Nhập một dòng trống để bắt đầu tính toán.

Điều này là quá lớn để đăng một danh sách tháo gỡ giải thích ở đây, nhưng bạn có thể duyệt qua nguồn lắp ráp kiểu ca65 . Thuật toán này rất không hiệu quả, nó tạo ra mọi hoán vị có thể có của các nút và với mỗi nút này tham lam xây dựng một cụm bằng cách kiểm tra tất cả các cạnh. Điều này cho phép hiệu quả không gianO (n) (loại quan trọng trên máy có RAM nhỏ này), nhưng có hiệu quả thời gian chạy khủng khiếp (*) . Các giới hạn lý thuyết lên tới 256 nút và tối đa 8192 cạnh.

  • -71 byte: thói quen được tối ưu hóa để kiểm tra các cạnh và sử dụng zeropage

Có một cái lớn hơn ( 883 phiên bản 805 byte) với các tính năng tốt hơn:

  • phản hồi trực quan trong khi tính toán (mỗi hoán vị của các nút thay đổi màu đường viền)
  • sử dụng chuyển đổi ngân hàng để lưu trữ các cạnh trong RAM được "ẩn" bởi các ROM để tiết kiệm dung lượng
  • xuất kích thước các nút của cụm tối đa được tìm thấy

Bản demo trực tuyến

Duyệt nguồn


(*) Trường hợp thử nghiệm cuối cùng mất khoảng 12 đến 20 giờ (tôi đã ngủ khi cuối cùng nó kết thúc). Các trường hợp thử nghiệm khác kết thúc ở mức tồi tệ nhất trong vòng vài phút.

Screenshot of last test case

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.