アスキーアートブレゼンハム線画


17

ASCIIアートでブレゼンハムの線を描く最短のプログラムを作成します。プログラムは、2つの整数xy(コマンドラインまたはstdin、選択)を取り、左上から右xユニットおよび下yユニットに移動するASCII行を描画する必要があります。文字を使用し_ブレゼンハムのアルゴリズム\に従って正しい場所に配置する必要があります。

を想定してもよいx >= yので、垂直セグメントは必要ありません。

_文字を使用しているため、1行のy=3場合、テキストを4行出力する必要がある可能性が高いことに注意してください(必要のない場合は、先頭に空白行を出力できます)。

例:

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

5 4

\
 \_
   \
    \

ちょうど中間のポイントについては、どちらかの丸めを選択できます。

10 1
____
    \_____
or
_____
     \____

回答:


7

Perl、74

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

-nオプションで実行(コードサイズでカウント)。

$ 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 136123文字

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

デフィ、109

あなたが私に尋ねるとかなり小さい:

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.

2つの整数はコマンドラインから読み取られます。

改行はめったに使用されない^J構文(LineFeedを意味する)で記述され、次の ' \'文字はあまり知られていない構文を使用してインデントされますWrite(string:width)

これはdiv、整数除算(単なるの代わりに\)に適したDelphi です。まぁ...


かなり端正で短い。Read(input,x,y)に短縮することができread(x,y)、なしでprogramapptype157文字になります。
ウーターヴァンニフテリック

@Wouter van Nifterick:数時間後、109文字になりました!左に勝つために多くがあるとは思わない
...-PatrickvL

ここでは、write()を巧妙に使用しています。私は、書き換えことを考え出しif(i*y+x div 2)mod x<y thenためにif(i*y*2+x)mod(x*2)<y*2then助けることができるが、それは文字の正確な同じ量です。
ウーターヴァンニフテリック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.