ASCII art Bresenham 선 그리기


17

ASCII 아트에서 Bresenham 라인을 그리는 가장 짧은 프로그램을 작성하십시오. 여러분의 프로그램은 두 개의 정수해야 x하고 y(명령 행 또는 표준 입력, 당신의 선택을)하고 왼쪽 상단에 시작하고 바로가는 아스키 라인을 그릴 x단위와 아래 y단위. Bresenham의 알고리즘 에 따라 _\문자 를 사용 하고 올바른 위치에 배치해야 합니다.

x >= y수직 세그먼트가 필요하지 않다고 가정 할 수 있습니다 .

_문자를 사용하고 있기 때문에 한 줄에 y=34 줄의 텍스트를 출력해야 할 수도 있습니다 (필요하지 않은 경우 빈 줄이 나타날 수도 있습니다).

예 :

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

5 4

\
 \_
   \
    \

정확히 중간 지점 인 경우 반올림을 선택할 수 있습니다.

10 1
____
    \_____
or
_____
     \____

답변:


7

펄, 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 136 123 개 문자

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)하고없이 programapptype는 157 개 문자된다.
Wouter van Nifterick

@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도움 이 될 것이라고 생각 했지만 정확히 같은 양의 문자입니다.
Wouter van Nifterick

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.