Vấn đề đóng gói xe trượt tuyết


11

Yêu tinh của ông già Noel cần giúp đỡ trong việc xác định xem lô quà hiện tại của họ có phù hợp với xe trượt tuyết của ông già Noel không. Viết chương trình ngắn nhất có thể bằng ngôn ngữ bạn chọn để giúp họ.

Những ràng buộc

  • Xe trượt tuyết của ông già Noel rộng 6ft dài 12ft và sâu 4ft.
  • Quà có thể dễ vỡ, vì vậy chúng có thể không được xếp chồng lên nhau.
  • Bạn có thể xoay và lật các món quà theo ý muốn, nhưng ông già Noel khá ám ảnh, vì vậy hãy giữ các góc quay thành bội số 90 độ.
  • Các quy định về sức khỏe và an toàn của Bắc Cực quy định rằng các món quà không được vượt quá 1ft so với đỉnh của một chiếc xe trượt tuyết (do đó chúng có thể không cao hơn 5ft).

Đầu vào

Đầu vào sẽ được bật STDINvà sẽ là một số nguyên biểu thị số lượng quà tặng trong lô theo sau là danh sách các kích thước của quà tặng - 1 hiện tại trên mỗi dòng, 3 kích thước (tính theo feet) được phân tách bằng khoảng trắng.

Ví dụ:

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

Đầu ra

Đầu ra chỉ nên là từ 'CÓ' nếu quà có thể được đóng gói vào xe trượt tuyết hoặc 'KHÔNG' nếu không thể.

Đầu ra cho các ví dụ trên:

YES

YES

NO

NO

Kiểm tra kịch bản

Như trước đây, tôi đã chiếm đoạt một số kịch bản thử nghiệm được viết bởi JoeyVentero để tạo một số thử nghiệm cho nhiệm vụ này: -

Sử dụng: ./test [your program and its arguments]

Phần thưởng

Mỗi mục mà tôi có thể xác minh đáp ứng thông số kỹ thuật, vượt qua các bài kiểm tra và rõ ràng đã có một số nỗ lực chơi gôn sẽ nhận được một upvote từ tôi (vì vậy vui lòng cung cấp hướng dẫn sử dụng với câu trả lời của bạn). Giải pháp ngắn nhất vào cuối năm 2011 sẽ được chấp nhận là người chiến thắng.


Chúng ta có được phép xoay quà không? Lật chúng về phía họ? Xoay chúng theo một góc không phải là bội số của 90 °?
Ilmari Karonen

@IlmariKaronen Có, bạn có thể xoay quà đến bất kỳ hướng nào bạn muốn miễn là phù hợp. Tôi nghĩ rằng các phép toán liên quan đến việc lắp các hộp vào một góc không phải là bội số của 90 sẽ quá phức tạp phải không? Tôi đã giả định chỉ xoay 90 độ cho các bài kiểm tra.
Gareth

@IlmariKaronen Sau khi suy nghĩ thêm, tôi nghĩ rằng tôi cần loại bỏ các phép quay khác 90 độ để tránh làm phức tạp câu hỏi và để đảm bảo các bài kiểm tra đưa ra câu trả lời chính xác. Tôi sẽ thêm một ràng buộc.
Gareth

Tại sao ví dụ 3 không có khi ví dụ 1 là có? 6x12x5 lớn hơn 6x12x4 vậy hiện tại có được phép chọc ra đỉnh không? Trong trường hợp nào tại sao 3 không vì nó cũng có thể lọt ra khỏi đầu?
Skizz

1
@Skizz: Đó là cụm từ khó hiểu, nhưng xem ràng buộc thứ tư: quà có thể dính 1ft ra khỏi đầu. Vì vậy, độ sâu hiệu quả của xe trượt tuyết là 5ft chứ không phải 4ft.
Ilmari Karonen

Câu trả lời:


3

Haskell, 312 318 ký tự

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"

Vì một số lý do mà tôi không hiểu đầy đủ vào lúc này, nó không hoàn thành bài kiểm tra số 9 và # 16 của bạn trong thời gian hợp lý. Nhưng bạn đã không nói gì về hiệu suất, phải không?


373 383 ký tự

Phiên bản này chạy nhanh hơn nhiều cho các ví dụ: đầu tiên nó kiểm tra nếu không phải là không thể đơn giản vì diện tích quá nhỏ, và sau đó nó bắt đầu với các bưu kiện lớn nhất thay vì chèn chúng theo thứ tự nhất định. Lưu ý rằng phát hiện khu vực không hoàn hảo: nó không xem xét các phép quay, do đó, một số đầu vào có thể cho kết quả sai. Nhưng nó không hoạt động với kịch bản thử nghiệm.

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"

Không, tôi không quan tâm đến hiệu suất, nhưng chương trình phải vượt qua tất cả các bài kiểm tra để có được upvote của tôi. Nó hiện đang làm việc trên bài kiểm tra 9. Tôi sẽ rời khỏi đó một lúc để xem nó kết thúc chưa.
Gareth

@Gareth Tôi sẽ phải tối ưu hóa nó một chút.
đã ngừng quay ngược chiều

Đồng ý. Nó vẫn đang làm việc ở bài kiểm tra 9 ở đây.
Gareth

2

Python, 461 ký tự

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'

Lkiểm tra đệ quy nếu các hình chữ nhật trong Pcó thể được đặt trong xe trượt tuyết, nơi zcó một bitmask của các ô đã bị chiếm đóng. Việc Sgán xác định cách nào cho mỗi gói (kích thước lớn nhất <= 5 đi theo chiều dọc).

Mã này có khả năng theo cấp số nhân, nhưng nó nhanh chóng trên tất cả các đầu vào thử nghiệm.


1

GolfScript, 130 ký tự

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

Phải mất khá nhiều thời gian để nó chạy trong GolfScript. Bất kỳ nỗ lực để chơi gôn, nó đã phá vỡ thêm một số trường hợp thử nghiệm.

Xin lưu ý rằng phiên bản này có thể trở nên cực kỳ chậm nếu bạn chạy nó với quá nhiều quà.


Tôi luôn gặp rắc rối với những người chơi golf. Tôi đang cố gắng ./test ruby golfscript.rb howard.gsnhưng nó cho tôi lỗi. Làm thế nào tôi nên gọi nó?
Gareth

@Gareth Bạn có thể chỉ cần thêm dấu chấm phẩy theo sau là đầu vào (ví dụ ;"1\n6 12 5") cho tập lệnh đã cho.
Howard

Ồ, bạn không đùa về việc nó bị chậm trong một số trường hợp. Tôi có thể phải để nó suốt đêm trong hai trường hợp thử nghiệm cuối cùng (lần lượt là 72 và 73 món quà ;-)
Gareth

Xin lỗi, nó sẽ không vượt qua bài kiểm tra 5 trong kịch bản kiểm tra. Tôi không thể nâng cấp cho đến khi nó vượt qua tất cả các bài kiểm tra.
Gareth

@Gareth Chà, cái này sẽ không nhận được upvote từ phía bạn ;-) Nó thực hiện cách tiếp cận theo cấp số nhân đầy đủ để được ngắn gọn. Tôi đang làm việc trên một thuật toán nhanh hơn nhưng nó chưa sẵn sàng để nộp. Nó cần nhiều không gian hơn đáng kể và tôi vẫn còn một số trường hợp để thực hiện.
Howard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.