Il problema dell'imballaggio della slitta


11

Gli elfi di Babbo Natale hanno bisogno di aiuto per determinare se la loro attuale serie di regali si adatta alla slitta di Babbo Natale. Scrivi il programma più breve possibile nella lingua che preferisci per aiutarli.

vincoli

  • La slitta di Babbo Natale misura 6 piedi di larghezza per 12 piedi di lunghezza ed è profonda 4 piedi.
  • I regali possono essere fragili, quindi potrebbero non essere sovrapposti.
  • Puoi ruotare e capovolgere i regali come desideri, ma Babbo Natale è un tipo ossessivo-compulsivo, quindi mantieni le rotazioni a multipli di 90 gradi.
  • Le norme di salute e sicurezza del Polo Nord stabiliscono che i regali non possono sporgere più di 1 metro sopra la cima di una slitta (quindi non possono essere più alti di 5 piedi).

Ingresso

L'input sarà attivo STDINe sarà un numero intero che rappresenta il numero di presenti nel batch seguito da un elenco delle dimensioni dei presenti: 1 presente per riga, 3 dimensioni (in piedi) separate da spazi.

Esempi:

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

Produzione

L'output dovrebbe essere solo la parola "SÌ" se i regali possono essere inseriti nella slitta o "NO" se non possono.

Output per gli esempi sopra:

YES

YES

NO

NO

Script di test

Come prima, ho stanziato alcuni script di test scritti da Joey e Ventero per creare alcuni test per questo compito: -

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

Rewards

Ogni voce che posso verificare che soddisfa le specifiche, supera i test e ha ovviamente avuto qualche tentativo di giocare a golf riceverà un mio voto (quindi per favore fornisci le istruzioni per l'uso con la tua risposta). La soluzione più breve entro la fine del 2011 sarà accettata come vincitrice.


Ci è permesso di ruotare i regali? Capovolgerli dalla loro parte? Ruotali di un angolo che non sia un multiplo di 90 °?
Ilmari Karonen,

@IlmariKaronen Sì, puoi ruotare i regali secondo l'orientamento desiderato purché si adattino. Penso che la matematica coinvolta nel sistemare le scatole in un angolo che non sia un multiplo di 90 sarebbe troppo complicata, no? Ho assunto solo rotazioni di 90 gradi per i test.
Gareth,

@IlmariKaronen Dopo ulteriori riflessioni, penso di dover eliminare le rotazioni di altri multipli di 90 gradi per evitare di complicare eccessivamente la domanda e per garantire che i test forniscano risposte corrette. Aggiungerò un ulteriore vincolo.
Gareth,

Perché l'esempio 3 è un no quando l'esempio 1 è un sì? 6x12x5 è più grande di 6x12x4, quindi è consentito sporgere in alto? In tal caso, perché 3 è un no perché anche quello può sporgere in alto?
Skizz,

1
@Skizz: è formulato in modo confuso, ma vedi il quarto vincolo: i regali possono sporgere di 1 metro dalla parte superiore. Quindi la profondità effettiva della slitta è di 5 piedi, non di 4 piedi.
Ilmari Karonen,

Risposte:


3

Haskell, 312 318 caratteri

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"

Per qualche motivo che al momento non capisco del tutto, non termina i test n. 9 e n. 16 in tempi ragionevoli. Ma non hai detto nulla sulle prestazioni, vero?


373 383 caratteri

Questa versione funziona molto più velocemente per gli esempi: prima controlla se non è impossibile semplicemente perché l'area è troppo piccola, quindi inizia con i pacchi più grandi invece di inserirli nell'ordine dato. Si noti che il rilevamento dell'area non è perfetto: non considera le rotazioni, quindi su alcuni input può dare risultati errati. Ma funziona con lo script di test.

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"

No, non mi preoccupavo delle prestazioni, ma il programma deve superare tutti i test per ottenere il mio voto. Attualmente sta funzionando sul test 9. Lascerò un po 'per vedere se finisce.
Gareth,

@Gareth dovrò ottimizzarlo ancora un po '.
cessò di girare in senso antiorario il

Ok. Sta ancora lavorando al test 9 qui.
Gareth,

2

Python, 461 caratteri

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'

Lcontrolla ricorsivamente se i rettangoli in Ppossono essere inseriti nella slitta, dove zè presente una maschera di bit di celle che sono già occupate. L' Sassegnazione determina la direzione in cui si trova ciascuno dei pacchetti (la dimensione maggiore <= 5 va in verticale).

Il codice è potenzialmente esponenziale, ma è rapido su tutti gli input di test.


1

GolfScript, 130 caratteri

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

Ci è voluto un po 'di tempo per farlo funzionare in GolfScript. Ogni tentativo di golf ha ulteriormente rotto alcuni dei casi di test.

Tieni presente che questa versione potrebbe diventare incredibilmente lenta se la esegui con troppi regali.


Ho sempre problemi con quelli di golfscript. Ci sto provando ./test ruby golfscript.rb howard.gsma mi sta dando errori. Come dovrei invocarlo?
Gareth,

@Gareth Potresti semplicemente anteporre il punto e virgola seguito dall'input (es. ;"1\n6 12 5") Per lo script dato.
Howard,

Wow, non stavi scherzando sul fatto che fosse lento in alcuni casi. Potrei doverlo lasciare tutta la notte negli ultimi due casi di test (rispettivamente 72 e 73 regali ;-)
Gareth,

Spiacenti, non supererà il test 5 nello script di test. Non posso votare fino a quando non ha superato tutti i test.
Gareth,

@Gareth Bene, allora questo non otterrà un voto dalla tua parte ;-) Implementa l'approccio esponenziale completo per essere breve. Sto lavorando a un algoritmo più veloce ma non è ancora pronto per l'invio. Ha già bisogno di molto più spazio e ho ancora alcuni casi da implementare.
Howard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.