Lấp đầy màn hình với Wang Tiles


24

Người ta đã chứng minh rằng 13 ô vuông Wang sau đây luôn xếp máy bay theo định kỳ . Điều này có nghĩa là khi các hình vuông được sắp xếp trong một lưới với tất cả các cạnh lân cận cùng màu, một bản dịch của mẫu sẽ không bao giờ khớp với chính nó.

Gạch Wang

Chúng tôi sẽ đại diện cho từng ô một cách văn bản bằng lưới 3 × 3 được lấp đầy các khoảng trống ở giữa và các góc, và các số từ 1 đến 5 thay vì các màu đỏ, xanh lá cây, xanh dương, vàng, xám, ở các cạnh:

 2      2      2      1      1      1      4      3      2      2      4      3      2
1 2    1 3    2 3    2 1    3 1    3 2    4 4    4 4    4 5    4 5    5 5    5 5    5 4
 3      2      3      2      3      2      1      2      1      4      1      2      2

Mục tiêu

Nhiệm vụ của bạn là viết một chương trình có chiều rộng và chiều cao và xuất ra lưới ô Wang hợp lệ với các kích thước đó. Ốp lát hợp lệ là một trong đó tất cả các cạnh gạch liền kề có cùng màu (hoặc số). Chương trình nhỏ nhất tính bằng byte thắng.

Đầu vào của bạn phải đến từ stdin hoặc đối số dòng lệnh và đầu ra sẽ đi đến thiết bị xuất chuẩn. Các định dạng đầu vào chính xác có thể là bất cứ điều gì hợp lý rõ ràng, như >>> wangtiler 3 2. Chiều rộng và chiều cao luôn là số nguyên dương.

Ví dụ (width = 3, height = 2)

Lưu ý rằng khi chúng ta bố trí các ô văn bản, các cạnh lân cận tạo thành các cặp chữ số dự phòng cần thiết:

 1  2  1 
2 11 22 1
 2  3  2 
 2  3  2 
4 55 55 4
 1  2  2 

(Đây KHÔNG phải là định dạng đầu ra thích hợp.)

Chúng ta có thể nén chúng theo chiều ngang và chiều dọc để có được:

 1 2 1 
2 1 2 1
 2 3 2 
4 5 5 4
 1 2 2 

Định dạng nén này là định dạng đầu ra thích hợp bạn phải sử dụng. Các dòng được đánh số lẻ phải bao gồm không gian dấu của chúng.

Tiền thưởng đồ họa

Thay vì có bất kỳ đầu ra văn bản nào, chương trình của bạn có thể xuất ra hình ảnh của lưới lát gạch. Các ô đồ họa phải được tạo thành từ bốn hình tam giác 45-45-90 được sắp xếp trong một hình vuông và sử dụng năm màu dễ phân biệt như các hình trên. Các đường viền màu đen là không cần thiết. Các ô đồ họa phải có kích thước tối thiểu 32 × 32 pixel. Không "nén" được áp dụng cho họ.

Hình ảnh phần thưởng ví dụ: (cùng lưới như ví dụ trên)

ví dụ tiền thưởng

Phần thưởng có giá trị trừ 150 byte.

Ghi chú

  • Bạn phải sử dụng bộ 13 gạch này.
  • Gạch có thể không được xoay.
  • Gạch có thể xuất hiện bất kỳ số lần (bao gồm không có lần nào).
  • Bạn có thể giả sử ốp lát hợp lệ với bất kỳ kích thước nào là có thể.

Tôi cho rằng gạch không thể được xoay?
Martin Ender

@ MartinBüttner Số Bạn phải sử dụng bộ 13 gạch được cung cấp chính xác như chúng xuất hiện.
Sở thích của Calvin

Có giới hạn số lần bạn có thể sử dụng mỗi ô không? Tôi thấy trong ví dụ của bạn, bạn đã sử dụng một lát hai lần.
Teun Pronk

@TeunPronk Không. Sử dụng chúng theo nhiều lần bạn muốn (tất nhiên bạn có thể buộc phải sử dụng nhiều hơn một số để khớp đúng các cạnh).
Sở thích của Calvin

@ Calvin'sHob sở thích Có an toàn không khi cho rằng luôn có một giải pháp khả thi?
Teun Pronk

Câu trả lời:


12

GolfScript, 200 ký tự

~\:W*):R;1,{)\:C"=QCy_~{MTKAis]?OyJE?~WvM"[64 2400]{base}/@{>}+,{:T;[C,W<!{C W~)=T 64/^8/8%}*C,W%0>{C-1=64/T^8%}*]0-!},1<.!!{1,+}*+.,R<}do);W/.0={' '\512/8%`}%n@{.[.0=8%\{' '\64/8%}/n]\{' '\8/8%`}%n}/

Phiên bản ASCII không có đầu ra đồ họa. Cung cấp đầu vào trên STDIN - thử ở đây . Mã sử ​​dụng một cách tiếp cận quay lui đơn giản và lấp đầy dòng không gian theo từng dòng.

Ví dụ:

> 3 2
 1 2 1
2 1 2 1
 2 3 2
5 4 4 5
 2 2 1

> 8 5
 1 2 1 2 1 2 1 2
2 1 2 1 2 1 2 1 2
 2 3 2 3 2 3 2 3
5 4 4 5 5 4 4 5 5
 2 2 4 2 2 2 4 2
5 4 5 5 4 5 4 4 5
 2 1 1 2 1 2 1 1
1 3 2 1 2 1 3 2 1
 2 2 2 3 2 2 2 2
5 4 5 4 4 5 4 5 4
 2 1 2 2 1 2 1 2

Phần thưởng đồ họa, điểm 122, 272 ký tự - 150 phần thưởng

~\:W*):R;1,{)\:C"=QCy_~{MTKAis]?OyJE?~WvM"[64 2400]{base}/@{>}+,{:T;[C,W<!{C W~)=T 64/^8/8%}*C,W%0>{C-1=64/T^8%}*]0-!},1<.!!{1,+}*+.,R<}do);W["P3\n"32W*" "3$,32*n 1n]\{{:^;512:X;16,{[^8%]1$*[^X/8%]31*@.+>[^64/8%]31*++32<}:F%8:X;16,-1%{F}%+}%zip{{+}*{8+2base(;~}%' '*n}/}/

Cùng một mã cơ bản với một định dạng đầu ra khác nhau. Đầu ra là một hình ảnh ở định dạng PPM (nghĩa là chỉ cần chuyển hướng đầu ra thành một tệp image.ppm). Màu sắc hơi khác so với gạch trong câu hỏi, nhưng có thể phân biệt rõ ràng (1-> xanh dương, 2-> xanh lục, 3-> lục lam, 4-> đỏ, 5-> đỏ tươi).

Ví dụ 16x12:

Ví dụ wang 16x12


16

Con trăn (565 - 150 = 415)

Btw ... có vẻ như chúng ta không thể ngây thơ quyết định gạch tiếp theo bởi gạch bên trái và trên cùng của nó. Có một số kết hợp gạch sẽ phù hợp với nhau.
Giải pháp này lấp đầy ở bên trái-> bên phải, từ trên xuống> lực lượng vũ phu thông qua tất cả các kết hợp và quay lui có thể nếu một ô không thể phù hợp.

Để biết thêm thông tin về bằng chứng 13 ô: Một bộ gồm 13 ô Wang

Chiều rộng và chiều cao được chỉ định bởi WH

Red, Green, Blue, Yellow và Noir theo quy định của R, G, B, YN

import Image,sys
W,H=map(int,sys.argv[1:])
R=99
G=R<<8
B=G<<8
Y=G+R
N=0
s="RGB";u=32;g=[[0,0]]*W*H;k=f=0
def t(c):i=Image.new(s,(2,2));k=i.load();q=16;k[1,0],k[1,1],k[0,1],k[0,0]=c;return i.resize([64]*2).rotate(45).crop((q,q,q+u,q+u))
while k<H*W:
 z=g[k][1];v=-1;j=k/W;i=k%W
 while z<13:
    l=map(eval,"GGGRRRYBGGYBGGBBRRGYYNNNNYBGBGBGRGRYRGGRRGGBBYYYYNNN"[z::13])
    if(j<1or g[(j-1)*W+i][0][2]==l[0])and(i<1or g[j*W+i-1][0][1]==l[3]):g[k]=[l,z+1];v=1;z=99
    z+=1
 g[k][1]*=(v>0);k+=v
m=Image.new(s,(W*u,H*u))
for e in g:m.paste(t(e[0]),(f%W*u,(f/W)*u));f+=1
m.show()

Đầu ra. Không phải bảng màu thực tế ... vì quá chói. Điều này có thể làm cho một số mẫu trang trí nội thất thú vị ...:

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


14
Minecraft Neopolitan ...
Sở thích của Calvin

bạn có thể thêm một hình ảnh lớn hơn? Tôi tò mò trông nó sẽ như thế nào
tự hào

1
@proudhaskeller Hình ảnh lớn hơn: Imgur . Nhà sản xuất hình nền: link
Vectorized

1
Điều này chắc chắn trông định kỳ - tôi đang thiếu gì?
tự hào

Hầu như định kỳ .. ví dụ với độ tương phản nhiều hơn ở đây: Imgur
Vectorized

2

Haskell, 208 byte

p x|x<2/3=(3!x)3"3212"3
p x=(0.5!x)1"45423"2
f=floor
(k!x)l s m=do{i<-[0,x..];[' ',s!!(2+f(i+x)-f i)]}:do{i<-[0,l*x..];s!!mod(f i)m:" "}:p(k*x)
t n=take$2*n+1
main=do(w,h)<-readLn;putStr.unlines.t h$t w<$>p 1

Không tìm kiếm, chỉ là toán học. Chạy ví dụ: được đưa ra (8,5)trên stdin, đầu ra

 2 2 2 2 2 2 2 2 
4 5 4 5 4 5 4 5 4
 1 2 1 2 1 2 1 2 
3 2 3 2 3 2 3 2 3
 2 3 2 3 2 3 2 3 
4 5 5 4 4 5 5 4 4
 4 2 2 2 4 2 2 2 
4 4 5 4 5 5 4 5 4
 1 1 2 1 1 2 1 2 
3 2 1 3 2 1 3 2 3
 2 2 2 2 2 2 2 3 

Chạy trực tuyến tại Ideone

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.