Raftaki kitaplar


12

Kitaplarım ve kitaplığım var. Rafa olabildiğince çok kitap koymak istiyorum ama bir kuralım var. Kitapların tüm boyutları (yükseklik, genişlik ve derinlik) rafta artmayan bir dizi oluşturmalıdır.

Bu, her kitabın en azından kendinden sonraki kitaplar kadar yüksek olması gerektiği anlamına gelir. Aynı şey genişlik ve derinlik için de geçerlidir. Yükseklik, genişlik ve derinliklerini değiştirmek için kitapları döndüremezsiniz.

Tüm kitapların boyutlarını girdi çıktısı olarak veren veya rafa koyabileceğim en fazla kitap sayısını döndüren bir program veya işlev yazmalısınız.

Giriş

  • Her üçlünün bir kitabın yüksekliğini, genişliğini ve derinliğini tanımladığı pozitif tamsayıların üçlülerinin bir listesi.
  • Giriş listesinde en az bir üçüz olacaktır.
  • İki kitap, herhangi bir sayıda boyut boyunca aynı uzunluklara sahip olabilir.

Çıktı

  • Tek bir pozitif tamsayı, kurala uyan rafa uyan maksimum kitap sayısı.

Zaman karmaşıklığı

Algoritmanızın kitap sayısında en kötü zaman karmaşıklığı polinomu olmalıdır . Bu, örneğin aşağıdaki zaman karmaşıklıklarının hepsinin geçerli olduğu anlamına gelir: O (N ^ 3), O (log (N) * N ^ 2), O (N) ve aşağıdakilerin geçersiz olduğu: O (2 ^ N), O (N!), O (N ^ N).

Örnekler

Giriş => Çıkış

(1, 1, 1) =>  1

(5, 2, 5), (1, 3, 5) =>  1

(5, 2, 5), (1, 2, 5) =>  2

(2, 2, 2), (2, 2, 2), (2, 2, 2), (1, 3, 6) =>  3

(1, 2, 5), (1, 3, 5), (1, 2, 8), (1, 2, 5), (7, 7, 7) =>  4

(5, 19, 3), (9, 4, 16), (15, 16, 13), (7, 4, 16), (1, 13, 14), (20, 1, 15), (9, 8, 19), (4, 11, 1) =>  3

(1, 1, 18), (1, 13, 7), (14, 1, 17), (8, 15, 16), (18, 8, 12), (8, 8, 15), (10, 1, 14), (18, 4, 6), (10, 4, 11), (17, 14, 17), (7, 10, 10), (19, 16, 17), (13, 19, 2), (16, 8, 13), (14, 6, 12), (18, 12, 3) =>  5

Bu kod golf yani en kısa giriş kazanır.

İlgili ilginç bir kitap sıralama meydan okuma: Kitap Yığını Sırala .


Eğer kastediyorsunuz gereken bir azalan dizisi oluşturur? Her kitap aynı yükseklikte değilse, her bir kitap en az onun kadar yüksekse, elde ettiğiniz budur.
mbomb007

@ mbomb007 Doğru, "azalmayan" olarak "artmayan" olarak değiştirildi.
randomra

Yanıtlar:


4

Python 3: 436 bayt

İlk başta bir yönlendirilmiş grafiğinde en uzun basit yolu bulma NP-tam problemi olarak gördü sahip döngüleri. Bununla birlikte, grafikteki her döngü (aslında tam bir alt çizgi) tek bir tepe noktası olarak temsil edilebilir. Başka bir deyişle, aynı kitapları rafa bir birim olarak yerleştirilecek bir kitap gibi ele alın. Daha sonra a-> b'nin rafta a'yı takip edebileceği bir asiklik grafik oluşturabiliriz. Son olarak, özyinelemeli bir yöntem kullanarak ağaçların maksimum yüksekliğini buluruz.

import sys
b=[]
n={}
r=[]
for L in sys.stdin.readlines():z=[int(x)for x in L.split()];r+=[z];z in b or b+=[z]
def l(a,b):return a[0]<=b[0]and a[1]<=b[1]and a[2]<=b[2]
R=range(len(b))
for i in R: 
    n[i]=[]
    for j in R:i!=j and l(b[i],b[j])and n[i]+=[j]
def L(t):
    global v;best=0
    if t in v:
            return v[t]
    for s in n[t]:best=max(best,L(s)+1)
    v[t]=best+r.count(b[t])-1;return best
m=0
for i in R:v={};m=max(L(i)+1,m)
print(m)

1
Bu güzel bir çözüm, ancak henüz golf oynamadı. Olduğumda onaylayacağım.
isaacg

3

Pyth, 40 bayt

KYleolNe.eaK+e+]])olNf.A.eg@YbZeT<Kk]YSQ

Hızlı değil, ama polinom.

Python3 eşdeğeri:

def num_books(l):
    l = sorted(l)
    s = []
    for i, Y in enumerate(l):
        s.append(max([T for T in s[:i]
                      if all(Y[e] >= t for e, t in enumerate(T[-1]))] + [[]],
                     key=len) + [Y])
    return max(len(u) for u in s)

Python 3 versiyonu bariz golflerle 177 bayttır. Sadece bir fyi.
mbomb007

0

Python 2,231 bayt

Burada deneyin

Programım şu anda son iki örneği yanlış anlıyor. Birisi tamir etmeme yardımcı olabilir mi lütfen? Teşekkürler.

Listeyi 3 boyutun 6 olası permütasyon sırasının tümünü sıralıyorum, ardından listede en uzun sürekli sipariş ilişkisinin ne olduğunu görüyorum, sonra bunların maksimumunu buluyorum.

Ayrıca, çok daha fazla golf olabilir biliyorum, ama bunu reduceyapmak için kullanabilirsiniz eğer anlayamadım . Basitçe söylemek gerekirse, bu şekilde beynim patlamadan makul bir sürede yapmanın en kolay yoluydu.

from operator import*
from itertools import*
def f(t):
    m=1
    for l in(sorted(t,key=itemgetter(*o))for o in permutations(range(3))):
        c=1
        for k in range(len(l)-1):
            c+=all(i<=j for i,j in zip(l[k],l[k+1]))
        m=max(m,c)
    print m
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.