ASCII искусство рисования линии Брезенхэма


17

Напишите самую короткую из возможных программ, которая рисует линию Брезенхема в искусстве ASCII. Ваша программа должна взять два целых числа xи y(командная строка или стандартный ввод, по вашему выбору) и нарисовать линию ASCII, которая начинается в верхнем левом углу и идет вправо xи вниз y. Вы должны использовать _и \символы и размещать их в правильном месте в соответствии с алгоритмом Брезенхэма .

Вы можете предположить x >= y, что вертикальные сегменты не требуются.

Обратите внимание, что, поскольку вы используете _символ, для строки с 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 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).

Это жалкий Delphi divдля целочисленного деления (а не просто \). Ах хорошо...


Довольно аккуратный и короткий. Read(input,x,y)можно сократить до read(x,y)и без, programи apptypeстановится 157 символов.
Воутер ван Нифтерик

@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может помочь, но это точно такое же количество символов.
Воутер ван Нифтерик

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.