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]
la source
1
×n
(comme[1 2 3]
) oun
×1
(comme[1; 2; 3]
)Réponses:
Gelée , 10 octets
Prend une paire de matrices (deux tableaux de lignes) en entrée et renvoie une matrice.
Essayez-le en ligne!
Comment ça marche
la source
Fusain ,
2523 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Prend l'entrée comme un tableau à trois dimensions. Explication:
Saisissez tout.la source
MATL ,
2524 octetsEssayez-le en ligne!
Finalement! Il n'a fallu qu'une semaine pour que le défi inspiré de la langue du mois soit relevé par la langue du mois!
Je suppose que ce n'est pas aussi court que possible, mais je suis assez content car ma version initiale était supérieure à 40 octets. edit: j'avais raison, Luis a trouvé un autre octet à extraire!
la source
:
entrée vectoriellePython 3 ,
127126125 octetsjoué un octet en changeant
sum(m)
enm+n
Un octet de plus grâce à @Jonathan Frech
Prend l'entrée comme une liste de deux tableaux bidimensionnels.
Z
lambda prend deux tableaux en entrée et renvoie un itérateur produisant un index et des valeurs fusionnées à partir des deux tableaux, jusqu'à ce que l'index atteigne la plus grande longueur du tableau. La variable d'index ne m'est pas utile et me coûte des octets, mais je ne sais pas comment m'en passer ... ( lié )Z
les tableaux externes et internes. Les valeurs les plus intérieures sont additionnées.Essayez-le en ligne!
L'utilisation
itertools.cycle
ressemble un peu à de la triche, mais je pense que j'ai été suffisamment puni par la longueur de la déclaration d'importation :)Je suis sûr que cela pourrait être joué un peu plus, en particulier la méthode d'itération qui laisse ces variables inutiles
i
etj
. Je serais reconnaissant de tous les conseils sur la façon de jouer au golf, je manque probablement quelque chose d'évident.la source
zip
arguments, inverserf
le devoir de compréhension et ainsi supprimer un espace (for i,*l
->for*l,i
)? ( 125 octets )?JavaScript (ES6), 131 octets
Pas le bon outil pour le travail, et probablement pas la bonne approche non plus. Eh bien ... ¯ \ _ (ツ) _ / ¯
Essayez-le en ligne!
Comment?
La fonction d'assistance g () crée un tableau qui est aussi grand que le plus grand tableau d'entrée ( a ou b ) et appelle la fonction de rappel c par-dessus:
La fonction d'assistance h () lit le tableau 2D a en (x, y) avec une diffusion modulaire:
Le code principal se lit maintenant simplement comme suit:
Version récursive, 134 octets
Essayez-le en ligne!
la source
05AB1E , 15 octets
Essayez-le en ligne!
Ancienne version, 25 octets
Essayez-le en ligne!
Explication
15 octets:
25 octets:
la source
R ,
136 104 103 103 9593 octetsGolfé sur un énorme
3335 octets suivant les conseils de Giuseppe. Géré pour obtenir moins de 100 octets en utilisant un opérateur comme nom de fonction. Voir l'historique pour un code plus lisible.Essayez-le en ligne!
la source
apply
etrep.len
c'est ce que j'avais envisagé, même si je n'avais pas réussi à le coder moi-même.dim
, beaucoup plus propre et ouvre la porte à une généralisation multidimensionnelle avec des appels récursifs àr
outer(x,y,"+")
ce qui contient toutes les bonnes sommes et de façon claire. Je ne sais pas comment les extraire efficacement.K (ngn / k) , 23 octets
Essayez-le en ligne!
la source
05AB1E , 18 octets
Essayez-le en ligne!
Explication
la source
Pyth, 24 octets
Essayez-le ici
Explication
la source
Java 8, 172 octets
Essayez-le en ligne.
Explication:
la source
APL (Dyalog Classic) ,
2321 octetsEssayez-le en ligne!
cela pourrait être la seule fois où j'aurais la chance d'utiliser
|[0]
la source
Python 2 ,
124116 octetsEssayez-le en ligne!
Explication:
Prend la liste de deux listes 2D comme entrée.
la source
Python 2 ,
10197105 octetsEdit: Merci (encore!) À Dead Possum pour avoir sauvé 4 octets
Edit 2: perdu 8 octets, certains cas de test ne passaient pas
Un mélange entre la solution antérieure de Dead Possum (grâce à lui!), Et ma propre solution Python 3 .
Essayez-le en ligne!
Même entrée que ma solution Python 3 (une paire de listes bidimensionnelles).
Code commenté:
la source
Julia 0,6 ,
8583 octetsEssayez-le en ligne!
(Remplacez
⧻
par\
merci à Jo King )Fonctionne en répétant chaque matrice horizontalement et verticalement afin qu'elles aient toutes les deux la même taille (produit des tailles de ligne x produit des tailles de colonne), en les additionnant et en extrayant la région correcte à partir de cela. (Les entrées de vecteur de ligne ou les entrées de vecteur de colonne ont besoin d'un
reshape
appel pour être converties en tableaux bidimensionnels, ce qui, je suppose, est correct car la question spécifie «Implémenter l'ajout pour les tableaux bidimensionnels» et «L'entrée et la sortie peuvent être prises par n'importe quel moyens raisonnables. Leur format est flexible comme d'habitude. ")la source