Altıgen Üçgenler!


20

Göreviniz: kenar uzunluğu bir altıgen üçgen yapmak n, npozitif bir tam sayı veya 0'dır.

İlk olarak, bir altıgen tanımlayayım:

 / \
|   |
 \ /

(İnanılmaz ASCII sanatı, değil mi?)

Altıgenler tarafları paylaşarak birbirine bağlanabilir:

 / \ / \
|   |   |
 \ / \ /

   / \  
  |   |
 / \ /
|   |
 \ /

Altıgen bir üçgen aşağıdaki gibidir:

   / \
  |   |
 / \ / \
|   |   |
 \ / \ /

Bu altıgen üçgenin kenar uzunluğu 2–2 altıgen olan bir tarafı yapmak için gereklidir. Kenar uzunluğu 1 olan altıgen bir üçgen sadece tek bir altıgendir ve kenar uzunluğu 0 olan bir altıgen boştur.

Daha resmi olarak, altıgen bir üçgen, yanlarıyla birbirine bağlı altıgenlerden oluşan bir üçgendir. Üst altıgen alt iki tarafında altındaki ikisine bağlanır. Sol alttaki üçgen sağa ve sağ üste, sol alttaki üçgen sol ve üst soldakilere bağlanır. Köşe olanlar arasında , karşı taraflarıyla birbirine bağlanan altıgenler var ve sayıları n-2. Üçgenler dolu değil .

Daha fazla örnek:

Side length 3:
     / \
    |   |
   / \ / \
  |   |   |
 / \ / \ / \
|   |   |   |
 \ / \ / \ /

Side length 4:
       / \
      |   |
     / \ / \
    |   |   |
   / \ / \ / \
  |   |   |   |
 / \ / \ / \ / \
|   |   |   |   |
 \ / \ / \ / \ /
(This triangle isn't really filled, the borders make it look like there is a hexagon in the middle, but there is not.)

Side length 5:
         / \
        |   |
       / \ / \
      |   |   |
     / \ / \ / \
    |   |   |   |
   / \ /     \ / \
  |   |       |   |
 / \ / \ / \ / \ / \
|   |   |   |   |   |
 \ / \ / \ / \ / \ /

Side length 6:
           / \
          |   |
         / \ / \
        |   |   |
       / \ / \ / \
      |   |   |   |
     / \ /     \ / \
    |   |       |   |
   / \ /         \ / \
  |   |           |   |
 / \ / \ / \ / \ / \ / \
|   |   |   |   |   |   |
 \ / \ / \ / \ / \ / \ /

22
Bunun için bir Hexagony cevabı yoksa, @MartinEnder'e olan tüm inancımı kaybedeceğim.
caird coinheringaahing

@Soyoucanreplytomeincomments Diyelim ki, kullanıcıları buraya aktarabilirsem, listede olacaklar.
phyrfox


2
Kömürde kısa bir cevap görmeyi umuyorum. Bunu kendim yaparım, ama önce öğrenmem gerekirdi, bunun yerine bir film izlemek istiyorum, üzgünüm.
Neil

3
@ Tamamen yeni bir programlama dili öğrenmediğiniz için affedilirsiniz. Ama bu ilk uyarınız!
caird coinheringaahing

Yanıtlar:


11

Kömür , 62 43 39 bayt

NβF³«F⁻β‹ι²« / \¶|   |¶ \ /Mײι↑¿⁻¹ιM⁶←

Çevrimiçi deneyin! Düzenleme: Sadece @ ASCII sayesinde bazı baytlar kaydedildi (tam olarak ne kadar başka bir 6 10 bayt kaydettiğimden emin değilim ama daha sonra bir hata düzeltmesi için 4 bayt harcamak gerekiyordu). Şimdi iç içe döngüler kullanıyoruz, bu da başından beri böyle olmalıydı.


45 bayt: A / \¶| |¶ \ /αNβFβ«α←←»Fβ«α↖↖M⁶←»Fβ«αM⁴↑←←(btw kömür »sonunda gerekli olanları otomatik olarak tamamlar )
ASCII-sadece

@ Sadece ASCII Ne yazık ki artık Kömür belgelerini bulamıyorum, bu yüzden kodunuzun ne yaptığı hakkında hiçbir fikrim yok.
Neil

burada wiki komutları , temelde Assign(hexagon_with_space_to_left, a);InputNumber(b);for(b){Print(a);Move(:Left);Move(:Left);}for(b){Print(a);Move(:UpLeft);Move(:UpLeft);Move(6, :Left);}for(b){Print(a);Move(4, :Up);Move(:Left);Move(:Left);}, döngü için her biri bir tarafı çizer
sadece ASCII-sadece

Neredeyse ne yapıyordunuz ama değişken olarak kaydedilen dize ile
sadece ASCII-sadece

@ Sadece ASCII-Çizim yönünü ters çevirerek 2 bayt daha kaydedebildim. (Ayrıca, altıgeni çizmenin en iyi yolunun bir dize değişmezi olduğunu hayal kırıklığına uğrattım, ancak en azından bu tekrarlamayı kolaylaştırıyor.)
Neil

7

Python 2, 184 177 174 164 bayt

n=input();p='|   |';e=' \\ /'
for i in range(n):k=' '*(4*i-5);w='  '*~(i-n);print w+[' / \\'*-~i+'\n'+w+p[:4]*i+p,' /'+e+k[3:]+e+' \\\n'+w+p+k+p][2<i<n-1]
print e*n

Çevrimiçi deneyin!

Ørjan Johansen sayesinde -7 bayt


|İlk üçte ve alt altıgen sırada en sağdaki s eksik .
Ørjan Johansen

p[:4]*(i+2)yerine p[:4]*(i+1)düzeltmek gibi görünüyor.
Ørjan Johansen

Sadece bbir noktada kullanıyorsunuz , bu yüzden ~hile ile birleştirmek w=' '*2*~(i-n)7 bayt daha kısa.
Ørjan Johansen

@ ØrjanJohansen Teşekkürler, kod yeniden düzenleme çok geçti ve ben bu şeyleri değiştirmeyi unuttum
matematik bağımlısı

6

JavaScript (ES6), 243 bayt

f=n=>(n=n*2-2,a=[...Array(n+3)].map(_=>Array(n*2+5).fill` `),g=(y,x)=>(a[y+1][x]=a[y+1][x+4]=`|`,a[y][x+1]=a[y+2][x+3]=`/`,a[y][x+3]=a[y+2][x+1]=`\\`),[...Array(n+!n)].map((_,i)=>i%2||(g(n,i*2),g(i,i=n-i),g(i,n+i))),a.map(a=>a.join``).join`
`)
<input type=number oninput=o.textContent=f(this.value)><pre id=o>


4

JavaScript (ES6), 133 129 128 126 bayt

Döngüler için iki karakterle çıktı karakterini karakter oluşturur .

n=>{for(s='',y=n*2,n*=4;~y--;s+=`
`)for(x=n;~x--;)s+=' \\ /|'[x>y-2&x<n-y&(k=x+y&3,x>n-y-6|x<y+4|y<2)?y&1?k:k+1&4:0];return s}

Nasıl çalışır

Dış döngüde, y n * 2-1 ila -1 arasında yinelenir . İç döngüde, x n * 4-1 ila -1 arasında yinelenir . K = (x + y) ve 3 ayarladıkAltıgenleri oluşturmak için kullanılan temel desen olan .

Aşağıda, n = 4 için ortaya çıkan ızgara gösterilmektedir :

     15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 -1
   +---------------------------------------------------
 7 |  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2
 6 |  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1
 5 |  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0
 4 |  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3
 3 |  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2
 2 |  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1
 1 |  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0
 0 |  3  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3
-1 |  2  1  0  3  2  1  0  3  2  1  0  3  2  1  0  3  2

Çift satırlarda, hücre k = 3 olduğunda bir boru karakteriyle , aksi takdirde boşlukla doldurulur . Boru, referans dizemizde 5. karakterdir " \ /|", bu nedenle doğru dizin (k + 1) ve 4 ile verilir. .

Tek satırlarda, her hücre doğrudan referans dizesindeki karşılık gelen karakterle doldurulur:

  • k = 0 → boşluk
  • k = 1 → "\"
  • k = 2 → boşluk
  • k = 3 → "/"

Aşağıda güncellenmiş örneğimiz bulunmaktadır (noktalarla değiştirilen boşluklar):

     15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 -1
   +---------------------------------------------------
 7 |  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .
 6 |  .  .  |  .  .  .  |  .  .  .  |  .  .  .  |  .  .
 5 |  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .
 4 |  |  .  .  .  |  .  .  .  |  .  .  .  |  .  .  .  |
 3 |  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .
 2 |  .  .  |  .  .  .  |  .  .  .  |  .  .  .  |  .  .
 1 |  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .
 0 |  |  .  .  .  |  .  .  .  |  .  .  .  |  .  .  .  |
-1 |  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .

Aşağıdaki formüllerde, okunabilirlik için N = n * 4 tanımlıyoruz (kodda aynı değişken kullanılmasına rağmen).

Üçgen şekli test edilerek elde edilir:

  • x> y - 2 → sağ köşeyi kaldırır
  • AND x <N - y → sol köşeyi kaldırır

Ve iç kısım test edilerek çıkarılır:

  • x> N - y - 6 → yalnızca sol kenarı tutar
  • VEYA x <y + 4 → yalnızca sağ kenarı tutar
  • VEYA y <2 → yalnızca alt kenarı tutar

gösteri


Mu [x>y-2&x<n-y&(x>n-y-6|x<y+4|y<2)&&y&1?x+y&3:x-~y&4]iş?
Neil

@Neil Hmm, sanmıyorum. Üçlü ifade etrafında parantezlere ihtiyacımız var ve (x+y+1)&4onunla aynı değil (((x+y)&3)+1)&4.
Arnauld

Hayır, elbette değil. Ne düşünüyordum ...
Neil

3

Jöle ,  62  61 bayt

Şu anda altı altı içeren.

_‘<×⁸>6
Rµ‘⁾| ẋ⁾/\ẋ⁸¤ż;/K€µ⁶ðMṀ_6r6ẋð¦"Jç¥
ḤḶUẋ@€⁶;"ǵ-ịṙ6ṭ⁸Y

Çevrimiçi deneyin!

Nasıl?

_‘<×⁸>6 - Link 1, should we eat the praline? row number, triangle size
_       - row number minus triangle size
 ‘      - plus one
  <     - less than triangle size? (1 if one of the last rows else 0)
   ×⁸   - multiply by row number   (row number or 0)
     >6 - greater than 6?          (row number if between row 6 and last two rows)

Rµ‘⁾| ẋ⁾/\ẋ⁸¤ż;/K€µ⁶ðMṀ_6r6ẋð¦"Jç¥ - Link 2, build a solid triangle: triangle size
                                              (except the very bottom row)
R                                  - range: [1,2,...,size]
 µ                                 - monadic chain separation, call that r
  ‘                                - increment: [2,3,...,size+1]
   ⁾| <space                       - literal "| "
      ẋ                            - repeat: ["| | ","| | | ",...]
            ¤                      - nilad followed by link(s) as a nilad:
       ⁾/\                         -   literal "/\"
           ⁸                       -   link's left argument, r
          ẋ                        -   repeat (vectorises): ["/\","/\/\",...]
             ż                     - zip the two repeated lists together: [["/\","| | "],["/\/\","| | | "],...]
              ;/                   - reduce by concatenation: ["/\","| | ","/\/\","| | | ",...]
                K€                 - join with spaces for €ach: ["/ \","|   |  ","/ \ / \","|   |   |  ",...]
                  µ                - monadic chain separation call that s
                                 ¥ - last two links a a dyad:
                               J   -   range(length(s))  
                                ç  -   call the last (1) link as a dyad (left = result of J, right = size)
                              "    - zip with: (call those d)
                    ð       ð¦     -   apply to indexes:
                   ⁶               -   a literal space character
                     M             -     indexes of maximal elements in an element of s (a row)
                      Ṁ            -     maximum (this is the rightmost non-space index, MṀ working like length ignoring trailing spaces)
                       _6          -     subtract 6  (6 indexes back from the right)
                         r6        -     range from there to 6, i.e [l-6,l-7,...,6]
                           ẋ       -     repeat d times (1 or 0), thus applying to the middle rows but not the bottom and top ones.

ḤḶUẋ@€⁶;"ǵ-ịṙ6ṭ⁸Y - Main link: triangle size
Ḥ                  - double(size)
 Ḷ                 - unlength: [0,1,2,...,double(size)-1]
  U                - upend: [double(size)-1,...,2,1,0]
      ⁶            - literal space character
   ẋ@€             - repeat for €ach with reversed arguments ["  ...  ",...,"  "," ",""]
         Ç         - call the last link (2) as a monad(size)
       ;"          - zip with concatenation (zips the leading spaces with the solid triangle body)
          µ        - monadic chain separation, call that t
           -ị      - index -1 (last but one row of t)
             ṙ6    - rotate left by 6 (any number congruent to 2 mod 4 would do)
               ṭ⁸  - tack to t (add this new row on)
                 Y - join all the rows by new lines
                   - implicit print

>Açıklamada bir eksik var ( <space)
Roman Gräf

@ RomanGräf teşekkürler Açıklamayı düzenledim! " Açıklamadaki alanın altında yanlış hizalanmış" ifadesinden daha fazlasını kastediyorsanız , bana bildirin.
Jonathan Allan


1

Mathematica, 155 bayt

""<>Table[If[i+j<d||i-j>d+1||i+j>d+5&&i-j<d-3&&j<d-1," ",Switch[Mod[i+d+{j,-j},4],{1,3},"/",{3,1},"\\",{1,1},"|",_," "]],{j,(d=2#)+1},{i,4#+1}]~Riffle~"\n"&

ile \nbir satır ile değiştirildi.

Daha okunabilir:

"" <> Table[
    If[i+j < d || i-j > d+1 || 
      i+j > d+5 && i-j < d-3 && j < d-1, " ", 
     Switch[Mod[i+d+{j,-j}, 4], {1, 3}, "/", {3, 1}, 
      "\\", {1, 1}, "|", _, " "]], {j, (d=2#)+1}, {i, 4#+1}]~
   Riffle~"\n" &

Dizine eklenmiş bir karakter dizisi oluşturur İ ile 1'den 4'e n + 1 yatay olarak ve j'yi 1'den 2 n + 1'e dikey olarak . İlk olarak, Switch[Mod[i+d+{j,-j},4],{1,3},"/",{3,1},"\\",{1,1},"|",_," "]altıgen bir ızgarayı doldurur:

 \ / \ / \ / \ / 
  |   |   |   |  
 / \ / \ / \ / \ 
|   |   |   |   |
 \ / \ / \ / \ / 
  |   |   |   |  
 / \ / \ / \ / \ 
|   |   |   |   |
 \ / \ / \ / \ / 

daha sonra If[i+j<d||i-j>d+1||i+j>d+5&&i-j<d-3&&j<d-1," ",...]bunu " "doldurulmamış üçgenin dışında değiştirir .

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.