왕 타일로 화면을 채우십시오


24

다음 13 개의 정사각형 왕 타일은 항상 평면을 비 주기적으로 타일링하는 것으로 입증되었습니다 . 즉, 사각형이 인접한 모든 변이 같은 색으로 격자에 배열되면 패턴의 변환이 절대 그 자체와 일치하지 않습니다.

왕 타일

가운데와 모서리에 공백으로 채워진 3x3 격자와 가장자리의 빨강, 녹색, 파랑, 노랑, 회색 대신 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

당신의 임무는 너비와 높이를 차지하고 해당 크기의 유효한 왕 타일 그리드를 출력하는 프로그램을 작성하는 것입니다. 유효한 타일링은 모든 인접한 타일 가장자리가 동일한 색상 (또는 숫자)을 갖는 타일입니다. 바이트 단위의 가장 작은 프로그램이 이깁니다.

입력은 stdin 또는 명령 행 인수에서 가져오고 출력은 stdout으로 이동해야합니다. 정확한 입력 형식은 다음과 같이 합리적으로 명백 할 수 있습니다 >>> 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 삼각형 4 개로 구성되어야하며 위의 타일과 같이 쉽게 구별 할 수있는 5 가지 색상을 사용해야합니다. 검은 색 테두리는 필요하지 않습니다. 그래픽 타일의 크기는 32 × 32 픽셀 이상이어야합니다. "압축"이 적용되지 않습니다.

보너스 이미지 예 : (위의 예와 동일한 그리드)

보너스 예

보너스는 150 바이트를 뺀 값입니다.

노트

  • 이 13 개의 타일 세트를 사용해야합니다.
  • 타일이 회전하지 않을 수 있습니다.
  • 타일은 여러 번 나타날 수 있습니다 (아무 것도 포함하지 않음).
  • 치수가 유효한 타일링이 가능하다고 가정 할 수 있습니다.

타일을 회전시킬 수 없다고 생각합니까?
Martin Ender

@ MartinBüttner 아니요. 표시된대로 정확하게 제공된 13 개 타일 세트를 사용해야합니다.
Calvin 's Hobbies

각 타일을 사용할 수있는 횟수에 제한이 있습니까? 귀하의 예에서 하나의 타일을 두 번 사용했습니다.
Tune Pronk

@TeunPronk Nope. 그러나 원하는만큼 여러 번 사용하십시오 (물론 가장자리에 올바르게 맞추기 위해 더 많은 것을 사용해야 할 수도 있습니다).
Calvin 's Hobbies

@ Calvin'sHobbies 항상 가능한 해결책이 있다고 가정하는 것이 안전합니까?
Tune Pronk

답변:


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 형식의 이미지입니다 (즉, 단순히 출력을 파일로 리디렉션 image.ppm). 색상은 문제의 타일과 약간 다르지만 명확하게 구별 가능합니다 (1-> 파랑, 2-> 녹색, 3-> 청록색, 4-> 빨간색, 5-> 자홍색).

16x12 예 :

16x12 왕 예


16

파이썬 (565-150 = 415)

Btw ... 우리는 왼쪽 및 상단 타일로 다음 타일을 순진하게 결정할 수없는 것 같습니다. 서로 맞는 타일 조합이 있습니다.
이 솔루션은 타일을 맞출 수없는 경우 가능한 모든 조합과 역 추적을 통해 왼쪽-> 오른쪽, 위쪽-> 다운 무차별 대입을 채 웁니다.

13 타일 증명에 대한 자세한 정보 : 13 Wang 타일의 비 주기적 세트

너비와 높이는 WH

적색, 녹색, 청색, 노란색과 노아 지정하여 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()

산출. 실제 색 구성표가 아닙니다. 이것은 흥미로운 인테리어 장식 패턴을 만들 수 있습니다 ... :

여기에 이미지 설명을 입력하십시오


14
네오 폴리탄 마인 크래프트 ...
캘빈의 취미

더 큰 사진을 추가 할 수 있습니까? 나는 그것이 어떻게 보일지 궁금하다
자랑스런 Haskeller

1
@proudhaskeller 큰 이미지 : Imgur . 월페이퍼 메이커 : link
Vectorized

1
이 확실한 것은 주기적으로 보입니다-내가 뭘 놓쳤습니까?
자랑스런 Haskeller

거의 주기적으로 .. 더 많은 대조를 가진 예 : Imgur
벡터화

2

하스켈, 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에서 온라인 실행

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.