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.
Passatempos de Calvin
fonte
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

Howard
fonte
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

Vetorizado
fonte
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

Anders Kaseorg
fonte