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.