ASCII графічний малюнок Bresenham


17

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

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

Зауважте, що оскільки ви використовуєте _символ, для рядка з y=3вами, ймовірно, потрібно буде вивести 4 рядки тексту (і ви можете випускати провідний порожній рядок, коли це не потрібно).

приклади:

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).

Це бездоганний Delphi divдля цілочислового поділу (а не просто \). Ну добре ...


Досить акуратний і короткий. Read(input,x,y)може бути скорочено до read(x,y), і без, programі apptypeце стає 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.