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 6qui a une taille le
2long de la première dimension (verticale) et le3long 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×2et3×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×2et3×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×2et3×1donnerait une erreur, car les tailles le long de la première dimension sont2et3: 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× 2et 3× suivants 1comme 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× bet c× ddonnent 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])