17
\$\begingroup\$

Write the shortest possible program that draws a Bresenham line in ASCII art. Your program should take two integers x and y (command line or stdin, your choice) and draw an ASCII line which starts in the upper left and goes right x units and down y units. You must use _ and \ characters and place them in the correct location according to Bresenham's algorithm.

You may assume x >= y, so no vertical segments are required.

Note that because you're using the _ character, for a line with y=3 you will likely need to output 4 lines of text (and you may emit a leading blank line when it isn't necessary).

examples:

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

5 4

\
 \_
   \
    \

For points which are exactly halfway you may choose either rounding:

10 1
____
    \_____
or
_____
     \____
\$\endgroup\$
7
\$\begingroup\$

Perl, 74

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

Run with -n option (counted in code size).

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

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

C 136 123 Characters

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);}}
\$\endgroup\$
4
\$\begingroup\$

Dephi, 109

Quite small if you ask me :

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.

The 2 integers are read from the command line.

The newline is written by the seldomly used ^J syntax (meaning LineFeed), the following '\' character is indented using the little-known syntax :Write(string:width).

It's a pitty Delphi div for integer-divide (instead of just \). Ah well...

\$\endgroup\$
  • \$\begingroup\$ Pretty neat and short. Read(input,x,y) can be shortened to read(x,y), and without program and apptype it becomes 157 characters. \$\endgroup\$ – Wouter van Nifterick Mar 12 '11 at 14:36
  • \$\begingroup\$ @Wouter van Nifterick : A few hours later and it's down to 109 characters now! Don't think there's much to win left... \$\endgroup\$ – PatrickvL Mar 13 '11 at 9:47
  • \$\begingroup\$ That's a clever use of write() here. I figured that rewriting if(i*y+x div 2)mod x<y then to if(i*y*2+x)mod(x*2)<y*2then could help, but it's the exact same amount of characters. \$\endgroup\$ – Wouter van Nifterick Mar 13 '11 at 14:57
1
\$\begingroup\$

APL (Dyalog Classic), 39 bytes

{⍉↑(-1++\a)↑¨'_\'[a←-2-/⌊.5+⍵×⍺÷⍨⍳1+⍺]}

Try it online!

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.