ASCII-Kunst Bresenham Strichzeichnung

17

Schreiben Sie das kürzestmögliche Programm, das eine Bresenham-Linie in ASCII-Kunst zeichnet. Ihr Programm sollte zwei Ganzzahlen xund y(Kommandozeile oder stdin, Ihre Wahl) verwenden und eine ASCII-Linie zeichnen, die oben links beginnt und nach rechts xund unten beginnt y. Sie müssen _und \-Zeichen verwenden und gemäß Bresenhams Algorithmus an der richtigen Stelle platzieren .

Sie können davon ausgehen x >= y, dass keine vertikalen Segmente erforderlich sind.

Da Sie das _Zeichen verwenden, müssen Sie für eine Zeile mit y=3wahrscheinlich 4 Textzeilen ausgeben (und Sie können eine führende Leerzeile ausgeben, wenn dies nicht erforderlich ist).

Beispiele:

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

5 4

\
 \_
   \
    \

Für Punkte, die genau auf halber Strecke liegen, können Sie eine der folgenden Rundungen wählen:

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

Antworten:

7

Perl, 74

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

Mit -nOption ausführen (in Codegröße gezählt).

$ 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
quelle
5

C 136 123 Zeichen

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

Dephi, 109

Ganz klein, wenn du mich fragst:

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.

Die 2 Ganzzahlen werden von der Befehlszeile gelesen.

Die Neue - Zeile von der selten verwendeten geschrieben ^JSyntax (Bedeutung Zeilenvor), der folgende ‚ \wird‘ Charakter eingekerbt die wenig bekannte Syntax: Write(string:width).

Es ist schade, Delphi divfür Integer-Divide (statt nur \). Ah, gut...

PatrickvL
quelle
Ziemlich ordentlich und kurz. Read(input,x,y)kann auf read(x,y)und ohne gekürzt werden programund apptypewird zu 157 Zeichen.
Wouter van Nifterick
@Wouter van Nifterick: Ein paar Stunden später sind es nur noch 109 Zeichen! Denken Sie nicht, dass es noch viel zu gewinnen gibt ...
PatrickvL
Das ist eine clevere Verwendung von write () hier. Ich dachte , dass Umschreiben helfen könnte, aber es ist genau die gleiche Menge von Zeichen. if(i*y+x div 2)mod x<y thenif(i*y*2+x)mod(x*2)<y*2then
Wouter van Nifterick