Segitiga Heksagonal!

20

Tugas Anda: membuat segitiga heksagonal dengan panjang sisi n, di mana nbilangan bulat positif atau 0.

Pertama, izinkan saya mendefinisikan segi enam:

 / \
|   |
 \ /

(Seni ASCII yang luar biasa, kan?)

Segi enam dapat dihubungkan bersama dengan berbagi sisi:

 / \ / \
|   |   |
 \ / \ /

   / \  
  |   |
 / \ /
|   |
 \ /

Segitiga heksagonal adalah sebagai berikut:

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

Segitiga heksagonal memiliki panjang sisi 2 - 2 segi enam diperlukan untuk membuat satu sisi. Segitiga heksagonal dengan panjang sisi 1 hanya berupa segi enam tunggal, dan segi enam dengan panjang sisi 0 kosong.

Lebih formal, segitiga heksagonal adalah segitiga yang terbuat dari segi enam yang dihubungkan oleh sisinya. Hexagon atas menghubungkan ke dua di bawahnya di dua sisi bawahnya. Segitiga di kiri bawah tautan ke yang di kanan dan atas-kanan, dan yang di kanan bawah tautan ke yang di kiri dan atas. Ada segi enam di antara yang sudut, terhubung oleh sisi yang berlawanan, dan jumlahnya n-2. Segitiga tidak terisi.

Lebih banyak contoh:

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:
           / \
          |   |
         / \ / \
        |   |   |
       / \ / \ / \
      |   |   |   |
     / \ /     \ / \
    |   |       |   |
   / \ /         \ / \
  |   |           |   |
 / \ / \ / \ / \ / \ / \
|   |   |   |   |   |   |
 \ / \ / \ / \ / \ / \ /
Kamerad SparklePony
sumber
22
Jika tidak ada jawaban Hexagony untuk ini, saya akan kehilangan kepercayaan pada @MartinEnder.
caird coinheringaahing
@ Sooyoucanreplytomeincomments Katakan saja jika saya bisa mengikuti pengguna di sini, mereka akan ada dalam daftar.
phyrfox
1
@ phyrfox Anda bisa, semacam.
Dennis
2
Saya berharap melihat jawaban singkat di Charcoal. Saya akan melakukannya sendiri, tetapi saya harus mempelajarinya terlebih dahulu, dan saya ingin menonton film, maaf.
Neil
3
@Neil Anda dimaafkan karena tidak mempelajari bahasa pemrograman yang sama sekali baru. Tapi itu peringatan pertamamu!
caird coinheringaahing

Jawaban:

11

Arang , 62 43 39 byte

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

Cobalah online! Sunting: Menyimpan beberapa byte berkat hanya @ ASCII (tidak yakin persis berapa banyak saya juga menyimpan 6 10 byte lain tetapi kemudian harus menghabiskan 4 byte pada perbaikan bug). Sekarang menggunakan loop bersarang, itulah yang seharusnya terjadi.

Neil
sumber
45 bytes: A / \¶| |¶ \ /αNβFβ«α←←»Fβ«α↖↖M⁶←»Fβ«αM⁴↑←←(arang btw otomatis melengkapi semua yang dibutuhkan »di akhir)
ASCII-hanya
@ ASCII-only Sedih Sepertinya saya tidak dapat menemukan dokumentasi Charcoal lagi, jadi saya tidak tahu apa yang kode Anda lakukan.
Neil
perintah ada di wiki di sini , pada dasarnya 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);}, masing-masing untuk loop menarik satu sisi
ASCII-hanya
Jadi cukup banyak apa yang Anda lakukan tetapi dengan string disimpan sebagai variabel
ASCII-hanya
@ ASCII-only Dengan membalik arah gambar saya dapat menyimpan 2 byte lebih lanjut. (Juga saya sedikit kecewa bahwa cara terbaik menggambar segi enam adalah string literal, tetapi setidaknya ini membuatnya mudah untuk diulang.)
Neil
7

Python 2, 184 177 174 164 byte

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

Cobalah secara Online!

-7 byte berkat Ørjan Johansen

pecandu matematika
sumber
Anda kehilangan |s paling kanan di tiga teratas dan baris segi enam bawah.
Ørjan Johansen
p[:4]*(i+2)bukannya p[:4]*(i+1)tampaknya memperbaikinya.
Ørjan Johansen
Anda hanya menggunakan bdi satu tempat, jadi gabungkan dengan ~trik Anda , w=' '*2*~(i-n)7 byte lebih pendek.
Ørjan Johansen
@ ØrjanJohansen Terima kasih, kode mengalami banyak refactoring dan saya lupa mengubah hal-hal itu
pecandu matematika
6

JavaScript (ES6), 243 byte

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>

Neil
sumber
4

JavaScript (ES6), 133 129 128 126 byte

Membangun karakter keluaran dengan karakter dengan dua untuk loop.

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}

Bagaimana itu bekerja

Dalam loop luar, y iterates dari n * 2-1 untuk -1 . Di loop dalam, x iterasi dari n * 4-1 ke -1 . Kami menetapkan k = (x + y) & 3 , yang merupakan pola dasar yang digunakan untuk menghasilkan hexagon.

Di bawah ini adalah kisi yang dihasilkan untuk n = 4 :

     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

Pada baris genap, sel diisi dengan karakter pipa ketika k = 3 , dan spasi sebaliknya. Pipa adalah karakter ke-5 dalam string referensi kami " \ /|", jadi indeks yang benar diberikan oleh (k + 1) & 4 .

Pada baris ganjil, setiap sel diisi secara langsung dengan karakter yang sesuai dalam string referensi:

  • k = 0 → spasi
  • k = 1 → "\"
  • k = 2 → spasi
  • k = 3 → "/"

Di bawah ini adalah contoh kami yang diperbarui (spasi diganti dengan titik-titik):

     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 |  .  \  .  /  .  \  .  /  .  \  .  /  .  \  .  /  .

Dalam rumus berikut, kami mendefinisikan N = n * 4 untuk keterbacaan (meskipun variabel yang sama digunakan dalam kode).

Bentuk segitiga diperoleh dengan menguji:

  • x> y - 2 → menghapus sudut kanan
  • DAN x <N - y → menghapus sudut kiri

Dan bagian dalam dihapus dengan pengujian:

  • x> N - y - 6 → hanya menyimpan tepi kiri
  • ATAU x <y + 4 → hanya menyimpan sisi kanan
  • ATAU y <2 → hanya menyimpan tepi bawah

Demo

Arnauld
sumber
Apakah [x>y-2&x<n-y&(x>n-y-6|x<y+4|y<2)&&y&1?x+y&3:x-~y&4]bekerja?
Neil
@Neil Hmm, kurasa tidak. Kami membutuhkan tanda kurung di sekitar ekspresi ternary dan (x+y+1)&4tidak sama dengan (((x+y)&3)+1)&4.
Arnauld
Tidak, tentu saja tidak. Apa yang saya pikirkan ...
Neil
3

Jelly ,  62  61 byte

Saat ini mengandung enam enam.

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

Cobalah online!

Bagaimana?

_‘<×⁸>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
Jonathan Allan
sumber
Ada yang Hilang >dalam penjelasan ( <space)
Roman Gräf
@ RomanGräf terima kasih sudah mengedit penjelasannya! Jika Anda hanya bermaksud lebih dari " ruang di bawah dalam penjelasan tidak selaras", beri tahu saya.
Jonathan Allan
1

Pyth , 82 byte

jb+Rt_.rd"/\\"_.e<s[dd*dkb*dyQ)hyQ*,"|   |""/ \\ /"tQ*Q" / \\"+*Q"|   "\|*Q" \\ /"

Cobalah online!

Biarawati Bocor
sumber
1

Mathematica, 155 byte

""<>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"&

dengan \ndiganti dengan baris baru.

Lebih mudah dibaca:

"" <> 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" &

Membuat array karakter, diindeks oleh i dari 1 hingga 4 n + 1 secara horizontal dan j dari 1 hingga 2 n + 1 secara vertikal. Pertama, Switch[Mod[i+d+{j,-j},4],{1,3},"/",{3,1},"\\",{1,1},"|",_," "]mengisi kotak heksagonal:

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

kemudian If[i+j<d||i-j>d+1||i+j>d+5&&i-j<d-3&&j<d-1," ",...]ganti ini dengan di " "luar segitiga yang tidak terisi.

Bukan pohon
sumber