Rysowanie linii ASCII sztuki Bresenham

17

Napisz najkrótszy możliwy program, który rysuje linię Bresenhama w sztuce ASCII. Twój program powinien wziąć dwie liczby całkowite xi y(wiersz poleceń lub standardowe, twój wybór) i narysować linię ASCII, która zaczyna się w lewym górnym rogu i biegnie w prawo xi w dół y. Należy użyć _i \znaków i umieścić je w odpowiednim miejscu, zgodnie z Bresenham w algorytmie.

Możesz założyć x >= y, więc nie są wymagane żadne segmenty pionowe.

Zauważ, że ponieważ używasz _znaku, w linii z y=3prawdopodobnie będziesz musiał wypisać 4 linie tekstu (i możesz wysunąć wiodącą pustą linię, gdy nie jest to konieczne).

przykłady:

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

5 4

\
 \_
   \
    \

W przypadku punktów dokładnie w połowie możesz wybrać zaokrąglenie:

10 1
____
    \_____
or
_____
     \____
Keith Randall
źródło

Odpowiedzi:

7

Perl, 74

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

Uruchom z -nopcją (liczone jako rozmiar kodu).

$ 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
źródło
5

C 136 123 znaków

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
źródło
4

Dephi, 109

Dość mały, jeśli zapytasz mnie:

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.

Dwie liczby całkowite są odczytywane z wiersza poleceń.

Znak nowej linii jest napisane przez rzadko używane ^Jskładni (czyli wysuw) dodaje się „ \znak” jest wcięty za pomocą składni mało znane: Write(string:width).

Szkoda, że ​​Delphi divdzieli liczbę całkowitą (zamiast tylko \). Ach tak...

PatrickvL
źródło
Całkiem schludnie i krótko. Read(input,x,y)można go skrócić do read(x,y)i bez, programi apptypestaje się 157 znaków.
Wouter van Nifterick
@Wouter van Nifterick: Kilka godzin później i ma teraz do 109 znaków! Nie sądzę, że zostało jeszcze wiele do wygrania ...
PatrickvL,
To sprytne użycie write () tutaj. Uznałem, że przepisanie if(i*y+x div 2)mod x<y thenna to if(i*y*2+x)mod(x*2)<y*2thenmoże pomóc, ale to dokładnie tyle samo znaków.
Wouter van Nifterick