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 6che ha dimensioni
2lungo la prima dimensione (verticale) e3lungo 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×2e3×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×2e3×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×2e3×1darebbe un errore, perché le dimensioni lungo la prima dimensione sono2e3: 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× 2e 3× 1come 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× be c× ddanno 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])