Obróć płytki diamentowe

21

Każdy regularny sześciokąt może być wyłożony diamentami, na przykład w podobny sposób (skradziony z tego pytania ):

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

Rozważymy powyższe kafelki o rozmiarze 1 (ponieważ boki diamentów są wykonane z jednego / \ każdego). Ta sama płytka wielkości 2 wyglądałaby następująco:

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

Twoim zadaniem jest obrócenie diamentowych nachyleń o wielokrotność 60 stopni. Diamentowe kafelki na wejściu mogą mieć dowolny rozmiar (a rozmiar nie jest wyraźnie określony na wejściu). Ale zawsze będzie to prawidłowe kafelkowanie, a wszystkie boki sześciokąta będą miały tę samą długość.

Są to powyższe przykłady obrócone o 60 stopni w prawo:

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

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

Dane wejściowe to nieujemna liczba całkowita i kafelek diamentowy. Twój program (lub funkcja) powinien obrócić go o liczbę całkowitą * 60 stopni. Ty decydujesz, czy obracać w prawo, czy w lewo, o ile jest to spójne. Zarówno wejście, jak i wyjście nie powinny mieć dodatkowych spacji wiodących ani końcowych.

To jest golf golfowy. Najkrótszy kod wygrywa.

Powiązane pytania:

jimmy23013
źródło
12
Martin będzie taki zazdrosny!
Optymalizator,

Odpowiedzi:

3

Pyth, 81 bajtów

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

Wypróbuj online

Obraca się w lewo.

Każdy obrót o 60 ° odbywa się przy użyciu następującego algorytmu. Załóżmy, że wejście jest sześciokątem rzędu k , więc ma 2 has k + 1 wierszy i 4⋅ k kolumn. Aby znaleźć obrócony znak w wierszu i kolumnie j , pozwól

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

Zatem znakiem wyjściowym jest

  • \, jeśli dane wejściowe mają /wiersz ( u + 1) / 2 kolumna ( v + 1) / 2; jeszcze
  • /, jeśli dane wejściowe mają _w wierszu u / 2 kolumna v / 2 lub wierszu u / 2 kolumna ( v + 2) / 2; jeszcze
  • _, jeśli dane wejściowe mają \wiersz ( u + 2) / 2 kolumna v / 2 lub wiersz ( u + 1) / 2 kolumna ( v - 1) / 2; jeszcze
  • przestrzeń.

(Nie liczymy znaków przy indeksach o całkowitej liczbie całkowitej).

Anders Kaseorg
źródło
Myślę, że możesz zagwarantować, które pozycje mają \ , to tylko te _, które musisz sprawdzić w obu miejscach.
Neil
@ Nee Tak, wiesz gdzie \ są, ale być może będziesz musiał narysować dwa _dla każdego \ .
Anders Kaseorg
Och, sprawdzasz każdy podkreślenie osobno?
Neil
3

JavaScript (ES6), 452 356 315 bajtów

Gdzie \nreprezentuje dosłowny znak nowej linii. Edycja: Zaoszczędziłem 96 bajtów, zdając sobie sprawę, że mój algorytm nie musi znać liczby i wielkości diamentów osobno, a także kilka drobnych golfów, które przegapiłem za pierwszym razem. Zaoszczędziłem 41 bajtów, zmieniając kod tak, aby miejscem docelowym była zawsze ta sama para znaków, a także drobny golf, którego mi brakowało podczas konwersji na poprzedni algorytm.

Objaśnienie: uważa każdą parę znaków wyjściowych, co może być __, /_, _\, /lub \, sprawdzanie odpowiednich znaków wejścia, które są mapowane do tych znaków wyjściowych. Nie golfowany:

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
źródło