Kızak Paketleme sorunu


11

Noel Baba'nın elflerinin mevcut hediye partilerinin Noel Baba'nın kızağına uygun olup olmayacağının belirlenmesinde yardıma ihtiyacı var. Onlara yardımcı olmak için mümkün olan en kısa programı istediğiniz dilde yazın.

Kısıtlamalar

  • Noel Baba'nın kızağı 6ft genişliğinde 12ft uzunluğunda ve 4ft derinliğindedir.
  • Hediyeler kırılgan olabilir, bu yüzden üst üste istiflenmeyebilirler.
  • Hediyeleri istediğiniz gibi döndürebilir ve çevirebilirsiniz, ancak Noel Baba oldukça takıntılı-kompulsif bir adamdır, bu nedenle rotasyonları 90 derecenin katlarına tutun.
  • Kuzey Kutbu sağlık ve güvenlik düzenlemeleri, hediyelerin bir kızak üstünden 1ft'den daha fazla çıkmayabileceğini öngörmektedir (bu nedenle 5ft'den daha yüksek olamazlar).

Giriş

Girdi açık olacak STDINve toplu işteki hediye sayısını temsil eden bir tamsayı olacak ve ardından hediye boyutlarının bir listesi olacak - satır başına 1, boşluklarla ayrılmış 3 boyut (fit olarak).

Örnekler:

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

Çıktı

Eğer hediyeler kızağa sığabiliyorsa, çıktı sadece 'EVET' veya yapamazlarsa 'HAYIR' olmalıdır.

Yukarıdaki örnekler için çıktı:

YES

YES

NO

NO

Test komut dosyaları

Daha önce olduğu gibi, bu görev için bazı testler oluşturmak için Joey ve Ventero tarafından yazılan bazı test komut dosyalarını kullandım : -

Kullanımı: ./test [your program and its arguments]

Ödüller

Spesifikasyonu karşıladığını doğrulayabildiğim, testleri geçtiğini ve golfte bazı girişimlerde bulunduğunu doğrulayabildiğim her giriş benden bir upvote alacak (bu yüzden lütfen cevabınızla birlikte kullanım talimatlarını sağlayın). 2011 yılı sonunda en kısa çözüm kazanan olarak kabul edilecektir.


Hediyeleri döndürmemize izin var mı? Onları yana mı çeviriyorsun? Onları 90 ° 'nin katı olmayan bir açıyla döndürür müsünüz?
Ilmari Karonen

@IlmariKaronen Evet, hediyeleri sığdırdıkları sürece istediğiniz yöne döndürebilirsiniz. Sanırım kutuların 90'ların katı olmayan bir açıyla kutulara yerleştirilmesinde yer alan matematik aşırı karmaşık olurdu değil mi? Testler için sadece 90 derecelik dönüşler varsaydım.
Gareth

@IlmariKaronen Daha fazla düşündüğümde, soruyu aşırı karmaşıklaştırmaktan kaçınmak ve testlerin doğru cevaplar vermesini sağlamak için 90 derecenin diğer katlarını döndürmem gerektiğini düşünüyorum. Ek bir kısıtlama ekleyeceğim.
Gareth

Örnek 1 evet olduğunda örnek 3 neden hayır? 6x12x5 6x12x4'den daha büyüktür, bu yüzden üst kısmı dışarı atmaya izin verilir mi? Bu durumda neden üst kısımdan çıkabileceği için 3 hayır hayır?
Skizz

1
@Skizz: Kafa karıştırıcı bir şekilde ifade edildi, ancak dördüncü kısıtlamaya bakın: hediyeler en üste 1ft yapışabilir. Böylece kızağın etkili derinliği 4ft değil, 5ft'dir.
Ilmari Karonen

Yanıtlar:


3

Haskell, 312318 karakter

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"

Şu anda tam olarak anlamadığım bir nedenden dolayı, # 9 ve # 16 testlerinizi makul sürede bitirmiyor. Ama performans hakkında hiçbir şey söylemedin, değil mi?


373 383 karakter

Bu sürüm örnekler için çok daha hızlı çalışır : önce alanın çok küçük olması nedeniyle imkansız olup olmadığını kontrol eder ve daha sonra verilen sırayla eklemek yerine en büyük parsellerle başlar. Alan algılamanın mükemmel olmadığını unutmayın: dönüşleri dikkate almaz, bu nedenle bazı girişlerde yanlış sonuçlar verebilir. Ancak test komut dosyası ile çalışır.

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"

Hayır, performansla ilgili değildi, ama program benim oyumu almak için tüm testleri geçmek zorunda. Şu anda test 9 üzerinde çalışıyor. Bitip bitmediğini görmek için bir süre bırakacağım.
Gareth

@ Gareth Henüz biraz optimize etmem gerekecek.
saat yönünün tersine çevirmeyi bıraktı

Tamam. Burada hala test 9 üzerinde çalışıyor.
Gareth

2

Python, 461 karakter

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'

Liçindeki dikdörtgenlerin zaten işgal edilmiş olan hücrelerin bir bit maskesi olan kızağa Pyerleştirilip yerleştirilemeyeceğini tekrar tekrar kontrol eder z. SAtama (en büyük boyutu <5 dikey olarak geçer) paketlerin her biri için olan bir yolu belirler.

Kod potansiyel olarak üsteldir, ancak tüm test girişlerinde hızlıdır.


1

GolfScript, 130 karakter

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

GolfScript'te yayınlanması biraz zaman aldı. Golf oynamak için yapılan herhangi bir girişim bazı test senaryolarını kırdı.

Çok fazla hediye ile çalıştırırsanız bu sürümün inanılmaz derecede yavaşlayabileceğini lütfen unutmayın.


Golfscript ile her zaman sorun yaşıyorum. Deniyorum ./test ruby golfscript.rb howard.gsama bana hata veriyor. Nasıl çağırmalıyım?
Gareth

@Gareth Noktalı virgül ve ardından ;"1\n6 12 5"verilen komut dosyasının girişini (ör. ) Başlatabilirsiniz .
Howard

Vay canına, bazı durumlarda bunun yavaş olduğundan şaka yapmıyordun. Son iki test vakasında bütün gece bırakmak zorunda kalabilirim (sırasıyla 72 ve 73 hediye ;-)
Gareth

Maalesef, test komut dosyasında test 5'i geçmeyecek. Tüm testleri geçene kadar oy kullanamıyorum.
Gareth

@Gareth Peki, o zaman bu sizin tarafınızdan bir yukarı oy almaz ;-) Kısa olması için tüm üstel yaklaşımı uygular. Daha hızlı bir algoritma üzerinde çalışıyorum ancak henüz sunulmaya hazır değil. Zaten çok daha fazla alana ihtiyacı var ve hala uygulama için bazı davalarım var.
Howard
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.