Biến một bức tranh thành một câu đố trượt


14

Tóm lược

Mục tiêu của thử thách này là tạo ra một phiên bản hình ảnh chưa hoàn tác của câu đố 15 câu đố / trượt còn được gọi là taquin trong tiếng Pháp.

Chi tiết:

Đưa ra một đầu vào bao gồm:

  • một tấm ảnh,
  • một số nguyên n,
  • một số nguyên khác r,

chương trình của bạn, hoặc chức năng, hoặc bất cứ điều gì khác phù hợp, phải xuất ra cùng một hình ảnh ( nghĩa là cùng kích thước và định dạng) làm đầu vào, nhưng trải qua quá trình sau:

  1. chia hình ảnh thành hình chữ nhật,
  2. xóa một trong những hình chữ nhật đó, ngẫu nhiên,
  3. di chuyển một số hình chữ nhật liền kề ngẫu nhiên từ dòng / cột bị ảnh hưởng bởi điểm (2.) để lỗ được tạo được lấp đầy và một cái khác được tạo trong dòng / cột này. Con số này có thể là 0nếu khoảng trống nằm ở một góc hoặc cạnh.

Lặp lại (3.) rlần.

Làm rõ:

  • Nếu bạn di chuyển hình chữ nhật từ dòng trong bước (3.), bạn phải di chuyển hình chữ nhật từ cột trong lần lặp lại tiếp theo,
  • nếu bạn di chuyển các hình chữ nhật từ trái sang phải trong một bước dòng, chúng phải được di chuyển từ phải sang trái trong bước tiếp theo, tương tự cho các cột liên quan từ trên xuống dưới và từ dưới lên trên,
  • bạn có thể cho rằng nó nsẽ được chọn để nó chia chiều dài của các cạnh của bức tranh.

Điểm cuối cùng:

Một phim hoạt hình .gifcho thấy toàn bộ quá trình rất được hoan nghênh.

Tôi đề nghị sử dụng hình ảnh sau đây (nghĩa là 1024x768), với n=16r=100như một mô hình, bạn có thể sử dụng bất kỳ hình ảnh nào khác (miễn là nó phù hợp và tất nhiên tuân thủ các quy tắc của SE).

Lưu ý rằng các chính sách sơ hở tiêu chuẩn áp dụng.

Đây là , vì vậy bài nộp ngắn hơn sẽ thắng!

Những người yêu chó, mèo và vịt nên hài lòng!

Vì một ví dụ đã được yêu cầu, đây là một ví dụ, được thực hiện "bằng tay", với n=4r=1

Bước 1 và 2

nhập mô tả hình ảnh ở đây

Bước 3 : đường thẳng, 2 hình chữ nhật ở bên trái

nhập mô tả hình ảnh ở đây


Ví dụ cho thấy rằng các hình chữ nhật không cần phải có cùng kích thước, không cần che toàn bộ hình ảnh và nên bao gồm các đường được vẽ trên hình ảnh gốc. Bạn có thể làm rõ điều này, bằng cách thay đổi đặc điểm kỹ thuật hoặc ví dụ?
trichoplax

@trichoplax: ví dụ được vẽ bằng tay với sơn và sự nhanh chóng. Tôi sẽ làm lại nó đúng cách.
Frédéric

@trichoplax: Tôi phải thừa nhận rằng tôi hoàn toàn không hiểu ý của bạn, nhưng dòng mở đầu này không cần thiết để hiểu thách thức, vì vậy tôi đoán rằng việc giữ nó là vô ích.
Frédéric

move a random number of contiguous rectanglesnó có thể là 0 hình chữ nhật không? (sẽ là một nỗi đau khi làm cho chương trình thay đổi hành vi khi khoảng trống nằm ở rìa / góc)
JungHwan Min

@JungHwanMin: vâng, nó có thể. Nhận xét tốt, cảm ơn!
Frédéric

Câu trả lời:


10

Toán học, 246 byte

ImageAssemble@(n=Nest)[k=RandomInteger;q=Reverse;({t,r}=1~k~2;q[o=n[q/@#&,#,r]&@*(n[#&,#,t]&)])[o@#/.{a___,b:_~RepeatedNull~k[Position[o@#,i][[1,2]]-1],i,c___}:>{a,i,b,c}]&,MapAt[(i=#~ImageAdd~1)&,#~ImagePartition~Scaled[1/#2],{1,#2}~k~2],#3]&

Chức năng ẩn danh. Chứa U + F3C7, tương ứng với toán Transposetử của Mathicala . Hàm này lấy một Imageđối tượng và trả về một Imageđối tượng.

Hoạt hình mẫu, với n=16r=100

Sau 5000 lần lặp:

nhập mô tả hình ảnh ở đây(Nhấn vào hình để xem hình lớn hơn)

Giải trình

Khởi tạo

n=Nest

Lưu trữ Nestchức năng (lặp lại hoạt động) trong n.

k=RandomInteger;q=Reverse;

Lưu trữ RandomIntegerchức năng trong k, và Reversechức năng trong q.

Tách hình ảnh

#~ImagePartition~Scaled[1/#2]

Phân vùng hình ảnh đầu vào thành (đầu vào thứ hai) ^ 2 gạch.

{1,#2}~k~2

Tạo hai RandomIntegers giữa 1 và đầu vào thứ hai. Điều này chọn một gạch ngẫu nhiên.

MapAt[(i=#~ImageAdd~1)&, ..., {1,#2}~k~2]

Làm cho gạch trắng. Lưu trữ nó trong i.

Di chuyển gạch

{t,r}=1~k~2

Tạo hai số nguyên ngẫu nhiên từ 0 đến 1 và lưu trữ chúng trong tr, tương ứng. Điều này chọn ngẫu nhiên hướng.

o=n[q/@#&,#,r]&@*(n[#&,#,t]&)

Hàm xác định o: thành phần của

  1. một chức năng hoán chuyển tthời gian đầu vào .
  2. một chức năng đảo ngược mỗi rlần hàng .
o @ #

Áp dụng ocho đầu vào.

Position[o@#,i][[1,2]]

Tìm cột của i(ảnh trắng).

k[ ... -1]

Trừ một và tìm một số nguyên ngẫu nhiên trong khoảng từ 0 đến số đó. Điều này ngẫu nhiên chọn bao nhiêu gạch để di chuyển.

o@#/.{a___,b:_~RepeatedNull~ ... ,i,c___}:>{a,i,b,c}

Khi số lượng gạch nói trên xuất hiện trước một i(hình ảnh màu trắng), hãy chuyển vị trí của chúng.

(... q[o= ... ])[ ... ]

Đảo ngược ochức năng và áp dụng điều đó cho kết quả của hoạt động trên. Điều này không đảo ngược và không chuyển đổi hình ảnh.

Vòng lặp và hình ảnh hội

(n=Nest)[ ... ,#3]

Lặp lại quá trình trên (lần nhập thứ ba) lần.

ImageAssemble@

Đặt các hình ảnh với nhau.


1
Câu trả lời tốt đẹp! Cảm ơn các chi tiết!
Frédéric
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.