Das Problem mit der Schlittenverpackung

11

Die Elfen des Weihnachtsmanns brauchen Hilfe, um festzustellen, ob ihre aktuellen Geschenke in den Schlitten des Weihnachtsmanns passen. Schreiben Sie das kürzestmögliche Programm in der Sprache Ihrer Wahl, um ihnen zu helfen.

Einschränkungen

  • Der Schlitten des Weihnachtsmanns ist 6 Fuß breit und 12 Fuß lang und 4 Fuß tief.
  • Geschenke können zerbrechlich sein, so dass sie möglicherweise nicht übereinander gestapelt werden.
  • Sie können die Geschenke drehen und drehen, wie Sie möchten, aber der Weihnachtsmann ist ein ziemlich zwanghafter Kerl, also halten Sie die Drehungen auf ein Vielfaches von 90 Grad.
  • Die Gesundheits- und Sicherheitsbestimmungen des Nordpols sehen vor, dass Geschenke nicht mehr als 1 Fuß über der Oberseite eines Schlittens herausragen dürfen (daher dürfen sie nicht höher als 5 Fuß sein).

Eingang

Die Eingabe ist aktiviert STDINund besteht aus einer Ganzzahl, die die Anzahl der Geschenke im Stapel darstellt, gefolgt von einer Liste der Dimensionen der Geschenke - 1 Geschenk pro Zeile, 3 Dimensionen (in Fuß), die durch Leerzeichen getrennt sind.

Beispiele:

1
6 12 5

6
1 12 3
1 12 4
1 12 1
1 12 5
1 12 3
1 12 5

1
4 3 13

1
6 12 6

Ausgabe

Die Ausgabe sollte nur das Wort "JA" sein, wenn die Geschenke in den Schlitten gepackt werden können, oder "NEIN", wenn sie nicht können.

Ausgabe für die obigen Beispiele:

YES

YES

NO

NO

Testskripte

Nach wie vor habe ich einige von Joey und Ventero geschriebene Testskripte verwendet , um einige Tests für diese Aufgabe zu erstellen:

Verwendung: ./test [your program and its arguments]

Belohnung

Jeder Eintrag, bei dem ich überprüfen kann, ob er der Spezifikation entspricht, die Tests besteht und offensichtlich versucht hat, Golf zu spielen, wird von mir positiv bewertet (bitte geben Sie Ihre Antwort mit Ihrer Antwort an). Die kürzeste Lösung bis Ende 2011 wird als Gewinner akzeptiert.

Gareth
quelle
Dürfen wir die Geschenke drehen? Sie auf die Seite drehen? Drehen Sie sie um einen Winkel, der kein Vielfaches von 90 ° ist?
Ilmari Karonen
@IlmariKaronen Ja, Sie können die Geschenke in jede gewünschte Ausrichtung drehen, solange sie passen. Ich denke, die Mathematik, die erforderlich ist, um Kisten in einem Winkel einzubauen, der kein Vielfaches von 90 ist, wäre zu kompliziert, nicht wahr? Ich habe für die Tests nur Drehungen von 90 Grad angenommen.
Gareth
@IlmariKaronen Nach weiteren Überlegungen denke ich, dass ich Rotationen anderer Vielfacher von 90 Grad eliminieren muss, um eine übermäßige Komplikation der Frage zu vermeiden und um sicherzustellen, dass die Tests die richtigen Antworten liefern. Ich werde eine zusätzliche Einschränkung hinzufügen.
Gareth
Warum ist Beispiel 3 ein Nein, wenn Beispiel 1 ein Ja ist? 6x12x5 ist größer als 6x12x4, dürfen also vorhandene Personen nach oben ragen? In welchem ​​Fall ist 3 ein Nein, da auch das oben herausragen kann?
Skizz
1
@ Skizz: Es ist verwirrend formuliert, aber siehe die vierte Einschränkung: Geschenke können 1 Fuß über der Spitze herausragen. Die effektive Tiefe des Schlittens beträgt also 5 Fuß, nicht 4 Fuß.
Ilmari Karonen

Antworten:

3

Haskell, 312 318 Zeichen

import Data.List
s(ξ:υ:_,λ:σ:η:_)(x:y:_,l:w:_)=(ξ+λ<=x||ξ>=x+l||υ+σ<=y||υ>=y+w)&&ξ+λ<7&&υ+σ<13&&η<6
y p l=[(v,r):l|v<-[[x,y,0]|x<-[0..5],y<-[0..11]],r<-permutations p,all(s(v,r))l]
main=do
 n<-readLn
 p<-mapM(fmap(map read.words).const getLine)[1..n]
 putStr.r$foldr((=<<).y)[[([9,0],[0..])]]p
r[]="NO"
r _="YES"

Aus irgendeinem Grund, den ich im Moment nicht vollständig verstehe, werden Ihre Tests Nr. 9 und Nr. 16 nicht in angemessener Zeit abgeschlossen. Aber du hast nichts über Leistung gesagt, oder?


373 383 Zeichen

Diese Version läuft für die Beispiele viel schneller: Sie prüft zunächst, ob dies nicht unmöglich ist, nur weil der Bereich zu klein ist, und beginnt dann mit den größten Paketen, anstatt sie in der angegebenen Reihenfolge einzufügen. Beachten Sie, dass die Flächenerkennung nicht perfekt ist: Sie berücksichtigt keine Rotationen, sodass bei einigen Eingaben möglicherweise falsche Ergebnisse erzielt werden. Aber es funktioniert mit dem Testskript.

import Data.List
s(ξ:υ:_,λ:σ:η:_)(x:y:_,l:w:_)=(ξ+λ<=x||ξ>=x+l||υ+σ<=y||υ>=y+w)&&ξ+λ<7&&υ+σ<13&&η<6
y p l=[(v,r):l|v<-[[x,y,0]|x<-[0..5],y<-[0..11]],r<-permutations p,all(s(v,r))l]
π=product
main=do
 n<-readLn
 p<-mapM(fmap(map read.words).const getLine)[1..n]
 putStr$if sum(map(π.init)p)>72||null(foldr((=<<).y)[[([9,0],[0..])]].sortBy((.π).compare.π)$p)then"NO"else"YES"
hörte auf, gegen den Uhrzeigersinn zu drehen
quelle
Nein, ich habe mich nicht um die Leistung gekümmert, aber das Programm muss alle Tests bestehen, um meine positive Bewertung zu erhalten. Derzeit wird an Test 9 gearbeitet. Ich lasse es eine Weile, um zu sehen, ob es fertig ist.
Gareth
@Gareth Ich muss es noch ein bisschen optimieren.
hörte auf, gegen den Uhrzeigersinn
In Ordnung. Hier wird noch an Test 9 gearbeitet.
Gareth
2

Python, 461 Zeichen

import sys
def L(P,z):
 if not P:return 1
 for w,h in[P[0],P[0][::-1]]:
  m=sum((2**w-1)<<i*6for i in range(h))
  for x in range(7-w):
   for y in range(13-h):
    n=m<<y*6+x
    if z&n==0and L(P[1:],z|n):return 1
 return 0
for G in sys.stdin.read().split('\n\n'):
 S=[(x,y)if z<6 else(x,z)if y<6 else(y,z)if x<6 else(9,9)for x,y,z in[sorted(eval(g.replace(' ',',')))for g in G.split('\n')[1:]if g]]
 print'YES\n'if sum(x*y for x,y in S)<73and L(S,0)else'NO\n'

LÜberprüft rekursiv, ob die Rechtecke in Pden Schlitten gelegt werden können, wo zsich eine Bitmaske von Zellen befindet, die bereits belegt sind. Die SZuweisung bestimmt, welcher Weg für jedes der Pakete nach oben geht (die größte Dimension <= 5 verläuft vertikal).

Der Code ist möglicherweise exponentiell, aber bei allen Testeingaben ist er schnell.

Keith Randall
quelle
1

GolfScript, 130 Zeichen

"NO":g;~](;3/127{128*64+}12*\{.,0>.!{"YES":g;}*{([{[~@]..[~\]\}3*;]{)6<{~[2\?(]*128base 83,{2\?1$*.4$&0={3$|2$f}*}%;}*}%;}*;;}:f~g

Es hat einige Zeit gedauert, bis es in GolfScript zum Laufen kam. Jeder Versuch, Golf zu spielen, brach einige der Testfälle weiter.

Bitte seien Sie gewarnt, dass diese Version unglaublich langsam werden kann, wenn Sie sie mit zu vielen Geschenken ausführen.

Howard
quelle
Ich habe immer Probleme mit Golfscript. Ich versuche es, ./test ruby golfscript.rb howard.gsaber es gibt mir Fehler. Wie soll ich es aufrufen?
Gareth
@Gareth Sie können einfach ein Semikolon voranstellen, gefolgt von der Eingabe (z. B. ;"1\n6 12 5") in das angegebene Skript.
Howard
Wow, du hast nicht gescherzt, dass es in einigen Fällen langsam ist. Ich muss es vielleicht die ganze Nacht bei den beiden letzten Testfällen lassen (72 bzw. 73 Geschenke ;-)
Gareth
Entschuldigung, es wird Test 5 im Testskript nicht hinter sich lassen. Ich kann nicht upvoten, bis alle Tests bestanden sind.
Gareth
@Gareth Nun, dann wird dieser von Ihrer Seite keine positive Bewertung erhalten ;-) Es implementiert den vollständigen exponentiellen Ansatz, um kurz zu sein. Ich arbeite an einem schnelleren Algorithmus, der jedoch noch nicht zur Einreichung bereit ist. Es benötigt bereits erheblich mehr Platz und ich habe noch einige Fälle für die Implementierung übrig.
Howard