Esinlenen bu .
Gerçekten raster grafiklerine sahip bir ikinci sınıf öğrencisi olan Agatha Stephendale, lineer cebirde ders aldı. Şimdi matrisleri dikdörtgen olarak hayal ediyor, ancak sanatsal zihninde, bu dikdörtgenlere çapraz çizgiler ekliyor ve bunlar boyunca izleri hesaplamaya çalışıyor. Aslında, sadece kare olanların değil, tüm matrislerin izlerini hesaplamak istiyor.
Agatha bir sanatçı olduğu için, en sevdiği resim düzenleyicide nasıl çizgi çizileceğini biliyor ve ikincisi çizgileri çizmek için Bresenham'ın algoritmasını kullanıyor . Wikipedia'yı bile kontrol etti ve sahte kodu buldu:
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
(Bu sahte kodun yalnızca 1'den küçük eğimler için çalıştığını unutmayın; uzun ızgaralar için benzer bir işlem yapılmalıdır, ancak bir döngü üzerinden yapılmalıdır y
. İki durum için bu bölüme bakın .)
Agatha bir matrisi dikdörtgen olarak hayal eder, içine çapraz bir çizgi çizer ve Bresenham'ın algoritması bir matrisin hangi öğelerinin köşegenlere ait olduğunu belirler. Sonra toplamlarını alır ve mümkün olduğu kadar az baytta uygulamak istediği şey budur, çünkü fakir bir öğrencidir ve kodunu saklamak için büyük kapasiteli HDD'leri karşılayamaz.
Görev
Bir matris A verildiğinde , rasterleştirilmiş ana diyagonalde (sol soldan sağa doğru) bulunan elemanların toplamını döndürün, burada ikincisi Bresenham'ın çizgi algoritması ile belirlenir. Yani, matrisin bir m × n ızgarasını temsil ettiği varsayılarak, Bresenham algoritmasını kullanarak A [1, 1] 'den A [m, n]' ye bir ızgara çizin ve satırdaki tüm elemanların toplamını alın. Not için bu 1 x N ve N x 1 (bu bir son sıranın son eleman ilk sıranın birinci elemandan bir çizgi çizmek nasıl olduğu için) matrisler, bütün matris kendi çapını olur.
Girdi: gerçek bir matris ( 1 × 1 matris, bir satır matrisi, bir sütun matrisi veya dikdörtgen bir matris olabilir). Çıktı: bir sayı.
Bazı kaynakların (örn. Yukarıdaki Wikipedia'nın sahte kodunun) durum kontrolünü error≥0.5
kullanırken, diğer kaynakların kullandığını unutmayın error>0.5
. Başlangıçta gönderilen bir ( error≥0.5
) kullanmalısınız, ancak alternatif error>0.5
kodunuzda daha kısaysa, bunu uygulamanıza izin verilir (bu kod golf olduğundan), ancak açıkça belirtin . Test durumu 4'e bakınız.
Zorluk kuralları
- G / Ç formatları esnektir. Bir matris, satır satırları veya satır vektörleri dizisi veya bir dizi sütun vektörü vb. İle ayrılmış, boşlukla ayrılmış birkaç satır olabilir.
- Bu kod golf , bayt en kısa cevap kazanır.
- Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir.
- Varsayılan boşluklar yasaktır.
Test senaryoları
[[1,2,3],[4,5,6],[7,8,9]]
→1+5+9
→ çıkışı:15
.
[[1,2,3,4],[5,6,7,8]]
→1+2+7+8
→ çıkışı: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
→ çıkışı:75
.
[[1,2,3,4,5],[6,7,8,9,10]]
→1+2+8+9+10
(kullanarak≥
çıkışı → hata durumunu):30
.
Bununla birlikte, >
kodunuzdaki katı eşitsizliği kullanmak daha kısa olacaksa , izin verilen çıktıdır 1+2+3+9+10=25
, ancak ayrı olarak belirtmelisiniz.
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
→1+5+8+12
→ çıkışı:26
.
[[-0.3,0.5]]
→ çıkışı:0.2
.[[3.1],[2.9]]
→ çıkışı:6
.[[-5]]
→ çıkışı:-5
.
Bresenham algoritması hakkında daha fazla bilgi
- http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm - farklı diller için bir algoritma koleksiyonu;
- https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html - yamaçlarda farklı durumlar içeren hoş bir açıklama;
- https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm ;
[[1,2],[3,4],[5,6],[7,8],[9,10]]
28
( ≥
beklenen uygulama ile) veya 27 ( >
isteğe bağlı uygulama ile) olmalıdır
[[1,2,3,4,5],[6,7,8,9,10]]
.