Bücher im Regal

12

Ich habe einige Bücher und ein Bücherregal. Ich möchte so viele Bücher wie möglich ins Regal stellen, aber ich habe eine Regel. Alle Maße der Bücher (Höhe, Breite und Tiefe) sollten im Regal eine nicht aufsteigende Reihenfolge bilden.

Das bedeutet, dass jedes Buch mindestens so hoch sein muss wie die Bücher, die es auf sich hat. Gleiches gilt für die Breite und Tiefe. Sie können die Bücher nicht drehen, um Höhe, Breite und Tiefe zu vertauschen.

Sie sollten ein Programm oder eine Funktion schreiben, die die Abmessungen aller Bücher als Eingabe-Ausgabe angibt oder die maximale Anzahl Bücher zurückgibt, die ich in das Regal stellen kann.

Eingang

  • Eine Liste von Tripletts mit positiven ganzen Zahlen, wobei jedes Triplett die Höhe, Breite und Tiefe eines Buches definiert.
  • Die Eingabeliste enthält mindestens ein Triplet.
  • Zwei Bücher können in beliebig vielen Dimensionen gleich lang sein.

Ausgabe

  • Eine einzelne positive ganze Zahl, die maximale Anzahl von Büchern, die unter Einhaltung der Regel in das Regal passen.

Zeitliche Komplexität

Ihr Algorithmus sollte im ungünstigsten Fall ein Zeitkomplexitätspolynom in Bezug auf die Anzahl der Bücher haben. Dies bedeutet, dass zum Beispiel die folgenden Zeitkomplexitäten alle gültig sind: O (N ^ 3), O (log (N) * N ^ 2), O (N) und die folgenden sind ungültig: O (2 ^ N), O (N!), O (N ^ N).

Beispiele

Eingabe => Ausgabe

(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

Dies ist Codegolf, also gewinnt der kürzeste Eintrag.

Eine ähnliche interessante Herausforderung beim Sortieren von Büchern: Book Stack Sort .

randomra
quelle
Meinen Sie, es sollte eine abnehmende Reihenfolge bilden? Das bekommen Sie, wenn jedes Buch mindestens so hoch ist wie das Buch danach, es sei denn, jedes Buch ist gleich hoch.
mbomb007
@ mbomb007 Richtig, geändert "nicht absteigend" in "nicht ansteigend".
Randomra

Antworten:

4

Python 3: 436 Bytes

Zunächst sah ich darin das NP-vollständige Problem, den längsten einfachen Weg in einem gerichteten Graphen mit Zyklen zu finden. Jeder Zyklus in der Grafik (eigentlich ein vollständiger Untergraph) kann jedoch als ein einzelner Scheitelpunkt dargestellt werden. Mit anderen Worten, behandeln Sie identische Bücher als ein Buch, das als Einheit in das Regal gestellt wird. Wir können dann einen gerichteten azyklischen Graphen konstruieren, wobei a-> b bedeutet, dass b a im Regal folgen könnte. Schließlich ermitteln wir die maximale Höhe der Ausgangsstruktur (en) mithilfe einer rekursiven Methode.

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)
kbitikofer
quelle
1
Dies ist eine schöne Lösung, aber es ist noch nicht wirklich Golf. Ich stimme zu, wenn es soweit ist.
isaacg
3

Pyth, 40 Bytes

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

Nicht schnell, aber es ist ein Polynom.

Python3-Äquivalent:

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)
orlp
quelle
Die Python 3-Version ist 177 Bytes mit den offensichtlichen Golfspielen. Nur zu Ihrer Information.
mbomb007
0

Python 2, 231 Bytes

Probieren Sie es hier aus

Mein Programm erhält derzeit die letzten zwei Beispiele falsch. Kann mir jemand helfen, das Problem zu beheben? Vielen Dank.

Ich sortiere die Liste mit allen 6 möglichen Permutationsreihenfolgen der 3 Dimensionen, sehe dann, was die längste zusammenhängende Ordnungsrelation in der Liste ist, und finde dann das Maximum von diesen.

Ich weiß auch, ob man noch viel mehr Golf spielen kann, aber ich konnte nicht herausfinden, ob ich das gebrauchen könnte reduce. Einfach ausgedrückt, dieser Weg war der einfachste, in einer vernünftigen Zeit zu schaffen, ohne dass mein Gehirn explodierte.

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
mbomb007
quelle