Dibujo de línea de arte ASCII Bresenham

17

Escriba el programa más corto posible que dibuje una línea de Bresenham en el arte ASCII. Su programa debe tomar dos enteros xy y(línea de comando o stdin, a su elección) y dibujar una línea ASCII que comienza en la parte superior izquierda y va a la derecha xy baja y. Debe usar _y \caracteres y colocarlos en la ubicación correcta de acuerdo con el algoritmo de Bresenham .

Puede suponer x >= y, por lo que no se requieren segmentos verticales.

Tenga en cuenta que debido a que está utilizando el _carácter, para una línea con la y=3que probablemente tendrá que generar 4 líneas de texto (y puede emitir una línea en blanco cuando no sea necesario).

ejemplos:

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

5 4

\
 \_
   \
    \

Para los puntos que están exactamente a mitad de camino, puede elegir redondear:

10 1
____
    \_____
or
_____
     \____
Keith Randall
fuente

Respuestas:

7

Perl, 74

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

Ejecutar con -nopción (contado en tamaño de código).

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

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

C 136 123 Personajes

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);}}
fR0DDY
fuente
4

Dephi, 109

Bastante pequeño si me preguntas:

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.

Los 2 enteros se leen desde la línea de comando.

La nueva línea está escrito por el raramente usado ^Jsintaxis (que significa AvLínea), el 'siguiente \personaje tiene sangría utilizando la sintaxis poco conocido: Write(string:width).

Es un Delphi lamentable divpara la división de enteros (en lugar de solo \). Ah bueno...

PatrickvL
fuente
Bastante ordenado y corto. Read(input,x,y)se puede acortar read(x,y)y sin programy apptypese convierte en 157 caracteres.
Wouter van Nifterick
@Wouter van Nifterick: ¡Unas horas más tarde y ahora se reduce a 109 caracteres! No creo que quede mucho por ganar ...
PatrickvL
Ese es un uso inteligente de write () aquí. Pensé que reescribir if(i*y+x div 2)mod x<y thena if(i*y*2+x)mod(x*2)<y*2thenpodría ayudar, pero es exactamente la misma cantidad de caracteres.
Wouter van Nifterick