Ce défi est lié à certaines des fonctionnalités du langage MATL, dans le cadre de l' événement Langue du mois de mai 2018 .
introduction
Dans MATL, de nombreuses fonctions à deux entrées fonctionnent par éléments avec la diffusion . Cela signifie ce qui suit:
Par élément (ou vectorisé ): la fonction prend en entrée deux tableaux de tailles correspondantes. L'opération définie par la fonction est appliquée à chaque paire d'entrées correspondantes. Par exemple, en utilisant la notation post-fix:
[2 4 6] [10 20 30] +
donne la sortie
[12 24 36]
Cela fonctionne également avec les tableaux multidimensionnels. La notation
[1 2 3; 4 5 6]
représente le tableau2
×3
(matrice)1 2 3 4 5 6
qui a une taille le
2
long de la première dimension (verticale) et le3
long de la seconde (horizontale). Donc par exemple[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
Diffusion ou ( expansion singleton ): les deux tableaux d'entrée n'ont pas de tailles correspondantes, mais dans chaque dimension non correspondante, l'un des tableaux a une taille
1
. Ce tableau est implicitement répliqué le long des autres dimensions pour faire correspondre les tailles; puis l'opération est appliquée élément par élément comme ci-dessus. Par exemple, considérons deux tableaux d'entrée de tailles1
×2
et3
×1
:[10 20] [1; 2; 5] /
Grâce à la diffusion, cela équivaut à
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
et donc ça donne
[10 20; 5 10; 2 4]
De même, avec les tailles
3
×2
et3
×1
(la diffusion n'agit désormais que sur la deuxième dimension),[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
Le nombre de dimensions peut même être différent. Par exemple, les entrées de tailles 3 × 2 et 3 × 1 × 5 sont compatibles et donnent un résultat 3 × 2 × 5. En fait, la taille 3 × 2 est identique à 3 × 2 × 1 (il existe arbitrairement de nombreuses dimensions singleton de fin implicites).
D'un autre côté, une paire de tableaux
2
×2
et3
×1
donnerait une erreur, car les tailles le long de la première dimension sont2
et3
: elles ne sont pas égales et aucune ne l'est1
.
Définition de la radiodiffusion modulaire
La diffusion modulaire est une généralisation de la diffusion qui fonctionne même si aucune des tailles qui ne correspondent pas 1
. Considérez par exemple les tableaux 2
× 2
et 3
× suivants 1
comme entrées de la fonction +
:
[2 4; 6 8] [10; 20; 30] +
La règle est la suivante: pour chaque dimension, le tableau qui est plus petit le long de cette dimension est répliqué de façon modulaire (cyclique) pour correspondre à la taille de l'autre tableau. Cela rendrait l'équivalent ci-dessus
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
Avec le résultat
[12 14; 26 28; 32 34]
Comme deuxième exemple,
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
produirait
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
En général, les entrées de tailles a
× b
et c
× d
donnent un résultat de taille max(a,b)
× max(c,d)
.
Le défi
Implémenter un ajout pour les tableaux bidimensionnels avec diffusion modulaire comme défini ci-dessus.
Les tableaux seront rectangulaires (non irréguliers), ne contiendront que des entiers non négatifs et auront une taille au moins1
dans chaque dimension.
Règles supplémentaires:
L'entrée et la sortie peuvent être prises par tout moyen raisonnable . Leur format est flexible comme d'habitude.
Les programmes ou fonctions sont autorisés, dans n'importe quel langage de programmation . Les failles standard sont interdites .
Le code le plus court en octets gagne.
Cas de test
Les utilisations suivantes ;
comme séparateur de lignes (comme dans les exemples ci-dessus). Chaque scénario de test montre les deux entrées puis la sortie.
[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
(comme [1 2 3]
) ou n
× 1
(comme [1; 2; 3]
)