Vẽ và dán nhãn lưới lục giác ASCII


12

Trong thử thách trước đây , tôi đã vẽ sơ đồ đầu tiên chủ yếu bằng tay (với sự trợ giúp của chế độ khối hình ảnh của vim). Nhưng chắc chắn phải có một cách tốt hơn ...


Đưa ra một đầu vào có hai chiều, chiều rộng và chiều cao, xuất ra lưới hình lục giác với các kích thước đó trong nghệ thuật ASCII.

Đây là sơ đồ được tham chiếu trong phần giới thiệu (với các chỉnh sửa nhỏ), đây sẽ là đầu ra của bạn cho đầu vào 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  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/

Lưu ý một số điều:

  • Chiều rộng và chiều cao về cơ bản tương đương với số lượng hình lục giác có cho tọa độ y và x đã cho tương ứng. Đây sẽ luôn là số lẻ.

  • Mỗi hình lục giác được thể hiện bằng nghệ thuật ASCII

      _____
     /     \
    /       \
    \       /
     \_____/
    

    nhưng đường viền được "chia sẻ" giữa các hình lục giác lân cận.

  • Dấu phẩy trong tọa độ luôn chính xác là hai ký tự bên dưới tâm của cạnh trên. Tọa độ x sau đó được định vị trực tiếp trước dấu phẩy và tọa độ y trực tiếp sau.

    Bạn có thể cho rằng tọa độ sẽ không bao giờ quá lớn để chúng trùng với đường viền của hình lục giác.

Đầu vào có thể được lấy dưới dạng một chuỗi được phân tách bằng khoảng trắng / dấu phẩy, một mảng các số nguyên hoặc hai đối số hàm / dòng lệnh. Đầu ra phải là một chuỗi đơn (đến STDOUT, dưới dạng giá trị trả về, v.v.).

Vì đây là , mã ngắn nhất tính bằng byte sẽ giành chiến thắng.

Lưới ở trên có thể được sử dụng như một trường hợp thử nghiệm. width=199, height=199Lưới có kích thước tối đa rõ ràng là không thực tế để bao gồm ở đây, nhưng một vài hàng và cột đầu tiên sẽ trông như sau:

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

Câu trả lời:


2

Ruby, 221 byte

->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}

Ungolfed trong chương trình thử nghiệm

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]

Đầu ra

Khi tôi đang hoàn thành việc sửa lỗi, tôi nhận thấy một sự mơ hồ trong thông số kỹ thuật. Trường hợp w+1chia hết cho 4, tọa độ x đầu tiên và cuối cùng là số lẻ và không có sự mơ hồ. Nhưng nơi w-1chia hết cho 4 tọa độ x đầu tiên và cuối cùng là chẵn. Tôi giả định rằng các cột đầu tiên và cuối cùng nên được bù đắp bên dưới các cột tiếp theo. Nhưng sau đó tôi đọc câu hỏi trước đó và lưu ý rằng trong trường hợp đó, đó là các cột lẻ nên được bù dưới các số chẵn (lưu ý w-1chia hết cho 4 thì không thể thực hiện cả hai.)

Sự khác biệt đó đã không được thực hiện trong câu hỏi này, tuy nhiên. Tôi sẽ để điều này tùy theo phán quyết và làm lại của OP nếu cần thiết, mặc dù tôi không muốn phải làm vậy.

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