ASCII seni menggambar garis Bresenham

17

Tulislah program sesingkat mungkin yang menarik garis Bresenham dalam seni ASCII. Program Anda harus mengambil dua bilangan bulat xdan y(baris perintah atau stdin, pilihan Anda) dan menggambar garis ASCII yang dimulai di kiri atas dan menuju xunit kanan dan ke bawah yunit. Anda harus menggunakan _dan \karakter dan menempatkannya di lokasi yang benar sesuai dengan algoritma Bresenham .

Anda boleh berasumsi x >= y, jadi tidak ada segmen vertikal yang diperlukan.

Perhatikan bahwa karena Anda menggunakan _karakter, untuk sebuah baris dengan y=3Anda kemungkinan akan perlu menghasilkan 4 baris teks (dan Anda dapat memancarkan baris kosong di depan ketika tidak diperlukan).

contoh:

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

5 4

\
 \_
   \
    \

Untuk poin yang persis setengah jalan Anda dapat memilih pembulatan:

10 1
____
    \_____
or
_____
     \____
Keith Randall
sumber

Jawaban:

7

Perl, 74

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

Jalankan dengan -nopsi (dihitung dalam ukuran kode).

$ perl -n bresenham.pl <<<'11 3'
_
 \___
     \___
         \_
$ perl -n bresenham.pl <<<'11 1'
_____
     \_____
$ perl -n bresenham.pl <<<'5 4'

\
 \_
   \
    \
$ perl -n bresenham.pl <<<'10 1'
____
    \_____
JB
sumber
5

C 136 123 Karakter

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);}}
fR0DDY
sumber
4

Dephi, 109

Cukup kecil jika Anda bertanya kepada saya:

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 bilangan bulat dibaca dari baris perintah.

Baris baru ditulis oleh seldomly digunakan ^Jsintaks (berarti ganti baris), berikut ' \' karakter lebih menjorok menggunakan sintaks sedikit diketahui: Write(string:width).

Ini adalah Delphi kecil divuntuk integer-divide (bukan hanya \). Baiklah ...

PatrickvL
sumber
Cukup rapi dan pendek. Read(input,x,y)dapat disingkat menjadi read(x,y), dan tanpa programdan apptypeitu menjadi 157 karakter.
Wouter van Nifterick
@Wouter van Nifterick: Beberapa jam kemudian dan sekarang tinggal 109 karakter! Jangan berpikir masih banyak yang harus dimenangkan ...
PatrickvL
Itu penggunaan cerdik () di sini. Saya pikir bahwa menulis ulang if(i*y+x div 2)mod x<y thenuntuk if(i*y*2+x)mod(x*2)<y*2thenbisa membantu, tapi itu jumlah yang sama persis karakter.
Wouter van Nifterick