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
_____
     \____

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'
____
    \_____

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);}}

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.