자릿수에서 가장 높은 타워


20

편집 : 질문 끝에 현상금 퍼즐.

1 자리 숫자 세트가 주어지면 타워를 만들 수있는 높이를 결정해야합니다.

숫자는지면이 서있는 수평면에 있습니다. 어떤 숫자도 여러 자리 숫자와 혼동되기를 원하지 않으므로 항상 양쪽에 빈 공간이 있습니다.

4 2  1 9  6  8

숫자는 다른 숫자 위에있을 수 있습니다.

2
6

또는 아래에 대각선으로 다른 두 가지가 지원 될 수 있습니다.

 9
5 8

하단은 상단이 지원하는 무게 (있는 경우)와 항상 1 인 상단 무게를지지해야합니다 . 서포터가 두 개인 경우 상단 무게의 전체 무게를 균등하게 나눕니다 (50 % -50 %).

모든 숫자의 가중치는 값과 무관하게 1입니다.

한 숫자가 다른 숫자 두 개를 지원하면 해당 가중치의 합계를 지원할 수 있어야합니다. 숫자는 최대 숫자 값을 지원할 수 있습니다.

일부 유효한 타워 (높이와 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

일부 유효하지 않은 타워 :

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)    

입력 목록으로 자릿수 목록을 제공하거나 해당 자릿수 중 일부 (모두 가능)를 사용하여 구성 할 수있는 가장 높은 타워의 높이를 리턴하는 프로그램 또는 함수를 작성해야합니다.

입력

  • 하나 이상의 요소가있는 음이 아닌 한 자리 숫자의 목록입니다.

산출

  • 구성 가능한 최고 타워의 높이 인 단일 양의 정수입니다.
  • 귀하의 솔루션은 내 컴퓨터에서 1 분 이내에 예제 테스트 사례를 해결해야합니다 (닫기 사례 만 테스트합니다. 평균 이하의 PC가 있습니다).

형식은 Input list => Output number출력의 일부가 아닌 다음 행에 가능한 타워로 구성됩니다.

[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

이것은 코드 골프이므로 가장 짧은 항목이 이깁니다.

하사품

그럴 게요 상 100 평판 현상금 (입력리스트의 길이에 관해서) 다항식 시간에 아래의 확장 문제를 해결하거나 불가능하다는 것을 증명하기위한 (이미 지급 한 관련이없는) (P 가정! = NP). 확장 된 문제의 세부 사항 :

  • 입력 숫자는 숫자뿐만 아니라 음이 아닌 정수일 수 있습니다.
  • 여러 자리 숫자는 한 자리 숫자와 동일한 자리를 차지합니다.
  • 여러 자리 숫자는 숫자 값 24을 지원할 수 있습니다. 예 : 지원 가능24

바운티 제안에는 만료 날짜가 없습니다. 증거가 표시되면 현상금을 추가하고 보상합니다.


1
새 PC를위한 충분한 돈이 있습니까? 그런 다음 해결책이 있습니다 : P
ThreeFx

1
당신의 3-2-5-7탑은 나를 혼동합니다. 당신은 "하단은 최대 1을 지원하는 무게와 항상 1 인 상단 무게를 지탱해야합니다." '숫자 값'-각 숫자의 가중치가 1 인 경우 다른 숫자를 갖는 점은 무엇입니까?
MI Wright

3
@MIWright 숫자는 숫자 위에 쌓을 수있는 무게를 나타냅니다. 그러나 숫자 자체의 무게는 항상 1입니다.
Martin Ender

@ MartinBüttner OH, duh. 고맙습니다.
MI Wright

제목에는 일련 의 숫자가 언급되어 있지만 예제를 고려하면 list 를 의미하는 것처럼 보입니다 . 세트는 중복 될 수 없습니다.
그리미

답변:


10

파이썬 2-326

주어진 모든 예제에 대해 시간 제한 아래에서 쉽게 실행되지만 크기에 대해 약간의 효율성을 희생했지만 훨씬 더 큰 입력이있을 때 눈에.니다. 이제는 한 자리 숫자 만 허용되므로 가능한 가장 큰 타워는 크지 않을 수 있으므로 최대 값이 무엇인지 궁금합니다.

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
최대 높이는 18 인 것 같습니다.
Kyle Gullion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.