Xoay một viên kim cương


21

Bất kỳ hình lục giác thông thường nào cũng có thể được lát bằng kim cương, ví dụ như vậy (bị đánh cắp từ câu hỏi này ):

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

Chúng tôi sẽ xem xét phần trên của kích thước 1 (vì các cạnh của kim cương được làm bằng một / hoặc \ mỗi cái). Ốp lát tương tự của kích thước 2 sẽ trông như sau:

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

Nhiệm vụ của bạn là xoay nghiêng kim cương bằng bội số 60 độ. Ốp lát kim cương trong đầu vào có thể ở bất kỳ kích thước nào (và kích thước không được chỉ định rõ ràng trong đầu vào). Nhưng nó sẽ luôn là một ốp lát hợp lệ và tất cả các cạnh của hình lục giác sẽ có cùng chiều dài.

Đây là những ví dụ trên xoay 60 độ theo chiều kim đồng hồ:

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

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

Đầu vào là một số nguyên không âm và ốp lát kim cương. Chương trình của bạn (hoặc chức năng) sẽ xoay nó theo số nguyên * 60 độ. Bạn quyết định xoay theo chiều kim đồng hồ hay ngược chiều kim đồng hồ, miễn là phù hợp. Cả đầu vào và đầu ra không nên có thêm khoảng trắng ở đầu hoặc cuối.

Đây là mã golf. Mã ngắn nhất sẽ thắng.

Câu hỏi liên quan:


12
Martin sẽ rất ghen tị!
Tối ưu hóa

Câu trả lời:


3

Bình thường, 81 byte

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

Dùng thử trực tuyến

Xoay ngược chiều kim đồng hồ.

Mỗi vòng quay 60 ° được thực hiện bằng thuật toán sau. Giả sử đầu vào là một hình lục giác có thứ tự k , vì vậy nó có 2⋅ k + 1 hàng và 4⋅ k cột. Để tìm ký tự xoay ở hàng i cột j , hãy để

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

Sau đó, ký tự đầu ra là

  • \, nếu đầu vào có /tại hàng ( u + 1) / 2 cột ( v + 1) / 2; khác
  • /, nếu đầu vào có _ở hàng u / 2 cột v / 2 hoặc hàng u / 2 cột ( v + 2) / 2; khác
  • _, nếu đầu vào có \tại hàng ( u + 2) / 2 cột v / 2 hoặc hàng ( u + 1) / 2 cột ( v - 1) / 2; khác
  • không gian.

(Chúng tôi không tính các ký tự ở các chỉ số nửa nguyên.)


Tôi nghĩ bạn có thể đảm bảo vị trí nào có \ s, đó chỉ là vị trí _mà bạn phải kiểm tra ở cả hai vị trí.
Neil

@Neil Vâng, bạn biết vị trí \ của s, nhưng bạn có thể phải vẽ hai _s cho mỗi cái \ .
Anders Kaseorg 16/07/2016

Oh, bạn kiểm tra từng dấu gạch dưới riêng biệt?
Neil

3

JavaScript (ES6), 452 356 315 byte

Trường hợp \nđại diện cho nhân vật dòng chữ mới. Chỉnh sửa: Đã lưu 96 byte bằng cách nhận ra rằng thuật toán của tôi không cần biết số lượng và kích thước của kim cương một cách riêng biệt, cộng với một vài sân golf nhỏ mà tôi đã bỏ lỡ lần đầu tiên. Đã lưu 41 byte bằng cách sắp xếp lại mã để đích luôn luôn là một cặp ký tự, cộng với một gôn nhỏ mà tôi đã bỏ lỡ khi chuyển đổi sang thuật toán trước đó.

Giải thích: Xem xét từng cặp ký tự đầu ra, có thể được __, /_, _\, /hay \, kiểm tra đối với các nhân vật thích hợp trong các đầu vào mà bản đồ cho những nhân vật đầu ra. Ung dung:

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');
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.