ASCII 6 각형 그리드 그리기 및 레이블 지정


12

에서 내 이전 문제 , 나는 주로 손으로 (정력의 시각 블록 모드의 도움으로) 첫 번째 그림을 그렸습니다. 그러나 더 좋은 방법이 있어야합니다 ...


너비와 높이의 두 가지 차원을 입력하면 ASCII 기술에서 해당 차원을 가진 6 각형 격자를 출력합니다.

다음은 인트로에서 참조 된 다이어그램 (사소한 편집)이며 입력에 대한 출력이어야합니다 width=7, height=3.

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/

몇 가지 사항에 유의하십시오.

  • 너비와 높이는 기본적으로 주어진 y 및 x 좌표에 대해 육각형이 몇 개인 지에 해당합니다. 이들은 항상 홀수입니다.

  • 각 육각형은 ASCII 기술로 표현됩니다.

      _____
     /     \
    /       \
    \       /
     \_____/
    

    그러나 인접한 육각형간에 경계가 "공유"됩니다.

  • 좌표의 쉼표는 항상 상단 가장자리 중심 아래에서 정확히 두 문자입니다. 그런 다음 x 좌표는 쉼표 바로 앞에, y 좌표는 바로 뒤에 위치합니다.

    좌표가 육각형 테두리와 겹치지 않도록 절대로 클 수는 없습니다.

입력은 공백 / 쉼표로 구분 된 문자열, 정수 배열 또는 두 개의 함수 / 명령 줄 인수로 사용할 수 있습니다. 출력은 단일 문자열이어야합니다 (STDOUT에 반환 값 등).

이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.

위의 그리드는 테스트 케이스로 사용할 수 있습니다. 최대 크기의 width=199, height=199그리드는 여기에 포함하기에는 실용적이지 않지만 처음 몇 개의 행과 열은 다음과 같아야합니다.

         _____         ___
        /     \       /   
  _____/-98,-99\_____/-96,
 /     \       /     \    
/-99,-99\_____/-97,-99\___
\       /     \       /   
 \_____/-98,-98\_____/-96,
 /     \       /     \    
/-99,-98\_____/-97,-98\___
\       /     \       /   
 \_____/-98,-97\_____/-96,
 /     \       /     \    
/-99,-97\_____/-97,-97\___
\       /     \       /   

답변:


2

루비, 221 바이트

->w,h{s=' '
a=(s*9+?_*5)*(w/2)+$/
(2-h*2).upto(h*2+3){|y|c=y<4-h*2 
a+=[b=c ?s:?\\,s+b,s,''][y%4]
(0-w/2).upto(w/2){|x|a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",s*7,?_*5,"/     \\"][(y+x*2+w)%4]%[x,y/4]}
a+='//  '[c ?3:y%4]+$/}
a}

테스트 프로그램에서 언 골프

f=->w,h{
  s=' '                                #set s to space for golfing reasons
  a=(s*9+?_*5)*(w/2)+$/                #start building the output with a row of just _ and space

  (2-h*2).upto(h*2+3){|y|              #iterate 4 times for each row of hexagons, plus an extra 2 at the end to finish last row
    c=y<4-h*2                          #condition for first two rows
    a+=[b=c ?s:?\\,s+b,s,''][y%4]      #string to be output before main set of hexagons (spaces for top row, \ for certain other rows

    (0-w/2).upto(w/2){|x|              #iterate through hexagons on each row, 4 lines for each with the following printf type string
      a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",#line 1:contains ends / \ and numbers 
         s*7,                          #line 2 padding spaces
         ?_*5,                         #line 3 padding ___
         "/     \\"][(y+x*2+w)%4]%     #line 0 top of hexagon / \; formula to select string to be printed
           [x,y/4]                     #numbers to be printed (if format for current line does not require them they are ignored)
    }

    a+='//  '[c ?3:y%4]+$/             #ending alternates between / and space; / are suppressed for first two rows
  }
  a
}

puts g[7,3]
puts g[5,5]

산출

디버깅을 마치면서 사양에 모호함이 나타났습니다. w+14로 나눌 수있는 곳 에서 첫 x 좌표와 마지막 x 좌표는 홀수이며 모호성이 없습니다. 그러나 w-14로 나눌 수 있는 곳 은 첫 번째와 마지막 x 좌표가 짝수입니다. 첫 번째 열과 마지막 열이 다음 열 아래에서 오프셋되어야한다고 가정했습니다. 그러나 이전 질문을 읽고이 경우 짝수 열 아래로 오프셋되어야하는 홀수 열입니다 ( w-14로 나눌 수 있음에 대해서는 둘 다 할 수는 없습니다).

그러나이 질문에서는 그러한 구분이 이루어지지 않았습니다. 나는 이것을 OP의 판단에 맡기고 필요할 경우 재 작업 할 것입니다.

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