Arte ASCII Disegno a tratteggio di Bresenham


17

Scrivi il programma più breve possibile che disegna una linea di Bresenham nell'arte ASCII. Il tuo programma dovrebbe prendere due numeri interi xe y(riga di comando o stdin, a tua scelta) e disegnare una linea ASCII che inizia in alto a sinistra e va a destra xunità e yunità in basso . È necessario utilizzare _e \personaggi e metterli nella posizione corretta in base al di Bresenham algoritmo.

Si può presumere x >= y, quindi non sono richiesti segmenti verticali.

Nota che, poiché stai usando il _carattere, per una riga con y=3te probabilmente dovrai generare 4 righe di testo (e potresti emettere una riga vuota iniziale quando non è necessario).

esempi:

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

5 4

\
 \_
   \
    \

Per i punti che sono esattamente a metà strada puoi scegliere uno degli arrotondamenti:

10 1
____
    \_____
or
_____
     \____

Risposte:


7

Perl, 74

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

Esegui con -nopzione (conteggiato nella dimensione del codice).

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

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

5

C 136 123 personaggi

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

4

Dephi, 109

Abbastanza piccolo se mi chiedi:

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.

I 2 numeri interi vengono letti dalla riga di comando.

La nuova riga è scritta dai raramente utilizzata ^Jla sintassi (che significa AvanzRiga), il seguente ' \' carattere è rientrato utilizzando la sintassi poco conosciuto: Write(string:width).

È un Delphi penoso divper il numero intero (anziché solo \). Ah bene...


Abbastanza pulito e corto. Read(input,x,y)può essere abbreviato in read(x,y)e senza programe apptypediventa 157 caratteri.
Wouter van Nifterick,

@Wouter van Nifterick: poche ore dopo e ora sono 109 caratteri! Non pensare che ci sia molto da vincere a sinistra ...
PatrickvL

Questo è un uso intelligente di write () qui. Ho pensato che la riscrittura if(i*y+x div 2)mod x<y thendi if(i*y*2+x)mod(x*2)<y*2thenpotrebbe aiutare, ma è esattamente lo stesso numero di caratteri.
Wouter van Nifterick,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.