Nghệ thuật ASCII vẽ đường Bresenham


17

Viết chương trình ngắn nhất có thể vẽ một dòng Bresenham trong nghệ thuật ASCII. Chương trình của bạn nên lấy hai số nguyên xy(dòng lệnh hoặc stdin, lựa chọn của bạn) và vẽ một dòng ASCII bắt đầu ở phía trên bên trái và đi xđơn vị bên phải và yđơn vị xuống . Bạn phải sử dụng _\ký tự và đặt chúng vào đúng vị trí theo thuật toán của Bresenham .

Bạn có thể giả sử x >= y, vì vậy không có phân đoạn dọc được yêu cầu.

Lưu ý rằng vì bạn đang sử dụng _ký tự, cho một dòng với y=3bạn có thể sẽ cần xuất 4 dòng văn bản (và bạn có thể phát ra một dòng trống hàng đầu khi không cần thiết).

ví dụ:

11 3
_
 \___
     \___
         \_
11 1
_____
     \_____

5 4

\
 \_
   \
    \

Đối với các điểm chính xác là một nửa, bạn có thể chọn làm tròn:

10 1
____
    \_____
or
_____
     \____

Câu trả lời:


7

Perl, 74

/ /;print int(.5+$_*$'/$`)>int(.5+--$_*$'/$`)?$/.$"x$_.'\\':'_'for 1..$`

Chạy với -ntùy chọn (tính theo kích thước mã).

$ perl -n bresenham.pl <<<'11 3'
_
 \___
     \___
         \_
$ perl -n bresenham.pl <<<'11 1'
_____
     \_____
$ perl -n bresenham.pl <<<'5 4'

\
 \_
   \
    \
$ perl -n bresenham.pl <<<'10 1'
____
    \_____

5

C 136 123 Ký tự

z,x,y,i,f;main(){for(scanf("%d%d",&x,&y);i<=x;i++){f=f?printf("_"):1;z+=y;if(2*z>=x&&i<x)f=0,z-=x,printf("\n%*c",i+1,92);}}

4

Dephi, 109

Khá nhỏ nếu bạn hỏi tôi:

var x,y,i:Word;begin Read(x,y);for i:=1to(x)do if(i*y+x div 2)mod x<y then Write(^J,'\':i)else Write('_')end.

2 số nguyên được đọc từ dòng lệnh.

Dòng mới được viết bởi ^Jcú pháp hiếm khi được sử dụng (có nghĩa là LineFeed), \ký tự ' ' sau đây được thụt lề bằng cú pháp ít được biết đến : Write(string:width).

Đó là một Delphi đáng thương divcho phân chia số nguyên (thay vì chỉ \). À ...


Khá gọn gàng và ngắn gọn. Read(input,x,y)có thể rút ngắn read(x,y)và không có programapptypenó trở thành 157 ký tự.
Wouter van Nifterick

@Wouter van Nifterick: Vài giờ sau và bây giờ giảm xuống còn 109 ký tự! Đừng nghĩ có nhiều thứ để giành chiến thắng ...
PatrickvL

Đó là một cách sử dụng thông minh của write () ở đây. Tôi đoán rằng viết lại if(i*y+x div 2)mod x<y thenđể if(i*y*2+x)mod(x*2)<y*2thencó thể giúp đỡ, nhưng đó là cùng một lượng ký tự.
Wouter van Nifterick

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.