Bir ASCII altıgen ızgara çizin ve etiketleyin


12

Gelen önceki meydan , çoğunlukla elle (Vim görsel blok modu yardımıyla) ilk diyagram çekti. Ama elbette daha iyi bir yol olmalı ...


Genişlik ve yükseklik olmak üzere iki boyuttan oluşan bir girdi verildiğinde, ASCII teknolojisinde bu boyutlarla altıgen bir ızgara çıktı.

Aşağıda, giriş için çıktınız olması gereken girişte (küçük düzenlemelerle birlikte) gösterilen diyagram bulunmaktadır width=7, height=3:

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/

Birkaç şeye dikkat edin:

  • Genişlik ve yükseklik, belirli bir y ve x koordinatı için sırasıyla kaç altıgen bulunduğuna eşittir. Bunlar her zaman tek sayılar olacaktır.

  • Her altıgen ASCII sanatı ile temsil edilir

      _____
     /     \
    /       \
    \       /
     \_____/
    

    ancak sınırlar komşu altıgenler arasında "paylaşılır".

  • Koordinatlardaki virgül her zaman üst kenarın merkezinin tam olarak iki karakter altındadır. X-koordinatı daha sonra doğrudan virgülden önce ve y-koordinatı hemen sonra yerleştirilir.

    Koordinatların asla altıgen sınırlarını örtecek şekilde çok büyük olmayacağını varsayabilirsiniz.

Girdi boşluk / virgülle ayrılmış bir dize, bir tamsayı dizisi veya iki işlev / komut satırı argümanı olarak alınabilir. Çıktı tek bir dize olmalıdır (STDOUT'a, bir dönüş değeri olarak, vb.).

Bu , bayt cinsinden en kısa kod kazanacaktır.

Yukarıdaki ızgara bir test senaryosu olarak kullanılabilir. Maksimum boyutlu width=199, height=199ızgara, buraya dahil edilmesi açıkça pratik değildir, ancak ilk birkaç satır ve sütun aşağıdaki gibi görünmelidir:

         _____         ___
        /     \       /   
  _____/-98,-99\_____/-96,
 /     \       /     \    
/-99,-99\_____/-97,-99\___
\       /     \       /   
 \_____/-98,-98\_____/-96,
 /     \       /     \    
/-99,-98\_____/-97,-98\___
\       /     \       /   
 \_____/-98,-97\_____/-96,
 /     \       /     \    
/-99,-97\_____/-97,-97\___
\       /     \       /   

Yanıtlar:


2

Yakut, 221 bayt

->w,h{s=' '
a=(s*9+?_*5)*(w/2)+$/
(2-h*2).upto(h*2+3){|y|c=y<4-h*2 
a+=[b=c ?s:?\\,s+b,s,''][y%4]
(0-w/2).upto(w/2){|x|a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",s*7,?_*5,"/     \\"][(y+x*2+w)%4]%[x,y/4]}
a+='//  '[c ?3:y%4]+$/}
a}

Test programında yönlendirilmemiş

f=->w,h{
  s=' '                                #set s to space for golfing reasons
  a=(s*9+?_*5)*(w/2)+$/                #start building the output with a row of just _ and space

  (2-h*2).upto(h*2+3){|y|              #iterate 4 times for each row of hexagons, plus an extra 2 at the end to finish last row
    c=y<4-h*2                          #condition for first two rows
    a+=[b=c ?s:?\\,s+b,s,''][y%4]      #string to be output before main set of hexagons (spaces for top row, \ for certain other rows

    (0-w/2).upto(w/2){|x|              #iterate through hexagons on each row, 4 lines for each with the following printf type string
      a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",#line 1:contains ends / \ and numbers 
         s*7,                          #line 2 padding spaces
         ?_*5,                         #line 3 padding ___
         "/     \\"][(y+x*2+w)%4]%     #line 0 top of hexagon / \; formula to select string to be printed
           [x,y/4]                     #numbers to be printed (if format for current line does not require them they are ignored)
    }

    a+='//  '[c ?3:y%4]+$/             #ending alternates between / and space; / are suppressed for first two rows
  }
  a
}

puts g[7,3]
puts g[5,5]

Çıktı

Hata ayıklamayı bitirirken, teknik özelliklerde bir belirsizlik fark ettim. Burada w+14 ile bölünebilir, birinci ve son x koordinatları tek ve hiçbir belirsizlik vardır. Ancak w-14 ile bölünebilir nerede ilk ve son x koordinatları eşittir. İlk ve son sütunların bir sonraki sütunların altında dengelenmesi gerektiğini varsaydım. Ama sonra önceki soruyu okudum ve bu durumda çiftlerin altında dengelenmesi gereken tek sütunlar olduğunu belirttim ( w-14 ile bölünebilir not her ikisini de yapmak mümkün değildir.)

Ancak bu ayrım bu soruda yapılmamıştır. Gerekmemesini tercih etsem de, gerekirse OP'nin yargısına ve yeniden çalışmasına bırakacağım.

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/
         _____         _____
        /     \       /     \
  _____/ -1,-2 \_____/  1,-2 \_____
 /     \       /     \       /     \
/ -2,-2 \_____/  0,-2 \_____/  2,-2 \
\       /     \       /     \       /
 \_____/ -1,-1 \_____/  1,-1 \_____/
 /     \       /     \       /     \
/ -2,-1 \_____/  0,-1 \_____/  2,-1 \
\       /     \       /     \       /
 \_____/ -1,0  \_____/  1,0  \_____/
 /     \       /     \       /     \
/ -2,0  \_____/  0,0  \_____/  2,0  \
\       /     \       /     \       /
 \_____/ -1,1  \_____/  1,1  \_____/
 /     \       /     \       /     \
/ -2,1  \_____/  0,1  \_____/  2,1  \
\       /     \       /     \       /
 \_____/ -1,2  \_____/  1,2  \_____/
 /     \       /     \       /     \
/ -2,2  \_____/  0,2  \_____/  2,2  \
\       /     \       /     \       /
 \_____/       \_____/       \_____/
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.