Desenho de linha de arte ASCII Bresenham

17

Escreva o programa mais curto possível que desenhe uma linha de Bresenham na arte ASCII. Seu programa deve pegar dois números inteiros xe y(linha de comando ou stdin, sua escolha) e desenhar uma linha ASCII que começa no canto superior esquerdo e vai para a direita xe para baixo y. Você deve usar _e \personagens e colocá-los no local correto de acordo com o Bresenham algoritmo.

Você pode assumir x >= y, portanto, nenhum segmento vertical é necessário.

Observe que, como você está usando o _caractere, para uma linha com y=3você, provavelmente será necessário gerar 4 linhas de texto (e você poderá emitir uma linha em branco à esquerda quando não for necessário).

exemplos:

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

5 4

\
 \_
   \
    \

Para pontos que estão exatamente na metade do caminho, você pode escolher um arredondamento:

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

Respostas:

7

Perl, 74

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

Execute com a -nopção (contada no tamanho do 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
fonte
5

C 136 123 caracteres

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
fonte
4

Dephi, 109

Muito pequeno se você me perguntar:

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.

Os 2 números inteiros são lidos na linha de comando.

A nova linha é escrita pelo seldomly usado ^Jsintaxe (que significa Alimentação de linhas), a seguinte ' \caráter' é recuado usando a sintaxe conhecida-pouco: Write(string:width).

É um Delphi pitty divpara inteiro de divisão (em vez de apenas \). Ah bem...

PatrickvL
fonte
Bem arrumado e curto. Read(input,x,y)pode ser reduzido para read(x,y)e sem programe apptypese torna 157 caracteres.
Wouter van Nifterick 31/03/19
@Wouter van Nifterick: Poucas horas depois e agora temos 109 caracteres! Não acho que há muito para ganhar esquerda ...
PatrickvL
Esse é um uso inteligente de write () aqui. Eu percebi que reescrever if(i*y+x div 2)mod x<y thena if(i*y*2+x)mod(x*2)<y*2thenpoderia ajudar, mas é exatamente a mesma quantidade de caracteres.
Wouter van Nifterick 13/03/11