Tam giác lục giác!


20

Nhiệm vụ của bạn: tạo một tam giác lục giác có độ dài cạnh n, trong đó nlà một số nguyên dương hoặc 0.

Đầu tiên, hãy để tôi xác định một hình lục giác:

 / \
|   |
 \ /

(Nghệ thuật ASCII tuyệt vời, phải không?)

Các hình lục giác có thể được liên kết với nhau bằng cách chia sẻ các mặt:

 / \ / \
|   |   |
 \ / \ /

   / \  
  |   |
 / \ /
|   |
 \ /

Một hình tam giác lục giác như sau:

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

Hình tam giác lục giác đó có độ dài 2-- 2 hình lục giác được yêu cầu để tạo một cạnh. Một hình tam giác lục giác có độ dài cạnh 1 chỉ là một hình lục giác đơn và một hình lục giác có độ dài cạnh 0 là trống rỗng.

Chính thức hơn, một hình tam giác là một hình tam giác được làm bằng các hình lục giác được liên kết bởi các cạnh của chúng. Các hình lục giác trên cùng liên kết với hai bên dưới nó ở hai bên dưới cùng của nó. Tam giác ở phía dưới bên trái liên kết với một bên phải và trên cùng bên phải của nó, và một trong các liên kết ở dưới bên phải liên kết với những người ở bên trái và phía trên bên trái của nó. Có các hình lục giác ở giữa các góc, được kết nối bởi các mặt đối diện của chúng, và số của chúng là n-2. Các hình tam giác không được lấp đầy.

Ví dụ khác:

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
Nếu không có câu trả lời Hexagony cho điều này, tôi sẽ mất hết niềm tin vào @MartinEnder.
caird coinheringaahing

@Soyoucanreplytomeincomments Hãy nói rằng nếu tôi có thể đưa người dùng vào đây, họ sẽ có tên trong danh sách.
phyrfox


2
Tôi hy vọng sẽ thấy một câu trả lời ngắn trong Than. Tôi tự làm điều đó, nhưng trước tiên tôi phải học nó và tôi muốn xem một bộ phim, xin lỗi.
Neil

3
@Neil bạn được tha thứ vì không học một ngôn ngữ lập trình hoàn toàn mới. Nhưng đó là cảnh báo đầu tiên của bạn!
caird coinheringaahing

Câu trả lời:


11

Than , 62 43 39 byte

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

Hãy thử trực tuyến! Chỉnh sửa: Đã lưu một số byte nhờ chỉ @ ASCII (không chắc chính xác có bao nhiêu vì tôi cũng đã lưu thêm 6 10 byte nhưng sau đó cần phải chi 4 byte cho một lỗi). Bây giờ sử dụng các vòng lặp lồng nhau, đó là những gì cần phải có tất cả cùng.


45 byte: A / \¶| |¶ \ /αNβFβ«α←←»Fβ«α↖↖M⁶←»Fβ«αM⁴↑←←(btw than tự động hoàn thành bất kỳ cần thiết nào »ở cuối)
ASCII - chỉ

@ Chỉ có ASCII Thật đáng buồn là tôi dường như không thể tìm thấy tài liệu Char than nữa, vì vậy tôi không biết mã của bạn làm gì.
Neil

về cơ bản , các lệnh trên wiki ở đây , về cơ bản 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);}, mỗi vòng lặp rút ra một mặt
ASCII - chỉ

Rất nhiều những gì bạn đã làm nhưng với chuỗi được lưu dưới dạng một biến
ASCII - chỉ

Chỉ có ASCII Bằng cách đảo ngược hướng vẽ, tôi có thể lưu thêm 2 byte. (Ngoài ra tôi đang hơi thất vọng vì cách tốt nhất để vẽ hình lục giác là một chuỗi chữ, nhưng ít nhất điều này làm cho nó dễ dàng để lặp lại.)
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

Hãy thử trực tuyến!

-7 byte nhờ Ørjan Johansen


Bạn đang thiếu |s bên phải trên ba hàng đầu và hàng lục giác phía dưới.
Ørjan Johansen

p[:4]*(i+2)thay vì p[:4]*(i+1)dường như để sửa nó.
Ørjan Johansen

Bạn chỉ đang sử dụng btại một điểm, do đó, kết hợp điều đó với ~thủ thuật của bạn , w=' '*2*~(i-n)ngắn hơn 7 byte.
Ørjan Johansen

@ RjanJohansen Cảm ơn, mã đã trải qua rất nhiều lần tái cấu trúc và tôi đã quên thay đổi những điều đó
toán rác

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>


4

JavaScript (ES6), 133 129 128 126 byte

Xây dựng các nhân vật đầu ra bằng cách nhân vật với hai cho vòng lặp.

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}

Làm thế nào nó hoạt động

Trong vòng lặp bên ngoài, y lặp từ n * 2-1 đến -1 . Trong vòng lặp bên trong, x lặp từ n * 4-1 đến -1 . Chúng tôi đặt k = (x + y) & 3 , đây là mẫu cơ bản được sử dụng để tạo ra các hình lục giác.

Dưới đây là lưới kết quả cho 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

Trên các hàng chẵn, một ô chứa đầy ký tự ống khi k = 3 và khoảng trắng khác. Đường ống là ký tự thứ 5 trong chuỗi tham chiếu của chúng tôi " \ /|", vì vậy chỉ số chính xác được đưa ra bởi (k + 1) & 4 .

Trên các hàng lẻ, mỗi ô được điền trực tiếp với ký tự tương ứng trong chuỗi tham chiếu:

  • k = 0 → không gian
  • k = 1 → "\"
  • k = 2 → không gian
  • k = 3 → "/"

Dưới đây là ví dụ cập nhật của chúng tôi (không gian được thay thế bằng dấu chấm):

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

Trong các công thức sau, chúng tôi xác định N = n * 4 cho khả năng đọc (mặc dù cùng một biến được sử dụng trong mã).

Hình dạng tam giác thu được bằng cách thử nghiệm:

  • x> y - 2 → xóa góc phải
  • x <N - y → xóa góc bên trái

Và phần bên trong được loại bỏ bằng cách thử nghiệm:

  • x> N - y - 6 → chỉ giữ cạnh trái
  • HOẶC x <y + 4 → chỉ giữ cạnh phải
  • HOẶC y <2 → chỉ giữ cạnh dưới

Bản giới thiệu


[x>y-2&x<n-y&(x>n-y-6|x<y+4|y<2)&&y&1?x+y&3:x-~y&4]hoạt động không?
Neil

@Neil Hmm, tôi không nghĩ vậy. Chúng ta cần dấu ngoặc đơn xung quanh biểu thức ternary và (x+y+1)&4không giống như (((x+y)&3)+1)&4.
Arnauld

Không, tất nhiên là không rồi. Tôi đã nghĩ gì ...
Neil

3

Thạch ,  62  61 byte

Hiện tại có sáu sáu.

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

Hãy thử trực tuyến!

Làm sao?

_‘<×⁸>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

Có một thiếu sót >trong lời giải thích ( <space)
Roman Gräf

@ RomanGräf cảm ơn tôi đã chỉnh sửa lời giải thích! Nếu bạn chỉ có ý nghĩa nhiều hơn " khoảng trống trong phần giải thích bị sai lệch", hãy cho tôi biết.
Jonathan Allan


1

Toán học, 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"&

với \n thay thế bằng một dòng mới.

Dễ đọc hơn:

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

Tạo một mảng các ký tự, được lập chỉ mục bởi i từ 1 đến 4 n + 1 theo chiều ngang và j từ 1 đến 2 n + 1 theo chiều dọc. Đầu tiên, Switch[Mod[i+d+{j,-j},4],{1,3},"/",{3,1},"\\",{1,1},"|",_," "]điền vào lưới lục giác:

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

sau đó If[i+j<d||i-j>d+1||i+j>d+5&&i-j<d-3&&j<d-1," ",...]thay thế nó bằng " "bên ngoài tam giác không hàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.