Terinspirasi oleh ini .
Agatha Stephendale, seorang mahasiswa tingkat dua yang benar-benar menyukai grafis raster, telah mengambil kursus aljabar linier. Sekarang dia membayangkan matriks sebagai persegi panjang, tetapi dalam pikiran artistiknya, dia menempelkan garis diagonal pada persegi panjang itu dan mencoba menghitung jejak di sepanjangnya. Bahkan, dia ingin menghitung jejak semua matriks, bukan hanya yang persegi.
Karena Agatha adalah seorang seniman, ia tahu cara menggambar garis di editor gambar favoritnya, dan yang terakhir menggunakan algoritma Bresenham untuk membuat alur. Dia bahkan memeriksa Wikipedia dan menemukan kodesemu:
function line(x0, y0, x1, y1)
real deltax := x1 - x0
real deltay := y1 - y0
real deltaerr := abs(deltay / deltax) // Assume deltax != 0 (line is not vertical),
// note that this division needs to be done in a way that preserves the fractional part
real error := 0.0 // No error at start
int y := y0
for x from x0 to x1
plot(x,y)
error := error + deltaerr
while error ≥ 0.5 then
y := y + sign(deltay) * 1
error := error - 1.0
(Perhatikan bahwa kodesemu ini hanya berfungsi untuk kemiringan kurang dari 1; untuk kisi-kisi tinggi, perlakuan yang sama harus dilakukan, tetapi dengan perulangan y
. Lihat bagian ini untuk dua kasus.)
Agatha membayangkan sebuah matriks sebagai persegi panjang, menggambar garis diagonal di dalamnya, dan algoritma Bresenham menentukan elemen mana dari matriks yang termasuk dalam diagonal. Kemudian dia mengambil jumlah mereka, dan ini adalah apa yang ingin dia terapkan sesedikit mungkin byte karena dia adalah siswa yang miskin dan tidak mampu membeli HDD berkapasitas besar untuk menyimpan kodenya.
Tugas
Diberikan matriks A , kembalikan jumlah elemen yang terletak di diagonal utama yang dirasterisasi (dari kiri atas ke kanan bawah), di mana yang terakhir ditentukan oleh algoritma garis Bresenham. Yaitu, dengan asumsi bahwa matriks mewakili kisi m × n , gambarkan garis pada kisi itu dari A [1, 1] ke A [m, n] menggunakan algoritma Bresenham, dan ambil jumlah semua elemen pada garis tersebut. Perhatikan bahwa untuk matriks 1 × N dan N × 1 , seluruh matriks menjadi diagonalnya sendiri (karena inilah cara seseorang menggambar garis dari elemen pertama dari baris pertama ke elemen terakhir dari baris terakhir).
Input: matriks nyata (mungkin matriks 1 × 1 , matriks baris, matriks kolom, atau matriks persegi panjang). Output: sebuah angka.
Perhatikan bahwa beberapa sumber (mis. Kode semu Wikipedia di atas) menggunakan pemeriksaan kondisi error≥0.5
, sedangkan sumber lain menggunakan error>0.5
. Anda harus menggunakan yang semula diposting ( error≥0.5
), tetapi jika alternatifnya error>0.5
lebih pendek dalam kode Anda, maka Anda diizinkan untuk mengimplementasikannya (karena ini adalah kode golf), tetapi sebutkan secara eksplisit . Lihat test case 4.
Aturan tantangan
- Format I / O fleksibel. Matriks dapat berupa beberapa baris bilangan terbatas ruang yang dipisahkan oleh baris baru, atau larik vektor baris, atau larik vektor kolom, dll.
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
- Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh.
- Celah default dilarang.
Uji kasus
[[1,2,3],[4,5,6],[7,8,9]]
→1+5+9
→ keluaran:15
.
[[1,2,3,4],[5,6,7,8]]
→1+2+7+8
→ keluaran:18
.
[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24]]
→1+8+9+16+17+24
→ keluaran:75
.
[[1,2,3,4,5],[6,7,8,9,10]]
→1+2+8+9+10
(menggunakan≥
kondisi kesalahan) → keluaran:30
.
Namun, jika akan lebih pendek untuk menggunakan ketimpangan ketat >
dalam kode Anda, maka output yang diizinkan adalah 1+2+3+9+10=25
, tetapi Anda harus menyebutkannya secara terpisah.
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
→1+5+8+12
→ keluaran:26
.
[[-0.3,0.5]]
→ keluaran:0.2
.[[3.1],[2.9]]
→ keluaran:6
.[[-5]]
→ keluaran:-5
.
Informasi lebih lanjut tentang algoritma Bresenham
- http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm - kumpulan algoritma untuk berbagai bahasa;
- https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html - penjelasan yang bagus menampilkan kasing berbeda untuk lereng;
- https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm ;
[[1,2,3,4,5],[6,7,8,9,10]]
.[[1,2],[3,4],[5,6],[7,8],[9,10]]
28
(dengan≥
, implementasi yang diharapkan) atau 27 (dengan>
, implementasi opsional.)Jawaban:
Jelly , 25 byte
Cobalah online!
sumber
SmileBASIC,
10199 byteSaya awalnya berpikir untuk menggunakan fungsi GLINE untuk menggambar garis, tetapi tampaknya tidak menggunakan algoritma yang benar. Namun, GTRI tidak tampaknya bekerja,
Kasing uji 4 keluaran 30.
Input adalah array 2D dalam bentuk [Y, X], bersama dengan lebar / tinggi (tidak ada cara untuk memeriksa dimensi array, hanya jumlah total elemen).
sumber
JavaScript (ES6),
110103 byteOutput
25
untuk kasus uji ke-4.Cobalah online!
Atau 88 byte jika mengambil dimensi matriks sebagai input diperbolehkan.
sumber
Python 3.X, 269 byte
Dengan input sebagai baris koma-dibatasi angka-angka yang dibatasi ruang.
import math;c=math.ceil;a=[[float(k)for k in q.split(" ")]for q in input().split(",")];_=len;m=lambda f,t,x,y,e,d:sum(x[0]for x in a)if 2>_(a[0])else m(*[0]*4,*[(_(a)-1)/(_(a[0])-1)]*2)if f else m(f,t+a[y][x],x+1,y+c(e-0.5),e+d-c(e-0.5),d)if x<_(a[0])else t;m(1,*[0]*5)
Pra-golf:
sumber
c=math.ceil
membuat program lebih lama ...[]
antarasum(..)
.a if c else b
sering bisac and a or b
.input("")
bisainput()
.FMSLogo , 136 byte
Program penuh, meminta pengguna untuk input (popup kotak dialog) dan kemudian mencetak output ke layar.
Hanya menggambar garis di layar dan menghitung output. Gunakan ketimpangan yang ketat.
Ini hanya mendukung ukuran matriks hingga ukuran kanvas FMSLogo (sekitar 500 × 500)
Kode tidak dikunci:
sumber