20
\$\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\$

5 Answers 5

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\$
5
\$\begingroup\$

Delphi, 109 bytes

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\$
3
  • \$\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\$ Mar 12, 2011 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, 2011 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\$ Mar 13, 2011 at 14:57
2
\$\begingroup\$

APL (Dyalog Classic), 39 bytes

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

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Charcoal, 22 bytes

F…·¹θ⎇‹﹪⁺×ιη⌊∕θ²θη¶\¦_

It took a while to figure out the right formula, but it now works! Credit to the Delphi answer.

Link is to verbose version of code.

Try it online!

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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