Eine Diamantkachel drehen

21

Jedes reguläre Sechseck kann zum Beispiel wie folgt mit Diamanten gekachelt werden (gestohlen aus dieser Frage ):

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

Wir betrachten das Obige als Kacheln der Größe 1 (da die Seiten der Diamanten jeweils aus einem / oder \ bestehen). Die gleiche Kachelung von Größe 2 würde so aussehen:

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

Ihre Aufgabe ist es, Diamantkacheln um ein Vielfaches von 60 Grad zu drehen. Die Raute in der Eingabe kann eine beliebige Größe haben (und die Größe wird in der Eingabe nicht explizit angegeben). Aber es wäre immer eine gültige Kachelung, und alle Seiten des Sechsecks hätten die gleiche Länge.

Dies sind die obigen Beispiele, die um 60 Grad im Uhrzeigersinn gedreht wurden:

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

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

Die Eingabe ist eine nicht negative Ganzzahl und eine Raute. Ihr Programm (oder Ihre Funktion) sollte es um die ganze Zahl * 60 Grad drehen. Sie entscheiden, ob Sie im oder gegen den Uhrzeigersinn drehen möchten, sofern dies konsistent ist. Sowohl die Eingabe als auch die Ausgabe sollten keine zusätzlichen führenden oder nachfolgenden Leerzeichen enthalten.

Das ist Code-Golf. Kürzester Code gewinnt.

Verwandte Fragen:

jimmy23013
quelle
12
Martin wird so eifersüchtig sein!
Optimierer

Antworten:

3

Pyth, 81 Bytes

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

Probieren Sie es online aus

Dreht sich gegen den Uhrzeigersinn.

Jede 60 ° -Drehung wird unter Verwendung des folgenden Algorithmus ausgeführt. Angenommen, die Eingabe ist ein Sechseck der Ordnung k , also hat sie 2⋅ k + 1 Zeilen und 4⋅ k Spalten. Um das gedrehte Zeichen in Zeile i Spalte j zu finden , lassen Sie

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

Dann ist das Ausgabezeichen

  • \, wenn die Eingabe /in Zeile ( u + 1) / 2 Spalte ( v + 1) / 2 hat; sonst
  • /, wenn der Eingang _in Zeile u / 2 Spalte v / 2 oder Zeile u / 2 Spalte ( v + 2) / 2 hat; sonst
  • _, wenn der Eingang \Zeile ( u + 2) / 2 Spalte v / 2 oder Zeile ( u + 1) / 2 Spalte ( v - 1) / 2 hat; sonst
  • Platz.

(Wir zählen keine Zeichen bei Indizes mit halben ganzen Zahlen.)

Anders Kaseorg
quelle
Ich denke, Sie können garantieren, welche Positionen \ s haben, es sind nur die _s, die Sie an beiden Stellen überprüfen müssen.
Neil
@Neil Ja, Sie wissen, wo sich die \ s befinden, aber möglicherweise müssen Sie zwei _s für jede ziehen \ .
Anders Kaseorg
Oh, Sie überprüfen jeden Unterstrich separat?
Neil
3

JavaScript (ES6), 452 356 315 Byte

Wobei \ndas wörtliche Zeilenumbruchzeichen darstellt. Bearbeiten: 96 Bytes gespart, da mein Algorithmus die Anzahl und Größe der Diamanten nicht separat kennen muss, plus ein paar kleinere Golfer, die ich beim ersten Mal verpasst habe. Durch Umstellen des Codes wurden 41 Bytes gespart, sodass das Ziel immer dasselbe Zeichenpaar war, sowie ein geringfügiger Fehler, den ich bei der Umstellung auf meinen vorherigen Algorithmus verpasst habe.

Erläuterung: der Ansicht , jedes Paar von Ausgangs Zeichen, die sein könnte __, /_, _\, /oder \, für die entsprechenden Zeichen in der Eingabe überprüft , die mit diesen Ausgangs Zeichen abzubilden. 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');
}
Neil
quelle