테셀 레이트하자!


18

소개

에서 위키 백과 :

평평한 표면 의 테셀레이션 은 겹치지 않고 틈이없는 타일이라고하는 하나 이상의 기하학적 모양을 사용하여 평면을 타일링하는 것입니다.

잘 알려진 테셀레이션은 다음과 같습니다.

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

마름모꼴은 겹치거나 틈이 생기지 않는 방식으로 바둑판 식으로 배열되며 큐브의 열 교환을 시뮬레이션합니다.

직무

당신의 임무는 이미지와 같은 방식으로 마름모꼴 테셀레이션 프로그램을 작성하는 것입니다. 프로그램의 입력은 공간 분할의 치수입니다. height x width여기서 width는 열의 양이고 height는 행의 양입니다.

하나의 큐브 인 1 x 1(마름모꼴 3 타일)은 다음과 같이 정확하게 표현됩니다.

    _____
  /\      \
 /  \      \
/    \ _____\ 
\    /      /
 \  /      /  
  \/_____ /   

따라서 입력 / 치수가 인 3 x 2경우 다음과 같이 출력되어야합니다.

    _____
  /\      \
 /  \      \
/    \ _____\ _____
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
  /\      \    /      /
 /  \      \  /      /
/    \ _____\/_____ /
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
  /\      \    /      /
 /  \      \  /      /
/    \ _____\/_____ /
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
          \    /      /
           \  /      /
            \/_____ /

보다시피, 3 개의 행 (높이)과 2 개의 열 (폭)이 있습니다. 열이 위아래로 교환됩니다. 프로그램도이 작업을 수행하고 더 높은 수준으로 시작해야합니다. 예를 들면 다음과 3 x 3같습니다.

    _____               _____
  /\      \           /\      \
 /  \      \         /  \      \
/    \ _____\ _____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
  /\      \    /      /\      \
 /  \      \  /      /  \      \
/    \ _____\/_____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
  /\      \    /      /\      \
 /  \      \  /      /  \      \
/    \ _____\/_____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
          \    /      /
           \  /      /
            \/_____ /

규칙

  • 결과는 반드시 출력되어야하며, 원하는 방식으로 입력을받을 수 있지만 높이와 너비에 해당해야합니다
  • 후행 줄 바꿈이 허용됩니다
  • 테셀레이션 열은 항상 위에서 시작한 다음 위아래로 번갈아 표시됩니다.
  • 공간 분할의 측면을 공유하고 공간이없는 다른 열 사이에 공간 분할을 올바르게 배치해야합니다.
  • 제출물은 기능 또는 전체 프로그램 일 수 있습니다.
  • 프로그램은 동일한 입력이 주어지면 위의 출력을 정확하게 인쇄해야합니다 . 즉, 출력은 큐브 / 테셀레이션에 대해 동일한 형식을 따라야합니다.

가정

  • 입력이 항상보다 크다고 가정 할 수 1 x 1있으므로 0이 입력되는 경우는 필요하지 않습니다.

채점

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다. 표준 허점도 금지됩니다.

답변:


4

자바 스크립트 (ES6), 243 바이트

f=
(h,w)=>[...Array(h*6+4)].map((_,i)=>[...Array(w*9+3)].map((_,j)=>i&&(i+j+3)%6==0&&j%9<(i>3?6:3)&&(i>3|j<w*9)&&(j>2|i<h*6)?'/':i&&(i-j+2)%6==0&&j%9<(i>h*6?j<w*9?3:0:6)?'\\':i%3==0&&j>2&&(i*3+j+14)%18%(!i|i>h*6?18:12)<4?'_':' ').join``).join`
`
<div oninput=o.textContent=+h.value&&+w.value?f(h.value,w.value):''><input id=h type=number min=1><input id=w type=number min=1><pre id=o>

원하는 모든 문자를 직접 계산합니다. 의 경우 /:

i&&                         Not on first row of output
(i+j+3)%6==0&&              Backward diagonals
j%9<                        Not on top (right) diamond of hexagons or
    (i>3?6:3)&&             empty spaces on top half row
(i>3|j<w*9)&&               Not on top right corner of output
(j>2|i<h*6)                 Not on bottom left corner of output

의 경우 \:

i&&                         Not on first row of output
(i-j+2)%6==0&&              Forward diagonals
j%9<                        Not on bottom (right) diamond of hexagons or
    (i>h*6?                 empty spaces on bottom half row or
        j<w*9?3:0:6)        bottom right corner of output

의 경우 _:

i%3==0&&                    Every third line
j>2&&                       Not on left two columns
(i*3+j+14)%18%              Every 18 characters
    (!i|i>h*6?18:12)<4      One or two groups

3

베 펀지, 277 269 ​​바이트

&6*4+00p&:55+*3+10p2%20pv@
6+5:g03%*54:::<<0+55p03:<<v%*54++55:\p04:**`+3g03g00`\g01+*3!g02\-*84g+3+!\%
48*+,1+:10g`!#^_$,1+:00g-|>30g:2+6%\3-!+3+g48*-\:2`\20g3*+10g\`*30g2`**40g!*+
  /\      \
 /  \      \
/    \ _____\
\    /      /
 \  /      /
  \/_____ /
    _____

온라인으로 사용해보십시오!

이 질문은 믿을 수 없을 정도로 쉬워 보였지만 원래의 예상보다 복잡한 경우가 더 복잡해졌습니다. 내가 얻을 수있는 가장 좋은 방법은 홀수 및 짝수 열을 별도의 렌더링으로 처리 한 다음 결과를 병합하는 것입니다.

따라서 출력해야 할 각 x, y 좌표에 대해 먼저 다음과 같이 큐브 다이어그램에서 x , y 출력 좌표를 u , v 좌표에 매핑하여 홀수 열에 렌더링 할 문자를 결정해야 합니다.

u = x%20
v = (y+5)%6 + (y==0)

추가 (y==0)는 첫 번째 줄의 특수 사례를 처리하는 것입니다. 그러나 열의 맨 아래에 마지막 몇 줄과 각 행 끝에 마지막 몇 줄을 렌더링하지 않아야합니다. 출력 문자에 다음 표현식을 곱하면됩니다.

(y > h-3) && (x > w-3*!(columns%2))

!(columns%2)우리 단부를 트림하는 데 필요한 양이 총 열 개수이 짝수 또는 홀수 냐에 따라 때문에 폭 계산이다.

그런 다음 짝수 열에 어떤 문자를 렌더링해야하는지 결정하기 위해 두 번째 계산을 수행하여 다음과 같이 u , v 좌표를 매핑합니다 .

u = (x+10)%20
v = (y+2)%6 + (y==3)

이것은 홀수 열에 사용 된 것과 동일한 기본 계산이지만 약간 오프셋됩니다. 이전과 마찬가지로 경계에 일부 문자를 렌더링하지 않도록해야합니다. 이번에는 열 상단의 처음 몇 줄과 각 행의 시작과 끝에 일부 문자가 있습니다. 이 경우에 우리가 곱한 표현은 다음과 같습니다.

(y > 2) && (x > 2) && (x < w-3*(columns%2))

이 두 가지 잠재적 인 출력 문자를 계산 한 최종 값은 다음과 같습니다.

char1 + (char2 * !char1) + 32

경우 즉, char1을가 제로 우리는 출력 할 필요가 char2 , 그렇지 않으면 우리 출력 char1을을 . 둘 다 0이 아닌 경우 char1 을 출력 하지만 어쨌든 둘 다 같은 값이므로 괜찮습니다. 또한 이러한 문자 값은 32로 오프셋되므로 32를 더하면 0이 항상 공백으로 표시됩니다.


2

배치, 590 바이트

@echo off
set c=call:c 
set b=\      \
set f=%b:\=/%
set s=       
set u=_____
set w=%2
%c%"   " " %u%" "%s%%s%"
%c%"  " "/%b%" "%s%    "
%c%" " "/  %b%" "%s%  "
%c%"" "/    \ %u%\" " %u% "
for /l %%i in (1,1,%1)do %c%"\" "    %f%" "%b%"&%c%" \" "  %f%" "  %b%"&%c%"  \" "/%u% /" "    \ %u%\"&if %%i lss %1 %c%"  /" "%b%" "    %f%"&%c%" /" "  %b%" "  %f%"&%c%"/" "    \ %u%\" "/%u% /"
%c%"   " "" "%s%\    %f%"
%c%"  " "" "  %s%\  %f%"
%c%" " "" "    %s%\/%u% /"
exit/b
:c
set o=%~1
for /l %%j in (%w%,-2,1)do call set o=%%o%%%~2&if %%j gtr 1 call set o=%%o%%%~3
echo(%o%

:c루틴은 세 개의 매개 변수를; %31과 2 열의 %2차이, 2와 3 열의 차이 %1, 첫 번째 열의 추가 접두사이므로 하나의 열은 %1%2, 두 열은 %1%2%3, 3 열은 %1%2%3%2, 4 열 %1%2%3%2%3등 입니다 .


2

파이썬 2 , 329 326 319 바이트

h,w=input()
a,R=[' '*10]*3,range
b='  /\      \  # /  \      \ #/    \ _____\#\    /      /# \  /      / #  \/_____ /  '.split('#')
c=['    _____    ']+b*h
e,o=c+a,a+c
k=len(e)
f=e[:]
o[3]=o[3][:10]
for x in R(1,w):
 for y in R(k):f[y]+=((e[y][3:],e[y])[y in R(4)],(o[y][3:],o[y])[y in R(k-3,k)])[x%2]
print'\n'.join(f)

온라인으로 사용해보십시오!

실제로 이전 잘못된 게시물보다 21 24 31 바이트 더 짧습니다. 홀수 및 짝수 열에 대한 목록을 만든 다음 너비의 각 열에 대해 연결합니다.


좋은 직업, 골프에 행운을 빕니다
Andrew Li

1
제출에 문제가 있습니다. 연속적으로 아래로 내려 가지 않고 열이 위 아래로 교대로
Andrew Li

1
3x3에 대한 예제를 포함하도록 질문을 편집했습니다.
Andrew Li

그럼에도 불구하고 큰 대답입니다!
Andrew Li
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.