Elmas döşemeyi döndürün


21

Herhangi bir normal altıgen elmas gibi döşenebilir, örneğin ( bu sorudan çalınmış ):

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

Yukarıda 1 büyüklüğünde bir karo ele alacağız (elmasların her biri bir / veya \ 'den yapıldığı için). Aynı büyüklükteki 2 aynı döşeme şöyle görünür:

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

Senin görevin elmas döşeme 60 derecenin katları kadar döndürmektir. Girişteki elmas döşeme herhangi bir boyutta olabilir (ve girişte açıkça belirtilmez). Ancak, her zaman geçerli bir döşeme olur ve altıgenin tüm kenarları aynı uzunlukta olur.

Bunlar saat yönünde 60 derece döndürülmüş yukarıdaki örneklerdir:

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

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

Giriş negatif olmayan bir tamsayı ve bir elmas döşemedir. Programınız (veya işleviniz) tamsayı * 60 derece döndürmelidir. Tutarlı olduğu sürece saat yönünde ya da saat yönünün tersine dönmeye karar verirsiniz. Hem girdi hem de çıktı, fazladan öndeki ya da sondaki boşluklara sahip olmamalıdır.

Bu kod golfü. En kısa kod kazanır.

İlgili sorular:


12
Martin çok kıskanacak!
Doktor

Yanıtlar:


3

Pyth, 81 bayt

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

Çevrimiçi deneyin

Saat yönünün tersine döner.

Her 60 ° dönüş aşağıdaki algoritma kullanılarak gerçekleştirilir. Giriş sırası bir altıgen varsayalım k o 2⋅ sahiptir, bu yüzden k + 1 satır ve 4⋅ k sütunları. Satır hızla dönmekte karakteri bulmak için i sütun j , let

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

Sonra çıkış karakteri

  • \, giriş /satırında ( u + 1) / 2 sütununda ( v + 1) / 2; Başka
  • /, eğer giriş _satırında u / 2 sütun v / 2 veya satırda u / 2 sütun ( v + 2) / 2; Başka
  • _, giriş \satırında ( u + 2) / 2 sütun v / 2 veya satır ( u + 1) / 2 sütun ( v - 1) / 2; Başka
  • alanı.

(Yarı-tamsayı indekslerindeki karakterleri saymayız.)


Hangi pozisyonların \ s olduğunu garanti edebileceğinizi düşünüyorum , sadece _her iki yerde de kontrol etmeniz gereken s.
Neil,

@Neil Evet, s'nin nerede olduğunu biliyorsunuz \ , ancak _her biri için iki s çizmeniz gerekebilir \ .
Anders Kaseorg

Her alt çizgiyi ayrı ayrı kontrol ettiniz mi?
Neil

3

JavaScript (ES6), 452 356 315 bayt

Nerede \nliteral satır karakteri temsil eder. Düzenleme: Algoritmamın elmasların sayısını ve büyüklüğünü ayrı ayrı bilmesi gerekmediğinin farkına varmak suretiyle 96 bayt kurtardı, ayrıca ilk defa kaçırdığım birkaç küçük golf. Kodu yeniden düzenleyerek 41 baytta kaydedilmiş, böylece hedef her zaman aynı karakter çifti olsaydı, artı önceki algoritma dönüştürürken kaçırdığım küçük bir golf oynadı.

Açıklama: olabilir çıktı karakterlerin her çifti, Düşünüyor __, /_, _\, /veya \, bu çıkış karakter haritasına girdi düzgün yazı karakterleri kontrol. 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');
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.