Vẽ một đường thẳng


15

Vẽ một hình ảnh nghệ thuật ASCII đơn giản chứa một đường thẳng. Nó tương tự như thế nàythế này nhưng với thông số kỹ thuật khác nhau.

Đầu vào

Bạn có thể sửa đổi định dạng đầu vào này cho phù hợp với mã của bạn.

  • số nguyên width
  • số nguyên height
  • số nguyên x0
  • số nguyên y0
  • số nguyên x1
  • số nguyên y1

Đầu ra

Một hình ảnh nghệ thuật ASCII đầy về chiều rộng và chiều cao được chỉ định có chứa một dòng từ pixel (x0, y0)đến pixel (x1, y1).

Bất kỳ hình thức đầu ra văn bản tiêu chuẩn nào cũng được chấp nhận, nhưng không sử dụng các chức năng vẽ đường thẳng tích hợp.

Chi tiết

Dòng phải được vẽ bằng một ký tự có thể in (chẳng hạn #), trong khi nền được lấp đầy bằng một ký tự khác (chẳng hạn như .). Bạn phải in các ký tự dấu cần thiết để kích thước hình ảnh chính xác.

Các tọa độ pixel có thể được lập chỉ mục 0 hoặc 1 chỉ mục và có thể bắt đầu ở bất kỳ góc nào của hình ảnh. Đường này nên được vẽ bằng cách tưởng tượng một pixel pixel phụ có độ rộng 0 nối giữa tâm của pixel bắt đầu và pixel cuối. Mỗi pixel mà dòng nhập vào phải được điền vào.

Chiến thắng

Quy tắc golf-code thông thường. Mã ngắn nhất sẽ thắng.

Ví dụ

IN: width, height, x0, y0, x1, y1

IN: 7, 6, 0, 0, 6, 5
OUT:
.....##
....##.
...##..
..##...
.##....
##.....

IN: 3, 3, 1, 1, 1, 1
OUT:
...
.#.
...

IN: 3, 3, 0, 2, 2, 0
OUT:
#..
.#.
..#

IN: 6, 3, 0, 0, 5, 2
OUT:
....##
.####.
##....

IN: 4, 4, -1, -1, 0, 3
OUT:
#...
#...
#...
....

4
Tôi muốn nói "Chào mừng bạn đến với PPCG" nhưng bạn đã đăng ký ở đây gần như miễn là tôi. :-) Thử thách đầu tiên tốt đẹp!
admBorkBork

Chúng ta có thể xuất ra các chấm thực tế thay vì dấu cách không? hoặc bất kỳ nhân vật nào khác ngoài không gian? (giả sử vẫn bao gồm dấu <character> s)
Rɪᴋᴇʀ

Chắc chắn rồi! Tôi sẽ thực hiện các chỉnh sửa
Curtis Bechtel

1
@AlbertRenshaw Trên thực tế, khi tôi nhìn vào Curve trên Wikipedia, nó nói: " Trong toán học, một đường cong (còn được gọi là một đường cong trong các văn bản cũ), nói chung, là một đối tượng tương tự như một đường thẳng nhưng không cần phải thẳng. "; )
Kevin Cruijssen

1
@KevinCruijssen ngụ ý rằng một đường cần thẳng , không? ;)
Albert Renshaw

Câu trả lời:


2

Toán học, 166 137 byte

l:={i,j};s=Sign;f[p_,q_,h_,w_]:=Grid@Table[(1-Max[s[p-l]s[q-l],0])Boole[Abs@Mean[s@Det@{p-l+#,p-q}&/@Tuples[.5{1,-1},2]]<.6],{i,h},{j,w}]

Phiên bản dễ đọc hơn:

l := {i, j}; s = Sign; 
f[p_, q_, h_, w_] := 
 Grid@Table[(1 - Max[s[p - l] s[q - l], 0]) Boole[
     Abs@Mean[
        s@Det@{p - l + #, p - q} & /@ 
         Tuples[.5 {1, -1}, 2]] < .6], {i, h}, {j, w}]

Điều này định nghĩa một chức năng được gọi là f. Tôi giải thích các thông số kỹ thuật đầu vào và đầu ra khá tự do. Hàm flấy đầu vào ở định dạng f[{x0, y0}, {x1, y1}, height, width]và lưới được lập chỉ mục 1, bắt đầu ở phía trên bên trái. Đầu ra trông như

Một đầu ra mẫu

với dòng hiển thị là 1 s và nền là 0s (hiển thị ở đây cho f[{2, 6}, {4, 2}, 5, 7]). Nhiệm vụ biến một ma trận Mathicala của 1s và 0s thành một chuỗi #s và .s đã được chơi trong nhiều thử thách khác trước đây, vì vậy tôi chỉ có thể sử dụng một phương pháp tiêu chuẩn, nhưng tôi không nghĩ điều đó thêm bất cứ điều gì thú vị.

Giải trình:

Ý tưởng chung là nếu dòng đi qua một số pixel, thì ít nhất một trong bốn góc của pixel nằm phía trên dòng và ít nhất một ở dưới. Chúng tôi kiểm tra xem một góc ở trên hay dưới đường bằng cách kiểm tra góc giữa các vectơ ( {x0,y0}đến góc) và ( {x0,y0}đến {x1,y1}): nếu góc này là dương, góc ở trên và nếu góc là âm, góc sẽ ở dưới.

Nếu chúng ta có hai vectơ {a1,b1}{a2,b2}, chúng ta có thể kiểm tra xem góc giữa chúng là dương hay âm bằng cách tìm dấu của định thức của ma trận {{a1,b1},{a2,b2}}. (Phương pháp cũ của tôi để thực hiện việc này đã sử dụng số học của các số phức, cách này quá phức tạp, phức tạp.)

Cách thức hoạt động của mã này như sau:

  • {p-l+#,p-q}&/@Tuples[.5{1,-1},2]lấy bốn vectơ từ {x0,y0}và bốn góc của pixel (với l:={i,j}, tọa độ của pixel, được xác định trước đó) và cả vectơ giữa{x0,y0}{x1,y1}.
  • s@Det@... tìm thấy dấu hiệu của các góc giữa đường thẳng và bốn góc (sử dụng s=Sign ). Chúng sẽ bằng -1, 0 hoặc 1.
  • Abs@Mean[...]<.6kiểm tra rằng một số góc là dương và một số âm. Tất cả 4 dấu hiệu có thuộc tính này đều có phương tiện trong khoảng -0,5 đến 0,5 (đã bao gồm), vì vậy chúng tôi so sánh với 0,6 để lưu một byte bằng cách sử dụng <thay vì <=.

Vẫn còn một vấn đề: mã này giả định rằng dòng kéo dài mãi mãi theo cả hai hướng. Do đó, chúng ta cần cắt đường bằng cách nhân với 1-Max[s[p-l]s[q-l],0](được tìm thấy bởi bản dùng thử và lỗi), nằm 1bên trong hình chữ nhật được xác định bởi các điểm cuối của dòng và 0bên ngoài nó.

Cắt một dòng bằng một hình chữ nhật

Phần còn lại của mã tạo ra một lưới các pixel này.

(Như một phần thưởng, đây là một nỗ lực trước đó với một phương thức hoàn toàn khác, cho 181 byte :)

Quiet@Grid@Table[(1-Max[Sign[{i,j}-#3]Sign[{i,j}-#4],0])Boole[#3==#4=={i,j}||2Abs@Tr[Cross@@Thread@{{i,j},#3,#4}]/Norm[d=#3-#4]<2^.5Cos@Abs[Pi/4-Mod[ArcTan@@d,Pi/2]]],{i,#},{j,#2}]&

1
Bây giờ đã xong, đến giờ ăn trưa! (Lúc 6:30 chiều)
Không phải là một cái cây

1

CJam, 122 byte

{),V>{[I\]E.*A.+}/}:F;l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:D[0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fID~\:I;F]{_Wf>\S.<+:*},{~_3$=@0tt}/N*

Dùng thử trực tuyến

Điều này về cơ bản kết hợp hai câu trả lời tôi đã viết trước đây cho các thử thách khác (chủ yếu là các tính toán từ hàm thứ 2 - hàm l).
(0, 0) tự nhiên là góc trên cùng bên trái, không phải phía dưới bên trái như các ví dụ trong tuyên bố.

Tổng quat:

{),V>{[I\]E.*A.+}/}:F;định nghĩa hàm F giúp tạo ra tất cả các pixel (cặp tọa độ) cho tọa độ x đã cho
l~]2/~@:S~'.*f*\@:A.-_:g:E;:z:Dvà đọc và xử lý đầu vào, đồng thời tạo ra một ma trận các điểm
0=:B{D~I2*)*+:U(2/B/FU2/B/:V;}fIlặp trên tất cả các tọa độ x trừ cái cuối cùng và tạo ra tất cả các pixel tương ứng
D~\:I;Fgiống nhau cho tọa độ x cuối cùng
{_Wf>\S.<+:*},chỉ giữ các pixel xuất hiện bên trong hình ảnh
{~_3$=@0tt}/đặt 0 trong ma trận cho mỗi pixel
N*tham gia ma trận với các ký tự dòng mới để hiển thị

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.