Preencher a tela com azulejos Wang


24

Está provado que os 13 azulejos quadrados Wang a seguir sempre ladrilham o avião de forma periódica . Isso significa que, quando os quadrados são organizados em uma grade com todos os lados vizinhos da mesma cor, uma tradução do padrão nunca coincide com ela mesma.

Wang tiles

Representaremos cada bloco textualmente por uma grade 3 × 3 preenchida com espaços no centro e nos cantos, e os números de 1 a 5 em vez das cores vermelho, verde, azul, amarelo, cinza, nas bordas:

 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

Objetivo

Sua tarefa é escrever um programa que inclua largura e altura e produza uma grade de blocos Wang válida com essas dimensões. Uma peça válida é aquela em que todas as arestas adjacentes têm a mesma cor (ou número). O menor programa em bytes vence.

Sua entrada deve vir de argumentos stdin ou de linha de comando e a saída deve ir para stdout. O formato exato de entrada pode ser algo razoavelmente óbvio, como >>> wangtiler 3 2. A largura e a altura são sempre números inteiros positivos.

Exemplo (largura = 3, altura = 2)

Observe que, quando projetamos os blocos de texto, as bordas vizinhas formam os pares de dígitos redundantes necessários:

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

(Este NÃO é o formato de saída adequado.)

Podemos compactá-los horizontal e verticalmente para obter:

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

Esse formato compactado é o formato de saída adequado que você deve usar. As linhas numeradas ímpares devem incluir seu espaço à direita.

Bônus Gráfico

Em vez de ter qualquer saída de texto, seu programa pode gerar uma imagem da grade lado a lado. Os ladrilhos gráficos devem ser compostos de quatro triângulos 45-45-90 dispostos em um quadrado e usar cinco cores facilmente distinguíveis, como os ladrilhos acima. As bordas pretas não são necessárias. Os blocos gráficos devem ter pelo menos 32 × 32 pixels de tamanho. Nenhuma "compressão" é aplicada a eles.

Exemplo de imagem de bônus: (mesma grade do exemplo acima)

exemplo de bônus

O bônus vale menos 150 bytes.

Notas

  • Você deve usar este conjunto de 13 peças.
  • Os ladrilhos não podem ser girados.
  • As peças podem aparecer várias vezes (incluindo nenhuma).
  • Você pode assumir que é possível um ladrilho válido com todas as dimensões.

Suponho que as peças não possam ser giradas?
Martin Ender

@ MartinBüttner No. Você deve usar o conjunto de 13 peças fornecidas exatamente como elas aparecem.
Hobbies de Calvin

Existe um limite para quantas vezes você pode usar cada bloco? Vejo no seu exemplo que você usou um bloco duas vezes.
Teun Pronk

@TeunPronk Nope. Use-as quantas vezes quiser (é claro que você pode ser forçado a usar mais algumas para combinar corretamente com as bordas).
Hobbies de Calvin

@ Calvin'sHobbies É seguro assumir que sempre existe uma solução possível?
Teun Pronk

Respostas:


12

GolfScript, 200 caracteres

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

Versão ASCII sem saída gráfica. Dê a entrada no STDIN - tente aqui . O código usa uma abordagem simples de retorno e preenche o espaço linha por linha.

Exemplos:

> 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

Bônus gráfico, pontuação 122, 272 caracteres - 150 bônus

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

O mesmo código básico com um formatador de saída diferente. A saída é uma imagem no formato PPM (ou seja, basta redirecionar a saída para um arquivo image.ppm). As cores são ligeiramente diferentes dos ladrilhos da pergunta, mas são claramente distinguíveis (1-> azul, 2-> verde, 3-> ciano, 4-> vermelho, 5-> magenta).

Exemplo 16x12:

Exemplo de 16x12 wang


16

Python (565 - 150 = 415)

Aliás ... parece que não podemos decidir ingenuamente apenas o próximo ladrilho pelo ladrilho esquerdo e superior. Há uma combinação de peças que se encaixam.
Essa solução preenche as forças brutas esquerda> direita, de cima para baixo através de todas as combinações e trilhas possíveis, se um ladrilho não puder caber.

Para obter mais informações sobre a prova de 13 peças : um conjunto aperiódico de 13 peças Wang

Largura e Altura são especificados por WeH

Vermelho, verde, azul, amarelo e Noir especificado por R, G, B, YeN

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

Saída. Não é o esquema de cores real ... porque muito gritante. Isso pode fazer alguns padrões interessantes de decoração de interiores ...:

insira a descrição da imagem aqui


14
Neopolitan Minecraft ...
Calvin's Hobbies

você pode adicionar uma imagem maior? Estou curioso para saber como ficaria
haskeller orgulhoso

11
@proudhaskeller Imagem maior: Imgur . Fabricante de papel de parede: link
vetorizado

11
Isso com certeza parece periódico - o que estou perdendo?
proud haskeller

Quase periódico .. exemplo com mais contraste aqui: Imgur
Vectorizado

2

Haskell, 208 bytes

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

Nenhuma pesquisa, apenas matemática. Exemplo de execução: dado (8,5)em stdin, saídas

 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 

Corra online em Ideone

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.