Chute-A-Pearing


16

Dưới đây là năm hình ảnh của quả lê và máng thép :

A: B: C: D: E:lê A lê B lê C lê D lê E

Đây chỉ là hình thu nhỏ, nhấp vào chúng cho kích thước đầy đủ!

(Tôi đã làm những thứ này với Algodoo .)

Lớp hình ảnh này luôn có các thuộc tính sau:

  1. Chúng luôn có kích thước 400 × 400 pixel với nền trắng. (Nó có thể không chính xác màu trắng vì hình ảnh SE bị nén một cách mất mát.)
  2. Chúng có 1 đến 4 quả lê giống hệt nhau, mỗi quả lê được xoay và định vị theo (gần như) bất kỳ cách nào.
  3. Họ có một máng thép thẳng đứng chạm đến đáy của hình ảnh.
  4. Khác với phần dưới của máng, máng và các ô giới hạn ( ví dụ hộp giới hạn ) không bao giờ chạm hoặc đi ra khỏi giới hạn hình ảnh.
  5. Các hộp giới hạn của quả lê không bao giờ chồng lên nhau cũng không chồng lên nhau.
  6. Quả lê có thể bị phần dốc của đường trượt, như trong B , C , và D . (Vì vậy, hộp giới hạn của máng có thể chồng lên hộp giới hạn của quả lê.)
  7. Máng trượt có thể có bất kỳ vị trí ngang và dọc miễn là có đủ chỗ cho tất cả các hộp giới hạn của quả lê để tự do nằm trên nó (không có trường hợp "vừa khít" nào được kiểm tra) và có thể nhìn thấy một phần của phần cột.

Thử thách

Viết một chương trình lấy một hình ảnh như vậy và xuất ra một hình ảnh 400 × 400 khác với máng ở cùng một vị trí, nhưng với các quả lê được đặt lại vị trí sao cho tất cả chúng nằm trên máng (để chúng có thể rơi vào đó và được ép và không có gì).

Các yêu cầu cho hình ảnh đầu ra là:

  1. Tất cả các quả lê trong hình ảnh đầu vào phải được định vị lại sao cho chúng nằm phía trên máng, giữa cạnh trái và phải của kênh. (Trên một cạnh là không ổn.)
  2. Mỗi quả lê phải duy trì góc quay của nó. (Vì vậy, bạn nên cắt và dán những quả lê, không vẽ lại chúng.)
  3. Các quả lê không được chồng lên nhau hoặc chạm vào nhau hoặc máng. (Các hộp giới hạn lê có thể chồng lên nhau.)
  4. Các quả lê không được chạm hoặc đi ra khỏi giới hạn hình ảnh.

Dưới đây là ví dụ về đầu ra hợp lệ cho năm hình ảnh mẫu:

A: B: C: D: E:ra A ra B ra C ra D ra D

Đây chỉ là hình thu nhỏ, nhấp vào chúng cho kích thước đầy đủ!

Lưu ý rằng hình ảnh đầu vào cho E đã là đầu ra hợp lệ, nhưng sắp xếp lại các quả lê khi không cần thiết về mặt kỹ thuật là tốt.

Chi tiết

  • Lấy tên tệp của hình ảnh hoặc dữ liệu hình ảnh thô thông qua lệnh gọi stdin / dòng lệnh / hàm.
  • Xuất hình ảnh ra một tệp với tên bạn chọn hoặc xuất dữ liệu tệp hình ảnh thô thành thiết bị xuất chuẩn hoặc chỉ đơn giản là hiển thị hình ảnh.
  • Bất kỳ định dạng tập tin hình ảnh lossless phổ biến có thể được sử dụng.
  • Thư viện đồ họa và hình ảnh có thể được sử dụng.
  • Một vài pixel không chính xác ở đây và ở đó (do mất hoặc một cái gì đó) không phải là một vấn đề lớn. Nếu tôi không thể nói bất cứ điều gì là sai về mặt trực quan thì có lẽ không sao.

Mã ngắn nhất tính bằng byte thắng. Tiebreaker là bài bình chọn cao nhất.


Vì tôi có tài khoản Khan Academy, và điều này có vẻ hoàn hảo để giải quyết ở đó, tôi có thể giải quyết nó trên Khan Academy không? Chỉ có một biến chứng: hình ảnh bên ngoài không được phép. May mắn thay, tôi có thể chạy các hình ảnh thông qua điều này để chuyển đổi chúng thành dữ liệu thân thiện của Khan Academy. điều này có chấp nhận được không?
BobTheAwgie

@BobTheAwgie Vậy bạn có muốn đăng câu trả lời JavaScript không? Điều đó tốt, mặc dù nó được cho là nhập và xuất hình ảnh 400x400. Bạn có thể đăng tác phẩm của mình để thể hiện cách bạn đã làm với KA nhưng tôi có thể không chấp nhận nó là người chiến thắng nếu nó không hoạt động trên hình ảnh 400x400.
Sở thích của Calvin

Một sự trùng hợp hoàn hảo; Khan Academy thật sự có mặc định là khung vẽ 400x400px cho Javascript + Pjs.
BobTheAwgie

Không!! Imagenator siêu chậm trên hình ảnh 400x400 !!
BobTheAwgie

Câu trả lời:


6

Python 2.7, 636 byte

import sys;from PIL.Image import*
_,m,R,I,p,H=255,400,range,open(sys.argv[1]).convert('RGB'),[],0
w,h=I.size;W,A,P,L=(_,_,_),[(x,y)for x in R(w)for y in R(h)],I.load(),I.copy()
try:
 while 1:
    s,x,y,X,Y=[[a for a in A if P[a][0]<50][0]],m,m,0,0
    while s:c=(a,b)=s.pop();x,y,X,Y=min(x,a),min(y,b),max(X,a),max(Y,b);P[c]=W;s+=[n for n in[(a+1,b),(a,b+1),(a-1,b),(a,b-1)]if n in A and P[n]!=W]
    p+=[((x,y,X,Y),X-x,Y-y)]
except:0
def G(a):r,g,b=P[a];return r==g==b and r<_
g=[a for a in A if G(a)]
(z,t),W=g[0],max([x for x,y in g]);t-=1
for r,w,h in p:
 if z+w>W:z,_=g[0];t-=H;H=0
 I.paste(L.crop(r),(z,t-h,z+w,t));z+=w;H=max(h,H)
I.show()

EDIT : bây giờ xóa kênh alpha trước khi xử lý hình ảnh và căn chỉnh các quả lê trên một số hàng nếu cần thiết

Hình ảnh sản xuất:

Một B C D và E

và với lê dọc (mất khoảng 3 phút trên máy tính của tôi):

tủ thử theo chiều dọc


1
Là những hình ảnh befores / afters? Nếu vậy tôi nghĩ bạn đã lấy nhầm cái cho BE ...
Sp3000

hình ảnh đầu vào ở bên trái và hình ảnh đầu ra ở bên phải ... chúng hoàn toàn không phải là pixel do thay đổi kích thước và dán sao chép, tôi đã đặt chúng chỉ để đưa ra gợi ý về cách hoạt động của kịch bản ..
ăn kiêng

Điều này sẽ làm việc nếu tất cả các quả lê là ngang ?
Sở thích của Calvin

thực tế là không ... vì hai lý do: nó rơi vào một vòng lặp vô hạn vì hình ảnh cụ thể này có kênh alpha -> sửa tập lệnh để nó chuyển đổi hình ảnh trước. Một lý do khác là tôi đã loại bỏ mã sắp xếp các quả lê trên một số hàng -> đặt nó trở lại
ăn kiêng
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.