Самая высокая башня из набора цифр


20

Изменить: Головоломка в конце вопроса.

Учитывая набор однозначных чисел, вы должны определить, какую высоту они могут построить.

Цифры живут в горизонтальной плоскости с уровнем земли, где они могут стоять. Ни одна цифра не должна быть перепутана с многозначным числом, поэтому у них всегда есть пустое место с обеих сторон.

4 2  1 9  6  8

Цифра может быть поверх другой:

2
6

или может поддерживаться двумя другими по диагонали под ним:

 9
5 8

Нижний (ые) должен выдерживать вес, который поддерживает верхний (если есть), плюс вес верхнего, который всегда равен 1 . Если есть два сторонника, они делят общий вес верхнего равномерно (50% -50%).

Вес каждой цифры равен 1 независимо от ее значения.

Если одна цифра поддерживает две другие, она должна поддерживать сумму их соответствующего веса. Цифра может поддерживать самое большее ее числовое значение.

Некоторые действующие башни (с высотой 4, 3и 5):

            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)    

Вы должны написать программу или функцию, которая дает список цифр в качестве входных данных или возвращает высоту самой высокой башни, которую можно построить, используя некоторые (может быть, все) эти цифры.

вход

  • Список неотрицательных однозначных чисел с хотя бы одним элементом.

Выход

  • Одно положительное целое число, высота самой высокой возводимой башни.
  • Ваше решение должно разрешить любой пример теста менее чем за минуту на моем компьютере (я буду тестировать только закрытые случаи. У меня компьютер ниже среднего.).

Примеры

Формат 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
Хватит ли денег на новый компьютер? Тогда у меня есть решение: P
ThreeFx

1
Твоя 3-2-5-7башня меня смущает. Вы говорите, что «нижний (ые) должен выдерживать вес, который поддерживает верхний (если есть), плюс вес верхнего, который всегда равен 1.», что противоречит тому, что цифра может поддерживать не более «его числовое значение» - если вес каждой цифры равен единице, то какой смысл иметь другое число?
МИ Райт

3
@ MIWright число указывает, сколько веса вы можете сложить поверх числа. Но вес самого числа всегда равен 1.
Мартин Эндер

@ MartinBüttner О.Х. Спасибо.
МИ Райт

В заголовке упоминаются наборы цифр, но, учитывая примеры, похоже, что вы имели в виду списки . Наборы не могут иметь дубликатов.
Grimmy

Ответы:


10

Python 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.
Кайл Гуллион,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.