ダイヤモンドタイルを回転させる


21

たとえば、次のように、通常の六角形にダイヤモンドを並べることができます(この質問から盗まれました)。

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

上記はサイズ1のタイルと考えます(ダイヤモンドの側面はそれぞれ1つまたは\で作られているため)。サイズ2の同じタイリングは次のようになります。

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

あなたの仕事は、ダイヤモンドのタイルを60度の倍数だけ回転させることです。入力のダイアモンドタイルは任意のサイズにすることができます(サイズは入力で明示的に指定されていません)。しかし、それは常に有効なタイリングであり、六角形のすべての辺は同じ長さを持ちます。

これらは、時計回りに60度回転した上記の例です。

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

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

入力は、負でない整数と菱形のタイルです。プログラム(または関数)は、整数* 60度だけ回転する必要があります。一貫性がある限り、時計回りに回転するか反時計回りに回転するかを決定します。入力と出力の両方に余分な先頭または末尾のスペースがあってはなりません。

これはコードゴルフです。最短のコードが優先されます。

関連する質問:


12
マーティンはとてもjeします!
オプティマイザー

回答:


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個の列を。行ijで回転した文字を見つけるには、

  • 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にある場合、他に
  • スペース。

(半整数インデックスの文字はカウントしません。)


どのポジションにがあるかを保証できると思います。両方の場所でチェックする必要があるの\ _s だけです。
ニール

@Neilはい、あなたは\ sがどこにあるか知っていますが_、それぞれに対して2を描画する必要があるかもしれません\
アンデルスカセオルグ

ああ、各アンダースコアを個別にチェックしますか?
ニール

3

JavaScript(ES6)、452 356 315バイト

where \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.