หมุนปูกระเบื้องเพชร


21

รูปหกเหลี่ยมปกติใด ๆ สามารถปูด้วยเพชรได้เช่นกัน (ถูกขโมยจากคำถามนี้ ):

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

เราจะพิจารณาขนาดของกระเบื้องที่ 1 ข้างต้น (เนื่องจากด้านข้างของเพชรประกอบด้วยหนึ่ง / หรือ \ แต่ละอัน) ปูกระเบื้องขนาดเดียวกัน 2 จะมีลักษณะดังนี้:

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

งานของคุณคือหมุนเพชรเอียงหลาย ๆ 60 องศา การเรียงเพชรในอินพุตสามารถมีขนาดใดก็ได้ (และขนาดไม่ได้ระบุไว้อย่างชัดเจนในอินพุต) แต่มันจะเป็นการปูกระเบื้องที่ถูกต้องอยู่เสมอและทุกด้านของรูปหกเหลี่ยมจะมีความยาวเท่ากัน

นี่คือตัวอย่างด้านบนหมุนตามเข็มนาฬิกา 60 องศา:

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

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

อินพุตเป็นจำนวนเต็มไม่เป็นลบและปูกระเบื้องเพชร โปรแกรม (หรือฟังก์ชัน) ของคุณควรหมุนด้วยจำนวนเต็ม * 60 องศา คุณตัดสินใจว่าจะหมุนตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาตราบเท่าที่มันสอดคล้องกัน ทั้งอินพุตและเอาต์พุตไม่ควรมีช่องว่างนำหน้าหรือส่วนท้ายพิเศษ

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดชนะ

คำถามที่เกี่ยวข้อง:


คำตอบ:


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⋅ ฉัน + 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 เป็นเพียง_s ที่คุณต้องตรวจสอบทั้งสองแห่ง
Neil

@ Neil ใช่คุณรู้ว่ามันอยู่ที่ไหน\ แต่คุณอาจต้องวาดสองตัว_สำหรับแต่ละ\ อัน
Anders Kaseorg

โอ้คุณตรวจสอบขีดล่างแต่ละอันแยกกันหรือไม่
Neil

3

JavaScript (ES6), 452 356 315 ไบต์

ไหน\nหมายถึงอักขระ newline ที่แท้จริง แก้ไข: บันทึก 96 ไบต์ด้วยการตระหนักว่าอัลกอริทึมของฉันไม่จำเป็นต้องรู้จำนวนและขนาดของเพชรแยกจากกันรวมถึงกอล์ฟเล็ก ๆ น้อย ๆ ที่ฉันพลาดไปครั้งแรก บันทึกแล้ว 41 ไบต์โดยการจัดเรียงรหัสใหม่เพื่อให้ปลายทางเป็นตัวละครคู่เดียวกันเสมอบวกกับการเล่นกอล์ฟเล็กน้อยที่ฉันพลาดเมื่อแปลงเป็นอัลกอริธึมก่อนหน้าของฉัน

คำอธิบาย: พิจารณาแต่ละคู่ของตัวละครออกซึ่งอาจจะ__, /_, _\, /หรือ\การตรวจสอบสำหรับตัวละครที่เหมาะสมในการป้อนข้อมูลที่แผนที่กับตัวละครเหล่านั้นเอาท์พุท Ungolfed:

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.