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


21

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

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

Ми розглянемо вищевказану плитку розміром 1 (оскільки сторони алмазів виготовлені з однієї / або \ кожної). Один і той же плитка розміром 2 виглядатиме так:

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

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

Ось наведені вище приклади, повернені на 60 градусів за годинниковою стрілкою:

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

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

Вхід - це невід'ємне ціле число та алмазна плитка. Ваша програма (або функція) повинна обертати її на ціле число * 60 градусів. Ви вирішуєте, чи слід обертати за годинниковою або проти годинникової стрілки, якщо це буде послідовно. І вхід, і вихід не повинні мати додаткових провідних або кінцевих пробілів.

Це код-гольф. Найкоротший код виграє.

Пов’язані запитання:


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, це саме те _, що вам доведеться перевірити в обох місцях.
Ніл

@Neil Так, ви знаєте, де \ знаходиться, але, можливо, вам доведеться намалювати по два _s для кожного \ .
Anders Kaseorg

О, ви перевіряєте кожне підкреслення окремо?
Ніл

3

JavaScript (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');
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.