Tháp cao nhất từ ​​một tập hợp các chữ số


20

Chỉnh sửa: Câu đố tiền thưởng ở cuối câu hỏi.

Cho một tập hợp các số có 1 chữ số, bạn nên xác định tòa tháp có thể cao bao nhiêu.

Các chữ số sống trên một mặt phẳng nằm ngang với mặt đất nơi chúng có thể đứng. Không có chữ số nào muốn bị nhầm lẫn với một số có nhiều chữ số, vì vậy chúng luôn có một khoảng trống ở cả hai bên.

4 2  1 9  6  8

Một chữ số có thể nằm trên một chữ số khác:

2
6

hoặc có thể được hỗ trợ bởi hai đường chéo khác bên dưới nó:

 9
5 8

(Các) người dưới cùng phải hỗ trợ trọng lượng mà người trên hỗ trợ (nếu có), cộng với trọng lượng của người cao hơn luôn là 1 . Nếu có hai người ủng hộ, họ chia đều tổng trọng lượng của một người trên (50% -50%).

Trọng số của mỗi chữ số là 1 độc lập với giá trị của nó.

Nếu một chữ số hỗ trợ hai chữ số khác, nó phải có khả năng hỗ trợ tổng trọng lượng tương ứng của chúng. Một chữ số có thể hỗ trợ tối đa giá trị số của nó.

Một số tháp hợp lệ (với chiều cao 4, 35):

            0          
7           1
5    1     1 1         9 supports a total weight of 1.5 = (1+1/2)/2 + (1+1/2)/2
2   5 4    5 5        
3  5 9 5  5 6 3        6 supports a total weight of 3 =  1.5 + 1.5 = (2*1+(2*1/2))/2 + (2*1+(2*1/2))/2

Một số tháp không hợp lệ:

1         5           The problems with the towers are (from left to right):
1  12    2 3     8      1 can't support 1+1; no space between 1 and 2;
1  5 6  1 1 1   9       1 can't support 1.5 = (1+1/2)/2 + (1+1/2)/2; 8 isn't properly supported (digits at both bottom diagonals or exactly below the 8)    

Bạn nên viết một chương trình hoặc hàm đưa ra danh sách các chữ số làm đầu ra đầu vào hoặc trả về chiều cao của tháp cao nhất có thể xây dựng bằng cách sử dụng một số (có thể là tất cả) của các chữ số đó.

Đầu vào

  • Một danh sách các số có một chữ số không âm có ít nhất một phần tử.

Đầu ra

  • Một số nguyên dương duy nhất, chiều cao của tháp có thể xây dựng cao nhất.
  • Giải pháp của bạn phải giải quyết bất kỳ trường hợp kiểm tra ví dụ nào dưới một phút trên máy tính của tôi (tôi sẽ chỉ kiểm tra các trường hợp gần. Tôi có một PC dưới mức trung bình.).

Ví dụ

Định dạng là Input list => Output numbervới một tháp có thể trên các dòng tiếp theo không phải là một phần của đầu ra.

[0]  =>  1

0

[0, 1, 1, 1, 1, 1]  =>  3

  0
  1
 1 1

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

   1
   1
  1 1
 1 2 2

[0, 0, 2, 2, 2, 2, 2, 5, 5, 5, 7, 7, 9]  =>  9

0
2
2
5
5
5
7
7
9

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

   1
   2
   2
   3
   4
   5
  3 3
 4 4 4
5 5 5 5

[0, 0, 0, 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9]  =>  11

   0
   1
   2
   3
   4
   5
  3 3
  4 5
  5 5
 3 7 3
2 7 9 2

[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]  =>  12

 0
 1
 2
 3
 4
 5
 6
 7
4 5
6 7
8 8
9 9

[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9]  =>  18

      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
     5 5
     6 6
     7 7
    4 8 4
   3 7 7 3
  2 6 8 6 2
 2 5 8 8 5 2
 3 9 9 9 9 3

Đây là môn đánh gôn, vì vậy bài dự thi ngắn nhất sẽ thắng.

Tiền thưởng

Tôi sẽ trao 100 tiền thưởng danh tiếng (không liên quan đến giải thưởng đã được trao) để giải quyết vấn đề mở rộng dưới đây trong thời gian đa thức (liên quan đến độ dài của danh sách đầu vào) hoặc chứng minh rằng điều đó là không thể (giả sử P! = NP). Chi tiết về vấn đề mở rộng:

  • số đầu vào có thể là bất kỳ số nguyên không âm nào không chỉ là chữ số
  • số có nhiều chữ số chiếm vị trí tương tự như số có một chữ số
  • số có nhiều chữ số có thể hỗ trợ cho chúng giá trị số, ví dụ: 24có thể hỗ trợ24

Ưu đãi tiền thưởng không có thời hạn sử dụng. Tôi sẽ thêm và thưởng tiền thưởng nếu một bằng chứng xuất hiện.


1
Bạn có đủ tiền cho một PC mới không? Sau đó, tôi có một giải pháp: P
ThreeFx

1
3-2-5-7Tháp của bạn làm tôi bối rối. Bạn nói rằng "Người dưới cùng phải hỗ trợ trọng lượng mà người trên hỗ trợ (nếu có), cộng với trọng lượng của người trên luôn là 1.", điều này mâu thuẫn với bạn khi nói rằng một chữ số có thể hỗ trợ tối đa 'giá trị số của nó' - nếu trọng số của mỗi chữ số là một, thì điểm có số khác nhau là gì?
MI Wright

3
@MIWright số cho biết bạn có thể xếp bao nhiêu cân lên trên đầu số. Nhưng trọng số của chính nó luôn là 1.
Martin Ender

@ MartinBüttner OH, duh. Cảm ơn bạn.
MI Wright

Tiêu đề đề cập đến các bộ chữ số, nhưng xem xét các ví dụ, có vẻ như bạn có nghĩa là danh sách . Bộ không thể có bản sao.
Grimmy

Câu trả lời:


10

Con trăn 2 - 326

Chạy dễ dàng trong giới hạn thời gian cho tất cả các ví dụ đã cho, mặc dù tôi đã hy sinh một số hiệu quả cho kích thước, có thể đáng chú ý với các đầu vào lớn hơn nhiều. Bây giờ tôi nghĩ về điều đó, vì chỉ các số có một chữ số được cho phép, tháp lớn nhất có thể không lớn lắm, và tôi tự hỏi mức tối đa là bao nhiêu.

def S(u,c=0,w=[]):
 for(s,e)in[(len(w),lambda w,i:w[i]),(len(w)+1,lambda w,i:.5*sum(([0]+w+[0])[i:i+2]))]:
    m=u[:];l=[-1]*s
    for n in u:
     for i in range(s):
        if 0>l[i]and n>=e(w,i):m.remove(n);l[i]=n;break
    if([]==l or-1in l)==0:
     for r in S(m,c+1,[1+e(w,i)for i in range(s)]):yield r
 yield c
print max(S(sorted(input())))

2
Có vẻ như chiều cao tối đa là 18.
Kyle Gullion
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.