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
_____
     \____

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'
____
    \_____

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

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...


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.