Masalah Kemasan Giring

11

Peri-peri Santa membutuhkan bantuan dalam menentukan apakah kumpulan hadiah mereka saat ini akan cocok dengan giring santa. Tulis program sesingkat mungkin dalam bahasa pilihan Anda untuk membantu mereka.

Kendala

  • Giring Santa berukuran lebar 6 kaki x 12 kaki dan dalamnya 4 kaki.
  • Hadiah mungkin rapuh, sehingga tidak dapat ditumpuk satu sama lain.
  • Anda dapat memutar dan membalik hadiah seperti yang Anda inginkan, tetapi Sinterklas cukup obsesif-kompulsif sehingga menjaga rotasi hingga kelipatan 90 derajat.
  • Peraturan kesehatan dan keselamatan Kutub Utara menetapkan bahwa hadiah tidak boleh lebih dari 1 kaki di atas giring (oleh karena itu, tingginya mungkin tidak lebih dari 5 kaki).

Memasukkan

Input akan menyala STDINdan akan menjadi satu bilangan bulat yang mewakili jumlah hadiah dalam kumpulan diikuti oleh daftar dimensi hadiah - 1 hadiah per baris, 3 dimensi (dalam kaki) dipisahkan oleh spasi.

Contoh:

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

Keluaran

Keluaran seharusnya berupa kata 'YA' jika hadiah dapat dimasukkan ke dalam kereta luncur atau 'TIDAK' jika tidak bisa.

Output untuk contoh di atas:

YES

YES

NO

NO

Skrip uji

Seperti sebelumnya, saya telah menggunakan beberapa skrip uji yang ditulis oleh Joey dan Ventero untuk membuat beberapa tes untuk tugas ini: -

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

Hadiah

Setiap entri yang saya dapat verifikasi yang memenuhi spesifikasi, lulus tes dan jelas telah mencoba golf akan menerima upvote dari saya (jadi tolong berikan instruksi penggunaan dengan jawaban Anda). Solusi terpendek pada akhir 2011 akan diterima sebagai pemenang.

Gareth
sumber
Apakah kami boleh memutar hadiah? Balikkan mereka di sisi mereka? Putar dengan sudut yang bukan kelipatan 90 °?
Ilmari Karonen
@IlmariKaronen Ya, Anda dapat memutar hadiah ke setiap orientasi yang Anda inginkan asalkan sesuai. Saya pikir matematika yang terlibat dalam pemasangan kotak pada sudut yang bukan kelipatan 90 akan terlalu rumit bukan? Saya mengasumsikan hanya rotasi 90 derajat untuk tes.
Gareth
@IlmariKaronen Setelah berpikir lebih jauh, saya pikir saya perlu menghilangkan rotasi kelipatan 90 derajat lainnya untuk menghindari masalah yang terlalu rumit, dan untuk memastikan bahwa tes memberikan jawaban yang benar. Saya akan menambahkan batasan tambahan.
Gareth
Mengapa contoh 3 tidak, sedangkan contoh 1 adalah ya? 6x12x5 lebih besar dari 6x12x4 jadi apakah ini diizinkan untuk menyodok bagian atas? Kalau begitu kenapa 3 tidak karena itu juga bisa menonjol?
Skizz
1
@ Skizz: Ini membingungkan, tetapi lihat kendala keempat: hadiah mungkin tetap 1ft di atas. Jadi kedalaman giring yang efektif adalah 5 kaki, bukan 4 kaki.
Ilmari Karonen

Jawaban:

3

Haskell, 312 318 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"

Untuk beberapa alasan yang saya tidak sepenuhnya mengerti saat ini, itu tidak menyelesaikan tes Anda # 9 dan # 16 dalam waktu yang wajar. Tetapi Anda tidak mengatakan apa-apa tentang kinerja, bukan?


373 383 karakter

Versi ini berjalan lebih cepat untuk contoh-contoh: pertama-tama memeriksa apakah itu tidak mungkin hanya karena area terlalu kecil, dan kemudian dimulai dengan parsel terbesar daripada memasukkannya dalam urutan yang diberikan. Perhatikan bahwa deteksi area tidak sempurna: itu tidak mempertimbangkan rotasi, jadi mungkin pada beberapa input memberikan hasil yang salah. Tapi itu berhasil dengan skrip uji.

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"
tidak lagi mengaktifkan counterclockwis
sumber
Tidak, saya tidak peduli dengan kinerja, tetapi program ini harus lulus semua tes untuk mendapatkan upvote saya. Saat ini sedang mengerjakan tes 9. Saya akan membiarkannya untuk melihat apakah sudah selesai.
Gareth
@ Gareth Saya harus mengoptimalkannya sedikit.
lagi mengaktifkan counterclock dengan
Baik. Ini masih bekerja pada tes 9 di sini.
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'

Lsecara rekursif memeriksa apakah persegi panjang di Pdapat dimasukkan ke dalam giring, di mana zbitmask sel yang sudah ditempati. The Stugas menentukan cara yang untuk masing-masing paket (dimensi terbesar <= 5 berjalan secara vertikal).

Kode berpotensi eksponensial, tetapi cepat pada semua input tes.

Keith Randall
sumber
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

Butuh beberapa waktu untuk menjalankannya di GolfScript. Setiap upaya untuk bermain golf lebih lanjut memecahkan beberapa kasus uji.

Harap diingat bahwa versi ini mungkin menjadi sangat lambat jika Anda menjalankannya dengan terlalu banyak hadiah.

Howard
sumber
Saya selalu memiliki masalah dengan skrip golf. Saya mencoba ./test ruby golfscript.rb howard.gstetapi itu memberi saya kesalahan. Bagaimana saya harus memohonnya?
Gareth
@ Gareth Anda mungkin hanya menambahkan titik koma diikuti oleh input (misalnya ;"1\n6 12 5") ke skrip yang diberikan.
Howard
Wow, Anda tidak bercanda tentang itu lambat dalam beberapa kasus. Saya mungkin harus meninggalkannya sepanjang malam pada dua test case terakhir (masing-masing 72 dan 73 ;-)
Gareth
Maaf, ini tidak akan melewati pengujian 5 dalam skrip pengujian. Saya tidak dapat memilih hingga lulus semua tes.
Gareth
@ Gareth Yah, maka yang ini tidak akan mendapatkan upvote dari sisi Anda ;-) Ini menerapkan pendekatan eksponensial penuh agar pendek. Saya sedang mengerjakan algoritma yang lebih cepat tetapi belum siap untuk diajukan. Butuh lebih banyak ruang dan saya masih memiliki beberapa kasus untuk implementasi.
Howard