ASCII art Bresenham çizgi çizme


17

ASCII sanatında bir Bresenham çizgisi çizen mümkün olan en kısa programı yazın. Programınız iki tamsayı almalı xve y(komut satırı veya stdin, seçiminiz) ve sol üstte başlayan ve sağ xbirimlere ve aşağı ybirimlere giden bir ASCII satırı çizmelidir. Bresenham'ın algoritmasına göre _ve \karakterlerini kullanmalı ve doğru konuma yerleştirmelisiniz .

Varsayalım x >= y, böylece dikey segment gerekmez.

_Karakteri kullandığınız için , y=3muhtemelen bir satır için 4 satırlık metin çıktısı almanız gerekeceğini (ve gerekli olmadığında boş bir satır yayınlayabileceğinizi) unutmayın.

örnekler:

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

5 4

\
 \_
   \
    \

Tam olarak yarıya kadar olan puanlar için iki yuvarlamayı da seçebilirsiniz:

10 1
____
    \_____
or
_____
     \____

Yanıtlar:


7

Perl, 74

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

-nSeçenekle çalıştır (kod boyutunda sayılır).

$ 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 Karakterler

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

Bana sorarsanız oldukça küçük:

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 tamsayı komut satırından okunur.

Yeni satır, nadiren kullanılan ^Jsözdizimi (LineFeed anlamına gelir) tarafından yazılır , aşağıdaki ' \' karakteri az bilinen sözdizimi kullanılarak girintilidir:Write(string:width) .

divTamsayı-bölmek için pitty Delphi (sadece yerine \). Ah şey ...


Oldukça temiz ve kısa. Read(input,x,y)kısaltılabilir read(x,y)ve olmadan kısaltılabilir programve apptype157 karakter olur.
Wouter van Nifterick

@Wouter van Nifterick: Birkaç saat sonra şimdi 109 karaktere düştü! Kazanacak çok şey olduğunu düşünme ...
PatrickvL

Burada write () 'nin akıllıca bir kullanımı. Ben yeniden düşündüm if(i*y+x div 2)mod x<y thenetmek if(i*y*2+x)mod(x*2)<y*2thenyardımcı olabilir, ancak tam olarak aynı karakter miktar.
Wouter van Nifterick

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.