Bir dizi basamaktan en yüksek kule


20

Düzenleme: Sorunun sonunda ödül bulmaca.

1 basamaklı sayılar kümesi verildiğinde, bir kulenin ne kadar yüksek inşa edebileceklerini belirlemelisiniz.

Rakamlar, durabilecekleri yer seviyesiyle yatay bir düzlemde yaşar. Hiçbir basamak çok basamaklı bir sayıyla karıştırılmak istemez, bu nedenle her iki tarafında da boş bir alan vardır.

4 2  1 9  6  8

Bir rakam diğerinin üzerinde olabilir:

2
6

veya altında çapraz olarak diğer iki kişi tarafından desteklenebilir:

 9
5 8

Alttaki (ler), üstteki kişinin (varsa) desteklediği ağırlığı ve üstteki kişinin her zaman 1 olan ağırlığını desteklemesi gerekir . İki destekçi varsa, üst kişinin toplam ağırlığını eşit olarak bölerler (% 50-% 50).

Her basamağın ağırlığı, değerinden bağımsız olarak 1'dir.

Eğer bir rakam diğer iki tanesini destekliyorsa, karşılık gelen ağırlıklarının toplamını destekleyebilmelidir. Bir rakam en fazla sayısal değerini destekleyebilir.

Bazı geçerli kuleler (yükseklikleri 4olan 3ve 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

Bazı geçersiz kuleler:

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)    

Girdi çıktıları olarak bir basamak listesi veren veya bu basamağın bir kısmını (belki tümünü) kullanarak inşa edilebilir en yüksek kulenin yüksekliğini döndüren bir program veya işlev yazmalısınız.

Giriş

  • En az bir öğe içeren negatif olmayan tek basamaklı sayıların listesi.

Çıktı

  • Tek bir pozitif tam sayı, en yüksek inşa edilebilir kulenin yüksekliği.
  • Çözümünüzün bilgisayarımdaki herhangi bir örnek test vakasını bir dakikadan az bir sürede çözmesi gerekiyor (sadece yakın vakaları test edeceğim. Ortalamanın altında bir bilgisayarım var.).

Örnekler

Biçim, Input list => Output numberçıktının bir parçası olmayan sonraki satırlarda olası bir kule ile.

[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

Bu kod golf, bu yüzden en kısa giriş kazanır.

cömertlik

Polinom zamanında (giriş listesinin uzunluğu ile ilgili olarak) aşağıdaki genişletilmiş problemi çözmek için (zaten verilen ödülle ilgili olmayan) 100 itibar ödülü vereceğim veya bunun mümkün olmadığını kanıtlayacağım (P! = NP varsayarak). Genişletilmiş sorunun ayrıntıları:

  • girdi sayıları yalnızca rakam değil, negatif olmayan tamsayılar olabilir
  • çok basamaklı sayılar tek basamaklı sayılarla aynı yeri alır
  • çok basamaklı sayılar sayısal değerleri 24destekleyebilir, örn.24

Ödül teklifinin son kullanma tarihi yoktur. Bir kanıt görünürse ödülü ekleyeceğim ve ödüllendireceğim.


1
Yeni bir PC için yeterli paranız var mı? Sonra bir çözümüm var: P
ThreeFx

1
Kişisel 3-2-5-7kule beni karıştırır. "En alttaki (ler), üstteki kişinin (varsa) desteklediği ağırlığı, artı olanın her zaman 1 olan ağırlığını desteklemesi gerektiğini söylüyorsunuz. 'sayısal değeri' - eğer her basamağın ağırlığı bir ise, farklı sayıya sahip olmanın anlamı nedir?
MI Wright

3
@MIWright, sayının üstüne ne kadar ağırlık yükleyebileceğinizi gösterir. Ancak sayının kendisi her zaman 1'dir.
Martin Ender

@ MartinBüttner OH, duh. Teşekkür ederim.
MI Wright

Başlık basamak kümelerinden bahsediyor , ancak örnekler göz önüne alındığında listeler demek istediğiniz gibi görünüyor . Kümelerin kopyaları olamaz.
Grimmy

Yanıtlar:


10

Python 2-326

Verilen tüm örnekler için zaman sınırı altında kolayca çalışır, ancak daha büyük girdiler göz önüne alındığında büyük olasılıkla bazı verimlilikten ödün verdim. Şimdi düşünüyorum, sadece tek haneli sayılara izin verildiğinden, mümkün olan en büyük kule çok büyük olmayabilir ve maksimumun ne olduğunu merak ediyorum.

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
Görünüşe göre maksimum yükseklik 18.
Kyle Gullion
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.