用王瓷砖填充屏幕


24

已经证明,以下的13平方的Wang块总是不定期地对平面进行平铺。这意味着,当正方形排列成网格时,所有相邻边的颜色都相同,图案的平移将永远不会与其自身匹配。

王瓦

我们将通过一个3×3网格以文本形式表示每个图块,该网格在中心和拐角处都填充有空格,数字1到5代替了边缘处的红色,绿色,蓝色,黄色,灰色。

 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

目标

您的任务是编写一个程序,该程序接受宽度和高度,并输出具有这些尺寸的有效Wang网格。有效平铺是其中所有相邻平铺边缘均具有相同颜色(或编号)的平铺。以字节为单位的最小程序获胜。

您的输入应来自标准输入或命令行参数,输出应输入至标准输出。确切的输入格式可以是任何显而易见的格式,例如>>> wangtiler 3 2。宽度和高度始终为正整数。

示例(宽度= 3,高度= 2)

请注意,当我们布置文本图块时,相邻边形成必要的冗余数字对:

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

(这不是正确的输出格式。)

我们可以水平和垂直压缩它们以获得:

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

此压缩格式是您必须使用的正确输出格式。奇数行必须包含其尾随空格。

图形奖金

程序可能没有输出文本输出,而是输出了平铺网格的图像。图形图块必须由四个以正方形排列的45-45-90三角形组成,并使用五种易于区分的颜色,如上面的图块。黑色边框不是必需的。图形图块的大小必须至少为32×32像素。没有对它们应用“压缩”。

奖励图片示例:(与上面的示例相同的网格)

奖金示例

奖金价值为负150字节。

笔记

  • 您必须使用这套13个磁贴。
  • 瓷砖可能不会旋转。
  • 磁贴可以出现任何次数(包括完全没有出现)。
  • 您可以假设可以进行任何尺寸的有效平铺。

我想瓷砖不能旋转?
马丁·恩德

@MartinBüttner否。您必须使用所提供的13个磁贴的集合,它们完全与显示的样子相同。
加尔文的爱好2014年

每个磁贴可以使用多少次有限制?我在您的示例中看到您一次使用了一个图块。
Teun Pronk

@TeunPronk不。可以根据需要多次使用它们(当然,您可能不得不使用其中一些来正确匹配边缘)。
卡尔文的爱好

@ Calvin'sHobbies可以肯定地总是存在一个可行的解决方案吗?
Teun Pronk

Answers:


12

GolfScript,200个字符

~\: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}/

ASCII版本,无图形输出。在STDIN上提供输入- 在此处尝试。该代码使用简单的回溯方法,并逐行填充空格。

例子:

> 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

图形奖金,得分122,272个字符-150个奖金

~\: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}/}/

相同的基本代码,不同的输出格式化程序。输出是PPM格式的图像(即,仅将输出重定向到file image.ppm)。颜色与问题中的图块略有不同,但可以清楚地区分(1->蓝色,2->绿色,3->青色,4->红色,5->洋红色)。

16x12示例:

16x12 wang示例


16

Python(565-150 = 415)

顺便说一句...似乎我们不能天真地通过其左图和顶图来决定下一个图块。有一些组合的瓷砖可以互相配合。
如果瓷砖无法容纳,此解决方案将通过所有可能的组合和回溯来填充从左到右,从上到下的蛮力。

有关13瓦片证明的更多信息:非周期性的13 Wang瓦片集

宽度和高度由W和指定H

红,绿,蓝,黄,辄指定由RGBYN

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()

输出。不是实际的配色方案...因为太刺眼了。这可能会产生一些有趣的室内装饰图案...:

在此处输入图片说明


14
Neopolitan Minecraft ...
Calvin's

您可以添加更大的图片吗?我很好奇它的外观
骄傲的haskeller 2014年

1
@proudhaskeller放大图像:Imgur。壁纸制造商:链接
矢量化

1
这肯定看起来是周期性的-我想念什么?
骄傲的haskeller 2014年

几乎是周期性的..例如,此处具有更多对比:Imgur
2014年

2

Haskell,208个字节

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

没有搜索,只有数学。运行示例:(8,5)在stdin上给出,输出

 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 

在Ideone在线运行

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.