Dessin au trait Bresenham art ASCII

17

Écrivez le programme le plus court possible qui dessine une ligne de Bresenham dans l'art ASCII. Votre programme doit prendre deux entiers xet y(ligne de commande ou stdin, votre choix) et dessiner une ligne ASCII qui commence en haut à gauche et va vers la droite xet vers le bas y. Vous devez utiliser _et \caractères et les placer au bon endroit selon de Bresenham algorithme.

Vous pouvez supposer x >= y, donc aucun segment vertical n'est requis.

Notez que parce que vous utilisez le _caractère, pour une ligne avec y=3vous aurez probablement besoin de produire 4 lignes de texte (et vous pouvez émettre une première ligne vierge quand ce n'est pas nécessaire).

exemples:

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

5 4

\
 \_
   \
    \

Pour les points qui sont exactement à mi-chemin, vous pouvez choisir l’arrondi:

10 1
____
    \_____
or
_____
     \____
Keith Randall
la source

Réponses:

7

Perl, 74

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

Exécuter avec -noption (compté dans la taille du code).

$ 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
la source
5

C 136 123 Caractères

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
la source
4

Dephi, 109

Assez petit si vous me demandez:

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.

Les 2 entiers sont lus depuis la ligne de commande.

La nouvelle ligne est écrit par le utilisé peu souvent la ^Jsyntaxe ( ce qui signifie LineFeed), le « suivant le \caractère » est en retrait en utilisant la syntaxe peu connue: Write(string:width).

C'est un Delphi pitoyable divpour la division entière (au lieu de juste \). Et bien...

PatrickvL
la source
Assez soigné et court. Read(input,x,y)peut être raccourci à read(x,y)et sans programet apptypeil devient 157 caractères.
Wouter van Nifterick
@Wouter van Nifterick: Quelques heures plus tard et il ne reste plus que 109 caractères! Ne pensez pas qu'il reste beaucoup à gagner ...
PatrickvL
C'est une utilisation intelligente de write () ici. Je pensais que la réécriture if(i*y+x div 2)mod x<y thenpour if(i*y*2+x)mod(x*2)<y*2thenpourrait aider, mais il est le montant exact même de caractères.
Wouter van Nifterick