Поверните алмазную плитку

21

Любой обычный шестиугольник может быть облицован бриллиантами, например, так (украдено из этого вопроса ):

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

Мы рассмотрим выше плитку размером 1 (так как стороны алмазов сделаны из одной / или \ каждой). Тот же лист размером 2 будет выглядеть так:

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

Ваша задача состоит в том, чтобы повернуть угол наклона алмаза кратным 60 градусам. Алмазная плитка на входе может быть любого размера (и размер явно не указан на входе). Но это всегда будет действительный тайлинг, и все стороны шестиугольника будут иметь одинаковую длину.

Это приведенные выше примеры, повернутые на 60 градусов по часовой стрелке:

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

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

В качестве входного значения используется неотрицательное целое число и мозаичный ромб. Ваша программа (или функция) должна повернуть ее на целое число * 60 градусов. Вы сами решаете, вращать ли по часовой стрелке или против часовой стрелки, если это не противоречит. И на входе, и на выходе не должно быть лишних начальных или конечных пробелов.

Это код-гольф. Самый короткий код выигрывает.

Смежные вопросы:

jimmy23013
источник
12
Мартин будет таким ревнивым!
Оптимизатор

Ответы:

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 столбцов. Чтобы найти повернутый символ в строке i столбца j ,

  • u = i + j - k
  • 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; еще
  • Космос.

(Мы не учитываем символы с полуцелыми индексами.)

Андерс Касеорг
источник
Я думаю, вы можете гарантировать, какие позиции имеют \ s, это просто _s, которые вы должны проверить в обоих местах.
Нил
@Neil Да, вы знаете, где \ s, но вам, возможно, придется нарисовать два _s для каждого \ .
Андерс Касеорг
О, вы проверяете каждое подчеркивание отдельно?
Нил
3

JavaScript (ES6), 452 356 315 байт

Где \nпредставляет буквальный символ новой строки. Редактировать: сэкономил 96 байт, поняв, что моему алгоритму не нужно знать количество и размер алмазов отдельно, а также несколько мелких гольфов, которые я пропустил в первый раз. Сэкономил 41 байт, переставив код так, чтобы в пункте назначения всегда была одна и та же пара символов, а также небольшой гольф, который я пропустил при переходе к моему предыдущему алгоритму.

Объяснение: Считает каждую пару выходных символов, которые могут быть __, /_, _\, /или \, проверку для соответствующих символов ввода , которые отображают на эти выходные символы. Ungolfed:

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');
}
Нил
источник