다이아몬드 타일링 회전


21

예를 들어 어떤 정규 육각형도 다이아몬드로 타일링 할 수 있습니다 ( 이 질문 에서 도난 당함 ).

   ______
  /_/_/\_\
 /_/\_\/\_\
/\_\/_/\/_/\
\/_/\_\/_/\/
 \_\/_/\_\/
  \_\_\/_/

위의 크기 1의 타일링을 고려할 것입니다 (다이아몬드면이 각각 / 또는 \로 구성되어 있기 때문에). 크기 2의 동일한 타일링은 다음과 같습니다.

      ____________
     /   /   /\   \
    /___/___/  \___\
   /   /\   \  /\   \
  /___/  \___\/  \___\
 /\   \  /   /\  /   /\
/  \___\/___/  \/___/  \
\  /   /\   \  /   /\  /
 \/___/  \___\/___/  \/
  \   \  /   /\   \  /
   \___\/___/  \___\/
    \   \   \  /   /
     \___\___\/___/

당신의 임무는 60 도의 배수로 다이아몬드 타일을 회전시키는 것입니다. 입력의 다이아몬드 타일링은 임의의 크기 일 수 있습니다 (그리고 입력에 크기가 명시 적으로 지정되지 않았습니다). 그러나 항상 유효한 타일링이며 육각형의 모든면의 길이는 같습니다.

위의 예는 시계 방향으로 60도 회전합니다.

   ______
  /_/\_\_\
 /\_\/_/\_\
/\/_/\_\/_/\
\/\_\/_/_/\/
 \/_/\_\_\/
  \_\/_/_/

      ____________
     /   /\   \   \
    /___/  \___\___\
   /\   \  /   /\   \
  /  \___\/___/  \___\
 /\  /   /\   \  /   /\
/  \/___/  \___\/___/  \
\  /\   \  /   /   /\  /
 \/  \___\/___/___/  \/
  \  /   /\   \   \  /
   \/___/  \___\___\/
    \   \  /   /   /
     \___\/___/___/

입력은 음이 아닌 정수와 다이아몬드 타일링입니다. 프로그램 (또는 함수)은 정수 * 60도 회전해야합니다. 일관된 한 시계 방향 또는 반 시계 방향으로 회전할지 결정합니다. 입력과 출력 모두에 선행 또는 후행 공백이 없어야합니다.

이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다.

관련 질문 :


12
마틴은 너무 질투합니다!
Optimizer

답변:


3

Pyth, 81 바이트

ju.es.e.reh|@s.e.e[yYykZ)bGCa+LV,t-y+k*3Y*5J-+kY/lG2Jc2j406610 4K"_/\\_\\"dKbGQ.z

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

시계 반대 방향으로 회전합니다.

각 60 ° 회전은 다음 알고리즘을 사용하여 수행됩니다. 입력 값이 차수 k 의 육각형 이므로 2⋅ k + 1 개의 행과 4⋅ k 개의 열 이 있다고 가정합니다 . 행에서 회전 된 문자를 찾으려면 난의J를 ,하자

  • u = i + jk
  • v = j − 3⋅ i + 5⋅ k

그런 다음 출력 문자는

  • \입력이 /행 ( u + 1) / 2 열 ( v + 1) / 2 인 경우; 그밖에
  • /입력이 _u / 2 열 v / 2 또는 행 u / 2 열 ( v + 2) / 2 인 경우; 그밖에
  • _입력이 \행 ( u + 2) / 2 열 v / 2 또는 행 ( u + 1) / 2 열 ( v -1) / 2 인 경우; 그밖에
  • 공간.

(우리는 반 정수로 된 문자는 포함하지 않습니다.)


난 당신이 가지고있는 위치를 보장 할 수 있다고 생각 \ 이 단지의,들 _당신이 두 곳에서 확인해야한다는들.
Neil

@Neil 예, 당신은의 위치를 ​​알고 \ 있지만 _각각에 대해 두 개의을 그려야 할 수도 있습니다 \ .
Anders Kaseorg

아, 밑줄 하나 하나 따로 확인 해요?
Neil

3

자바 스크립트 (ES6), 452 356 315 바이트

어디 \n리터럴 개행 문자를 나타냅니다. 편집 : 내 알고리즘이 다이아몬드의 수와 크기를 별도로 알 필요가 없다는 것을 인식하고 96 바이트를 절약했습니다. 대상이 항상 동일한 문자 쌍이되도록 코드를 재정렬하여 41 바이트를 절약했으며 이전 알고리즘으로 변환 할 때 놓친 작은 골프도있었습니다.

설명 : 될 수있는 출력 문자의 각 쌍, 고려합니다 __, /_, _\, /또는 \, 그 출력 문자에 매핑 입력에서 해당 문자를 확인합니다. 언 골프 드 :

function rotate(str, num) {
  // Measure the size using the indent of the _ in the first row.
  var size = str.indexOf('_');
  var arr = str.split('\n');
  while (num--) {
    // We build a character array to represent the output by turning the
    // input into a nested array and replacing everything with spaces.
    // Note that the output will have any trailing spaces from the input.
    var res = arr.map(s => Array.from(s).fill(' '));
    // Loop over a diamond that encloses the hexagon.
    for (var destrow = 0; destrow <= size * 2; destrow++) {
      for (var col = 0; col <= size * 2; col++) {
        var destcol = size + col * 2 - destrow;
        var srcrow = size + destrow - col;
        var srccol = destrow + col;
        // Map / to __, \ to / and __ to \.
        // We write __ first in case it gets overwritten by / or \.
        if (arr[srcrow]) {
          if (arr[srcrow][srccol] == '/') {
            res[destrow][destcol] = res[destrow][destcol + 1] = '_';
          }
          if (arr[srcrow][srccol - 1] == '\\') {
            res[destrow][destcol] = '/';
          }
        }
        // Need to check both positions in case one was overwritten.
        if (arr[srcrow - 1] &&
            (arr[srcrow - 1][srccol] == '_' || arr[srcrow - 1][srccol - 1] == '_')) {
          res[destrow][destcol + 1] = '\\';
        }
      }
    }
    arr = res.map(a => a.join(''));
  }
  return arr.join('\n');
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.