Putar ubin berlian

21

Setiap segi enam biasa dapat diberi ubin berlian, misalnya seperti itu (dicuri dari pertanyaan ini ):

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

Kami akan mempertimbangkan ubin di atas ukuran 1 (karena sisi berlian terbuat dari satu / atau \ masing-masing). Ubin ukuran 2 yang sama akan terlihat seperti:

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

Tugas Anda adalah memutar berlian miring dengan kelipatan 60 derajat. Ubin intan dalam input dapat dalam ukuran apa saja (dan ukurannya tidak ditentukan secara eksplisit dalam input). Tapi itu akan selalu menjadi ubin yang valid, dan semua sisi segi enam akan memiliki panjang yang sama.

Ini adalah contoh di atas yang diputar 60 derajat searah jarum jam:

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

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

Inputnya adalah bilangan bulat non-negatif dan ubin berlian. Program Anda (atau fungsi) harus memutarnya dengan bilangan bulat * 60 derajat. Anda memutuskan apakah akan memutar searah jarum jam atau berlawanan arah jarum jam, selama itu konsisten. Baik input maupun output seharusnya tidak memiliki spasi tambahan tambahan atau spasi tambahan.

Ini adalah kode-golf. Kode terpendek menang.

Pertanyaan-pertanyaan Terkait:

jimmy23013
sumber
12
Martin akan sangat iri!
Pengoptimal

Jawaban:

3

Pyth, 81 byte

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

Cobalah online

Putar berlawanan arah jarum jam.

Setiap rotasi 60 ° dilakukan menggunakan algoritma berikut. Misalkan input adalah segi enam dari urutan k , sehingga memiliki 2⋅ k + 1 baris dan 4⋅ k kolom. Untuk menemukan karakter yang diputar pada baris i kolom j , biarkan

  • u = i + j - k
  • v = j - 3⋅ i + 5⋅ k

Maka karakter keluarannya adalah

  • \, jika inputnya ada /di baris ( u + 1) / 2 kolom ( v + 1) / 2; lain
  • /, jika input ada _di baris u / 2 kolom v / 2 atau baris u / 2 kolom ( v + 2) / 2; lain
  • _, jika input ada \di baris ( u + 2) / 2 kolom v / 2 atau baris ( u + 1) / 2 kolom ( v - 1) / 2; lain
  • ruang.

(Kami tidak menghitung karakter pada indeks setengah bilangan bulat.)

Anders Kaseorg
sumber
Saya pikir Anda dapat menjamin posisi mana yang memiliki \ , hanya saja _Anda harus memeriksa di kedua tempat.
Neil
@Neil Ya, Anda tahu di mana \ s, tetapi Anda mungkin harus menggambar dua _s untuk masing-masing \ .
Anders Kaseorg
Oh, Anda memeriksa setiap garis bawah secara terpisah?
Neil
3

JavaScript (ES6), 452 356 315 byte

Dimana \nmewakili karakter baris baru literal. Sunting: Disimpan 96 byte dengan menyadari bahwa algoritma saya tidak perlu mengetahui jumlah dan ukuran berlian secara terpisah, ditambah beberapa golf kecil yang saya lewatkan pertama kali. Disimpan 41 byte dengan mengatur ulang kode sehingga tujuan selalu pasangan karakter yang sama, ditambah golf kecil yang saya lewatkan ketika mengkonversi ke algoritma saya sebelumnya.

Penjelasan: Mempertimbangkan setiap pasangan karakter output, yang bisa __, /_, _\, /atau \, memeriksa karakter yang sesuai pada input yang memetakan ke karakter-karakter output. Tidak Disatukan:

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');
}
Neil
sumber