Найвища вежа з набору цифр


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вежа мене бентежить. Ви говорите, що "Нижній (-ла) повинен підтримувати" вагу "," Верхній "(якщо такий є), плюс вага" Верхній ", який завжди є". 'його числове значення' - якщо вага кожної цифри одна, то який сенс мати різну кількість?
МІ Райт

3
@MIWright число вказує, яку вагу ви можете скласти на верхній частині номера. Але вага самого числа завжди 1.
Мартін Ендер

@ MartinBüttner OH, да. Дякую.
MI MI Райт

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

Відповіді:


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.
Кайл Gullion
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.