AnswerBun.com

ASCII art Bresenham line drawing

Code Golf Asked by Keith Randall on December 6, 2020

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
_____
     ____

5 Answers

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'
____
    _____

Correct answer by J B on December 6, 2020

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!

Answered by Razetime on December 6, 2020

APL (Dyalog Classic), 39 bytes

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

Try it online!

Answered by ngn on December 6, 2020

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...

Answered by PatrickvL on December 6, 2020

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);}}

Answered by fR0DDY on December 6, 2020

Add your own answers!

Related Questions

What’s my PPCG ID?

8  Asked on December 3, 2020 by musicman523

     

The bouncing sequence

8  Asked on November 28, 2020 by wheat-wizard

       

Zero sum covers

16  Asked on November 10, 2020 by zgarb

     

Swapping “Good” and “Bad”

74  Asked on October 15, 2020 by ishaq-khan

     

Pi to the power y, for small y’s

22  Asked on October 4, 2020 by user9207

     

The Third String

36  Asked on September 5, 2020 by stephen

   

Compress your code in an image

11  Asked on August 17, 2020 by blint

     

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir