Prenez une matrice d'entiers positifs comme entrée et sortez les sommes individuelles des éléments sur les lignes diagonales à travers la matrice.
Vous ne devez compter que les lignes qui descendent en diagonale et vers la droite. Vous devez commencer par la diagonale qui ne contient que l'élément en bas à gauche, puis la diagonale de longueur deux au-dessus (si elle existe) et ainsi de suite jusqu'à la diagonale qui ne contient que l'élément en haut à droite, comme illustré ci-dessous.
Exemple:
Input:
8 14 5 1
10 5 5 8
6 6 8 10
15 15 4 11
Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})
Input:
1
Output:
1
Input:
1 5
Output:
1, 5
Input:
4
1
Output:
1, 4
Input:
17 4 5
24 16 5
9 24 10
1 14 22
1 21 24
4 4 17
24 25 17
Output:
24, 29, 22, 39, 47, 70, 43, 9, 5
Les formats d'entrée et de sortie sont facultatifs comme toujours.
Il s'agit de code-golf , donc la soumission la plus courte dans chaque langue l'emporte.
Réponses:
Haskell ,
4037 octetsEssayez-le en ligne! Utilisation:
(foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]]
.Edit: Merci à Ørjan Johansen pour -3 octets!
Non golfé:
z
est une liste d'une infinité de zéros. Dansf
nous replions la liste des listesm
en combinant deux listes avec la fonction#
. Dans#
la première listes
contient les sommes de colonne accumulées jusqu'à présent et la deuxième listet
est la nouvelle ligne qui doit être ajoutée. Nous décalonss
un élément vers la droite en ajoutant un zéro à l'avant et ajoutonss
ett
avec élémentzipWith(+)
. Parce que celas
peut être arbitrairement grand, nous devons ajoutert
suffisamment de zéros en ajoutantz
.la source
foldl1$(.(++z)).zipWith(+).(0:)
.Mathematica,
5354 octetsFonction pure prenant un tableau 2D en entrée et renvoyant une liste. (Les entrées ne doivent pas nécessairement être des nombres entiers ou pairs.)
Diagonal[#,k]
Renvoie lak
e diagonale au-dessus (ou en dessous, si ellek
est négative) de la diagonale principale.{k,-l@#,l@#&@@#}
calcule la plage de diagonales nécessaire en fonction des dimensions du tableau d'entrée. EtTr
additionne les entrées de chaque diagonale.la source
Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
MATL , 6 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
s==sum(x(:))
, au lieu de s'en tenir à la convention MATLAB, comme MATL semble le faire?sum(x)
etsum(x,1)
. Pour une matricex
, le fait desum(x)
se comporter différemment si la matrice a 1 ligne est parfois gênant. Mais à la fin j'ai décidé d'aller avec Matlab, donc les deux langues sont plus proches; et ajouter quelquesfun(x,1)
fonctions pour les cas les plus courantsGelée , 5 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
ŒD
?ŒD
la commande bizarre l'a empêché d'être utile.JavaScript (ES6),
6558 octetsla source
a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
CJam ,
2221 octets1 octet enregistré grâce à Martin Ender
Bloc anonyme attend l'argument sur la pile et laisse le résultat sur la pile.
Essayez-le en ligne!
Comment ça fonctionne
la source
05AB1E , 17 octets
Essayez-le en ligne!
Explication
la source
J , 7 octets
Essayez-le en ligne!
C'est assez simple:
Les lignes inversées obliques sont les diagonales du tableau, donc cela ne fait que sommer les diagonales.
la source
Python 2 , 62 octets
Essayez-le en ligne!
la source
Gelée , 8 octets
Essayez-le en ligne!
La moitié du code est utilisée pour mettre les résultats dans le bon ordre.
Comment?
la source
Perl 5, 47 octets
la source
R, 45 octets
Fonction sans nom prenant un objet de classe matricielle en entrée:
En utilisant l'idée expliquée dans cette réponse.
la source
unname
, mais c'est une solution géniale malgré tout!Octave, 71 octets
En supposant que A est une matrice, par exemple:
Ensuite nous avons:
Notez que la transposition de la matrice inverse l'ordre des sommes diagonales, ce qui a économisé globalement deux octets dans la boucle for.
Production:
la source
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),end
enregistre 6 octets. Octave peut effectuer des indexations directes et des affectations en ligne. Malheureusement, supposer qu'une variable existe dans l'espace de travail avant d'exécuter le code n'est pas autorisé, donc je pense que vous devez utiliserinput
, comme cela, le ramener à 75 octets. Belle approche cependant, alors +1 de ma part :) Et bienvenue chez PPCG! =)zeros(m-1,m)
peut être écrit~e(m-1,m)
, économisant 4 octets :) Neat hein?Python, 126 octets
f
ne fonctionne que sur la section triangulaire inférieure, donc je la transpose et j'obtiens la section triangulaire supérieure de cette façon. Je ne sais pas pourquoi laf
fonction ne fonctionne pas pour les valeurs négatives (j'ai changéf
pour être plus courte car la partie pour obtenir les négatifs n'a pas fonctionné).la source
C, 148 octets
Essayez en ligne
la source
PHP, 81 octets
Prendre l'entrée comme tableau 2 D
Essayez-le en ligne!
la source
Awk, 67 octets
Non golfé:
Awk se divise en espace blanc
$n
est len
champ e (indexé 1);NF
est le nombre de champs sur la ligne,NR
est le numéro de la ligne actuelle. Les variables non définies sont 0 et créées lors de la première utilisation.la source
PHP, 86 octets
une solution respectueuse de la mémoire en deux variantes:
prend l'entrée des paramètres de script, utilise le soulignement comme délimiteur;
utiliser les paramètres par défaut (pas php.ini par défaut) ou les essayer en ligne
la source
Clojure, 81 octets
Assez verbeux, car il remplit les listes avec des zéros afin que nous puissions simplement calculer la somme par colonne.
la source
mathématique 73 octets
Celui-ci fonctionne pour N'IMPORTE QUEL mxn de tableau 2D (pas seulement nxn)
entrez le tableau à la fin du code comme ceci (le dernier cas de test)
saisie sous la forme [{a, b, c, d ...}, {m, n}]
la source