2D bölümlenmiş toplam


16

Meydan okuma

Bir matris Verilen K ile R satır ve c sütunlar ve iki mantıksal listeleri V uzunluğu r ve H uzunluğu c , bölmeli bir kümülatif dikey ve yatay toplamları hesaplamak.

kurallar

  • r ve c bir veya daha büyüktür

  • H ve V gerçek bir değerle başlar

  • M'deki değerler dilinizin makul sayısal etki alanı içindedir.

  • Bölümleme ve toplama sol üst köşeden başlar.

İçinden geç

Verilen M :

┌──────────────┐
│ 1  2  3  4  5│
│ 6  7  8  9 10│
│11 12 13 14 15│
│16 17 18 19 20│
└──────────────┘

H :1 0 1 0 0

V :1 1 0 1

Bölünmüş M her gerçek değerde yeni bir grup başlayan sütunların gruba H

┌─────┬────────┐
│ 1  2│ 3  4  5│
│ 6  7│ 8  9 10│
│11 12│13 14 15│
│16 17│18 19 20│
└─────┴────────┘

Her sütun grubunu satır gruplarına ayırın ve V'nin her gerçek değerinde yeni bir grup başlatın :

┌─────┬────────┐
│ 1  2│ 3  4  5│
├─────┼────────┤
│ 6  7│ 8  9 10│
│11 12│13 14 15│
├─────┼────────┤
│16 17│18 19 20│
└─────┴────────┘

Her hücreyi kümülatif olarak yatay olarak toplayın:

┌─────┬────────┐
│ 1  3│ 3  7 12│
├─────┼────────┤
│ 6 13│ 8 17 27│
│11 23│13 27 42│
├─────┼────────┤
│16 33│18 37 57│
└─────┴────────┘

Her hücreyi kümülatif olarak dikey olarak toplayın:

┌─────┬────────┐
│ 1  3│ 3  7 12│
├─────┼────────┤
│ 6 13│ 8 17 27│
│17 36│21 44 69│
├─────┼────────┤
│16 33│18 37 57│
└─────┴────────┘

Sonuç:

┌──────────────┐
│ 1  3  3  7 12│
│ 6 13  8 17 27│
│17 36 21 44 69│
│16 33 18 37 57│
└──────────────┘

Ek test senaryoları

M :

┌───────────┐
│15 11 11 17│
│13 20 18  8│
└───────────┘

H : 1 0 0 1D :1 0

Sonuç:

┌───────────┐
│15 26 37 17│
│28 59 88 25│
└───────────┘

M :

┌─┐
│7│
└─┘

Sonuç ( H ve V olmalıdır 1):

┌─┐
│7│
└─┘

M :

┌──┐
│ 3│
│-1│
│ 4│
└──┘

V : 1 1 0( H olmalı 1)

Sonuç:

┌──┐
│ 3│
│-1│
│ 3│
└──┘

M :

┌───────────────────────────────────────────────────────┐
│10    7.7 1.9 1.5 5.4  1.2 7.8 0.6 4.3 1.2  4.5 5.4 0.3│
│ 2.3  3.8 4.1 4.5 1    7.7 3   3.4 6.9 5.8  9.5 1.3 7.5│
│ 9.1  3.7 7.2 9.8 3.9 10   7.6 9.6 7.3 6.2  3.3 9.2 9.4│
│ 4.3  4.9 7.6 2   1.4  5.8 8.1 2.4 1.1 2.3  7.3 3.6 6  │
│ 9.3 10   5.8 9.6 5.7  8.1 2.1 3.9 4   1.3  6.3 3.1 9  │
│ 6.6  1.4 0.5 6.5 4.6  2.1 7.5 4.3 9   7.2  2.8 3.6 4.6│
│ 1.7  9.9 2.4 4.5 1.3  2.6 6.4 7.8 6.2 3.2 10   5.2 8.9│
│ 9.9  5.3 4.5 6.3 1.4  3.1 2.3 7.9 7.8 7.9  9.6 4   5.8│
└───────────────────────────────────────────────────────┘

H :1 0 0 1 0 1 1 1 0 1 1 1 0

V :1 0 0 0 0 1 0 0

Sonuç:

┌────────────────────────────────────────────────────────────────┐
│10   17.7 19.6  1.5  6.9  1.2  7.8  0.6  4.9  1.2  4.5  5.4  5.7│
│12.3 23.8 29.8  6   12.4  8.9 10.8  4   15.2  7   14    6.7 14.5│
│21.4 36.6 49.8 15.8 26.1 18.9 18.4 13.6 32.1 13.2 17.3 15.9 33.1│
│25.7 45.8 66.6 17.8 29.5 24.7 26.5 16   35.6 15.5 24.6 19.5 42.7│
│35   65.1 91.7 27.4 44.8 32.8 28.6 19.9 43.5 16.8 30.9 22.6 54.8│
│ 6.6  8    8.5  6.5 11.1  2.1  7.5  4.3 13.3  7.2  2.8  3.6  8.2│
│ 8.3 19.6 22.5 11   16.9  4.7 13.9 12.1 27.3 10.4 12.8  8.8 22.3│
│18.2 34.8 42.2 17.3 24.6  7.8 16.2 20   43   18.3 22.4 12.8 32.1│
└────────────────────────────────────────────────────────────────┘

Yanıtlar:


9

Jöle , 10 bayt

Zœṗ@+\€Ẏð/

Çevrimiçi deneyin! ve Son Test Durumu ( Gokunabilirlik için sonunda a ).

Giriş bir liste olarak alınır [M, H, V].

açıklama

Zœṗ@+\€Ẏð/  Input: [M, H, V]
        ð/  Insert the previous (f) as a dyadic link
            Forms f( f(M, H) , V)
            For f(x, y):
Z             Transpose x
 œṗ@          Partition the rows of x^T at each true in y
    +\€       Compute the cumulative sums in each partition
       Ẏ      Tighten (Joins all the lists at the next depth)

Sen gibi bir altbilgi kullanabilirsiniz bu size gerçek kodunda değişiklik yapmak zorunda kalmamak.
Outgolfer Erik

7

APL (Dyalog) , 13 bayt

İst Alır VHM argüman olarak.

{⍉⊃,/+\¨⍺⊂⍵}/

Çevrimiçi deneyin!

{}/ Soldaki terim ⍺, sağdaki terim ⍵ ile temsil edilen aşağıdaki anonim işlevi ekleyin (azaltın). Nedeniyle APL fonksiyonları sağ taraf olmak üzere, bu nedenle V f ( lH f M ).

⍺⊂⍵ bölüm ⍵ göre ⍺

+\¨ her bölümün toplamı

,/ birleştirme ile azalt (bu, sıralamayı azaltmak için sonucu kapsar)

 ifşa

 devrik


6

Piton 2 + numpy, 143 138 117 115 110 108 bayt

Adım sayesinde -21 bayt !

lambda M,*L:reduce(lambda m,l:vstack(map(lambda p:cumsum(p,0),split(m,*where(l)))).T,L,M)
from numpy import*

Çevrimiçi deneyin!


1
bölme, bölme ve cumsum bir kez isteyin, transpoze edin, tekrarlayın.
Adám

@ Adám Teşekkürler, bunu bir nedenden dolayı düşünmedim.
notjagan

Zaten iki fonksiyonun liste arama hoşuma gitti :)
Jonathan Allan

2
Lütfen başlık "Python 3 + numpy" yapın
Leaky Nun

5

Jöle ,  15  14 bayt

œṗ+\€Ẏ
ḢçЀZð⁺

H,VSolda ve Msağda bulunan ve sonuçtaki matrisi döndüren ikili bir bağlantı .

Çevrimiçi deneyin!

Alternatif olarak 14 için tek bir satır olarak: Ḣœṗ+\€Ẏ$¥Ð€Zð⁺

Nasıl?

œṗ+\€Ẏ - Link 1: partition and cumSum: list of partition bools, list of values
œṗ     - partition (the values) at truthy indexes (of the bools)
    €  - for €ach part:
  +\   -   cumulative reduce by addition
     Ẏ - tighten (flattens back into a list)

ḢçЀZð⁺ - Main link: list of lists, [H,V]; list of lists, M
      ⁺ - perform this twice:
     ð  - [it's a dyadic chain for the second pass, first pass is dyadic implicitly]
Ḣ       -   head, pop it & modify (so H the first time, V the second)
  Ѐ    -   map across right: (M the first time, the intermediate result the second)
 ç      -     the last link (1) as a dyad
    Z   -   transpose the result (do the rows first time, and the columns the second)

Önceki:

œṗ@+\€Ẏ
ç€Zç€⁵Z

Sonucu temsil eden bir program.


Önceki Jelly cevabından% -50!
Adám

Kim ne? Vay. Bunu nasıl yaptığını gerçekten incelemem gerek ... Benimkine kıyasla inanılmaz!
HyperNeutrino

Bu iki yönü ayrı ayrı yapıyor, değil mi? Akıllı.
HyperNeutrino

Sanırım kabaca aynı şeyi yapıyor ...
Jonathan Allan

İyi yöntem. Bunu APL ile yenebileceğim anlamına geliyor. 14 baytım var.
Adám

4

MATL , 19 bayt

,!ix"0GYs@12XQ!g]v!

Girişler M(matris), H(sütun vektörü), V(sütun vektörü) şeklindedir. Satır ayırıcı ;.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın: 1 , 2 , 3 , 4 , 5 .

açıklama

Bu, toplamı önce yatay, sonra dikey olarak yapar.

,          % Do the following twice
  !        %   First time this inputs M implicitly. Transpose. Second time
           %   it transposes the result of the horizontal cumulative sum
  ix       %   Input H (first time) or V (second time). Delete it; but gets
           %   copied into clipboard G
  "        %   For each column of the matrix
    0G     %     Push most recent input: H (first time) or V (second)
    Ys     %     Cumulative sum. This produces a vector of integer values
           %     such that all columns (first time) or rows (second) of M 
           %     with the same value in this vector should be cumulatively
           %     summed
    @      %     Push current column of M transposed (first time) or M after
           %     horizontal cumulative sum (second time)
    12XQ   %     Cumulative sum. Gives a cell array of row vectors
    !g     %     Join those vectors into one row vector
  ]        %   End
  v        %   Concatenate the row vectors vertically into a matrix
  !        %   Transpose. This corrects for the fact that each column vector
           %   of the matrix was cumulatively summed into a row vector
           % Implicit end. Implicit display

1
En etkileyici. Sanırım Matlab böyle şeyler için yapılmıştı.
Adám

@ Adám Eminim APL'nin uzunluğu çok farklı olmayacak :-)
Luis Mendo

Test senaryolarını oluşturmak için kullanılan referans uygulamam 26 bayt.
Adám

@ Adám Darn! APL Jelly'yi yeniyor mu? Bu kabul edilemez! (benim çözüm golf gerekir ... lol) xD
HyperNeutrino

@HyperNeutrino Jelly, APL ve J gibi hem rütbe hem de derinliğe sahip değil.
Adám

3

J , 20 bayt

;@(<@(+/\);.1|:)&.>/

Çevrimiçi deneyin!

Giriş, içeren bir kutu dizisi olarak alınır [V, H, M].

açıklama

;@(<@(+/\);.1|:)&.>/  Input: [V H M]
  (     g      )   /  Insert g and reduce (right-to-left)
                      Forms V g H g M = V g (H g M)
                & >     Unbox each
             |:         Transpose the right arg
          ;.1           Partition
      +/\               Reduce each prefix using addition (cumulative sum)
   <@                   Box each partition
;@                      Raze (Concatenate the contents in each box)
                &.>     Box the result

2

Mathematica, 212 bayt

(T=Transpose;A=AppendTo;J=Flatten;f[s_]:=Block[{},t=2;r=1;w={};While[t<=Length@s,If[s[[t]]==0,r++,w~A~r;r=1];t++];w~A~r];K[x_,y_]:=Accumulate/@#&/@(FoldPairList[TakeDrop,#,f@y]&/@x);d=J/@K[#,#2];T[J/@K[T@d,#3]])&


giriş
[M, H, V]

[{{15, 11, 11, 17}, {13, 20, 18, 8}}, {1, 0, 0, 1}, {1, 0}]


2

C # (.NET Core) , 164 bayt

(M,H,V)=>{int a=M.Length,b=M[0].Length,i,j;for(i=0;i<a;i++)for(j=0;j<b;j++)if(!H[j])M[i][j]+=M[i][j-1];for(i=0;i<a;i++)for(j=0;j<b;j++)if(!V[i])M[i][j]+=M[i-1][j];}

Çevrimiçi deneyin!

Temel olarak OP'de belirtildiği gibi yapar. Önce yatay olarak toplanır ve sonra tekrar dikey olarak toplanır.


2

Haskell , 129 bayt 119 bayt

s m v=tail$scanl(\a(x,s)->if s then x else zipWith(+)a x)[](zip m v)
t=foldr(zipWith(:))$repeat[]
f m h v=t$s(t$s m v)h

Çevrimiçi deneyin!

@Ceasedtoturncounterclockwis sayesinde 10 bayt kaydedildi

t(devrik için) satırları ve sütunları değiştirir. Kısa bir açıklama:

foldr(zipWith(:))(repeat[])(r1,...,rn) =
zipWith(:) r1 (zipWith(:) r2 (... zipWith(:) rn (repeat [])))

Sağdan sola okuyun: satırları aşağıdan yukarıya doğru okur ve hedef sütunundaki her değeri iteriz.

s temelde vektörlerin yuvarlanan bir toplamıdır, ancak bir True değeri ortaya çıktığında sıfırlanır v

fsaşağıdaki satırları toplar ve aşağıdaki vsütunlarla aynı işlemi yaparh


t=foldr(zipWith(:))(repeat[]). Sadece daha kısa değil, aynı zamanda daha az verimsiz.
counterclockwis çevirmek için durdu

@ceasedtoturncounterclockwis Tavsiye için teşekkür ederiz.
jferard

1

JavaScript (ES6), 88 bayt

(a,h,v)=>a.map(b=>b.map((e,i)=>t=h[i]?e:t+e)).map((b,j)=>t=v[j]?b:t.map((e,i)=>e+b[i]))

0

Jöle , 31 bayt

+\€€
œṗḊZ€⁵œṗ$€Ḋ€Ç€ÇZ€€Z€;/€€;/

Çevrimiçi deneyin!

Gah bu Jelly xD için çok uzun

BTW, bu programda 11/31 bayt euro karakterden oluşuyor. Bu programın üçte birinden fazlası!


Çok fazla Euro.
Adám

@ Adám Tam olarak düşüncelerim: P İki kat bölümlü matrislerle çalışmak düşündüğüm kadar eğlenceli değil, çünkü ikinci seviye ile üçüncü seviye haritalama yapıyorum xD
HyperNeutrino

Neden böyle paranızı boşa harcıyorsunuz € - €
V. Courtois
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.