Questa sfida è legata ad alcune delle funzionalità del linguaggio MATL, nell'ambito dell'evento Lingua del mese di maggio 2018 .
introduzione
In MATL, molte funzioni a due input funzionano in modo elementare con la trasmissione . Ciò significa quanto segue:
Per quanto riguarda gli elementi (o vettorializzati ): la funzione accetta come input due array con dimensioni corrispondenti. L'operazione definita dalla funzione viene applicata a ciascuna coppia di voci corrispondenti. Ad esempio, usando la notazione post-correzione:
[2 4 6] [10 20 30] +
dà il risultato
[12 24 36]
Questo funziona anche con array multidimensionali. La notazione
[1 2 3; 4 5 6]
rappresenta la matrice2
×3
(matrice)1 2 3 4 5 6
che ha dimensioni
2
lungo la prima dimensione (verticale) e3
lungo la seconda (orizzontale). Quindi per esempio[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
Trasmissione o ( espansione singleton ): i due array di input non hanno dimensioni corrispondenti, ma in ciascuna dimensione non corrispondente uno degli array ha dimensione
1
. Questo array viene replicato implicitamente lungo le altre dimensioni per far corrispondere le dimensioni; e quindi l'operazione viene applicata come elemento sopra. Ad esempio, considerare due array di input con dimensioni1
×2
e3
×1
:[10 20] [1; 2; 5] /
Grazie alla trasmissione, questo equivale a
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
e così dà
[10 20; 5 10; 2 4]
Allo stesso modo, con le dimensioni
3
×2
e3
×1
(la trasmissione ora agisce solo lungo la seconda dimensione),[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
Il numero di dimensioni può anche essere diverso. Ad esempio, gli ingressi con dimensioni 3 × 2 e 3 × 1 × 5 sono compatibili e danno un risultato 3 × 2 × 5. In effetti, la dimensione 3 × 2 è la stessa di 3 × 2 × 1 (ci sono arbitrariamente molte dimensioni singleton finali implicite).
D'altra parte, una coppia di matrici
2
×2
e3
×1
darebbe un errore, perché le dimensioni lungo la prima dimensione sono2
e3
: non sono uguali e nessuna di esse lo è1
.
Definizione di broadcasting modulare
La trasmissione modulare è una generalizzazione della trasmissione che funziona anche se nessuna delle dimensioni non corrispondenti lo sono 1
. Consideriamo ad esempio i seguenti array 2
× 2
e 3
× 1
come input della funzione +
:
[2 4; 6 8] [10; 20; 30] +
La regola è la seguente: per ogni dimensione, l'array più piccolo lungo quella dimensione viene replicato in modo modulare (ciclicamente) per corrispondere alla dimensione dell'altro array. Ciò renderebbe quanto sopra equivalente
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
con il risultato
[12 14; 26 28; 32 34]
Come secondo esempio,
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
produrrebbe
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
In generale, gli input con dimensioni a
× b
e c
× d
danno un risultato di dimensione max(a,b)
× max(c,d)
.
La sfida
Implementare l' aggiunta per array bidimensionali con broadcasting modulare come definito sopra.
Le matrici saranno rettangolari (non irregolari), conterranno solo numeri interi non negativi e avranno dimensioni almeno1
in ogni dimensione.
Regole Adizionali:
Input e output possono essere presi con qualsiasi mezzo ragionevole . Il loro formato è flessibile come al solito.
Programmi o funzioni sono consentiti, in qualsiasi linguaggio di programmazione . Sono vietate le scappatoie standard .
Vince il codice più breve in byte.
Casi test
Quanto segue utilizza ;
come separatore di righe (come negli esempi sopra). Ogni test case mostra i due ingressi e quindi l'uscita.
[2 4; 6 8]
[10; 20; 30]
[12 14; 26 28; 32 34]
[5 10; 15 20]
[0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0]
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
[1]
[2]
[3]
[1; 2]
[10]
[11; 12]
[1 2 3 4 5]
[10 20 30]
[11 22 33 14 25]
[9 12 5; 5 4 2]
[4 2; 7 3; 15 6; 4 0; 3 3]
[13 14 9;12 7 9;24 18 20;9 4 6;12 15 8]
[9 12 5; 5 4 2]
[4 2 6 7; 7 3 7 3; 15 6 0 1; 4 0 1 16; 3 3 3 8]
[13 14 11 16; 12 7 9 8; 24 18 5 10; 9 4 3 21; 12 15 8 17]
[6 7 9]
[4 2 5]
[10 9 14]
1
× n
(come [1 2 3]
) o n
× 1
(come [1; 2; 3]
)