ASCII艺术Bresenham线条图


17

编写最短的程序,用ASCII艺术画出一条布雷森纳姆线。您的程序应使用两个整数xy(选择命令行或标准输入),并绘制一个ASCII行,该行从左上方开始,向右移动x,向下移动y。您必须使用_\字符,并根据Bresenham的算法将其放置在正确的位置。

您可以假设x >= y,因此不需要垂直线段。

请注意,由于您使用的是_字符,因此与之对应的一行y=3可能需要输出4行文本(并且在不必要时可能会发出前导空白行)。

例子:

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

5 4

\
 \_
   \
    \

对于正好是中点的点,您可以选择任一取整:

10 1
____
    \_____
or
_____
     \____

Answers:


7

Perl,74岁

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

使用-n选项运行(以代码大小计)。

$ 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 136123个字符

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

德菲(109)

如果您问我,这个数字很小:

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个整数。

换行符是由很少使用的^J语法(即LineFeed)编写的,以下' \'字符使用鲜为人知的语法缩进:Write(string:width)

div对于整数除法(而不是),这是一个可怜的Delphi \。呃,好吧...


很整齐又短。Read(input,x,y)可缩短到read(x,y),并且在不programapptype它成为157个字符。
Wouter van Nifterick 2011年

@Wouter van Nifterick:几个小时后,现在只有109个字符!不要以为还有很多要赢的...
PatrickvL 2011年

这是write()的巧妙用法。我计算过,改写if(i*y+x div 2)mod x<y thenif(i*y*2+x)mod(x*2)<y*2then可以帮助,但它的字符完全相同的量。
Wouter van Nifterick 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.