旋转钻石瓷砖


21

任何规则的六边形都可以用钻石平铺,例如这样(从该问题中被盗):

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

我们将考虑上述大小为1的拼贴(因为钻石的侧面由一个/或\组成)。大小为2的相同拼贴如下所示:

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

您的任务是将钻石平铺旋转60度的倍数。输入中的菱形图块可以是任何大小(并且未在输入中明确指定大小)。但这将始终是有效的平铺,并且六边形的所有边都将具有相同的长度。

这些是上面的示例,顺时针旋转60度:

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

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

输入为非负整数和菱形平铺。您的程序(或函数)应将其旋转整数* 60度。您可以决定是顺时针还是逆时针旋转,只要一致即可。输入和输出都不应有多余的前导或尾随空格。

这是代码高尔夫球。最短的代码胜出。

相关问题:


12
马丁会如此嫉妒!
Optimizer

Answers:


3

Pyth,81个字节

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

在线尝试

逆时针旋转。

使用以下算法执行每60°旋转。假设输入是顺序的六边形ķ,所以它有2⋅ ķ + 1行和4⋅ ķ列。为了找到排旋转的性格Ĵ,让

  • u = i + jk
  • v = Ĵ - 3⋅ +5⋅ ķ

然后输出字符是

  • \,如果输入/的行(u + 1)/ 2列(v + 1)/ 2;其他
  • /,如果输入具有_在行ü / 2列v / 2或行ú / 2柱(v + 2)/ 2; 其他
  • _,如果输入\的行(u + 2)/ 2列v / 2或行(u + 1)/ 2列(v − 1)/ 2;其他
  • 空间。

(我们不计算半整数索引处的字符。)


我认为您可以保证哪个位置都有\ ,这_就是您在两个位置都必须检查的。
尼尔

@Neil是的,您知道\ s 在哪里,但是您可能必须_为每个绘制两个s \
安德斯·卡塞格

哦,您分别检查每个下划线吗?
Neil

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');
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.