Vous obtenez un tableau multidimensionnel d'entiers. Chaque dimension a une taille fixe (de sorte qu'elle serait toujours rectangulaire si elle est 2D). Votre programme doit calculer les sommes dans chaque dimension et les ajouter en tant que nouveaux derniers éléments de cette dimension.
Supposons que les tableaux d'entrée et de sortie sont A et B, et que la taille de la dimension i de A est n i . B aurait le même nombre de dimensions que A et la taille de la dimension i serait n i +1. B j 1 , j 2 , ..., j m est la somme de A k 1 , k 2 , ..., k m où:
- k i = j i si j i <= n i
- 0 <k i <= n i si j i = n i +1
Pour l'entrée:
[[1 2 3]
[4 5 6]]
Votre programme (ou fonction) devrait produire:
[[1 2 3 6]
[4 5 6 15]
[5 7 9 21]]
L'entrée contient uniquement le tableau. Le nombre total de dimensions et la taille de chaque dimension ne sont pas indiqués dans l'entrée. (Mais vous pouvez les obtenir à partir du tableau par votre propre code.) Vous pouvez utiliser n'importe quel format de liste pratique dans votre langue, tant qu'il ne spécifie pas directement le nombre de dimensions ou les tailles de dimension.
L'entrée a au moins 1 dimension et a au moins 1 élément dans le tableau.
C'est du code-golf. Le code le plus court gagne.
Cas de test
Input:
[5 2 3]
Output:
[5 2 3 10]
Input:
[[1 2 3] [4 5 6]]
Outputs:
[[1 2 3 6] [4 5 6 15] [5 7 9 21]]
Input:
[[[1] [1] [1] [0]]]
Output:
[[[1 1] [1 1] [1 1] [0 0] [3 3]] [[1 1] [1 1] [1 1] [0 0] [3 3]]]
Input:
[[[[-1]]]]
Output:
[[[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]] [[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]]]
la source
Réponses:
J, 14 octets
Usage:
La fonction est équivalente à la suivante
(0|:],+/)^:(#@$)
mais utilise un adverbe défini par l'utilisateur pour enregistrer les parens.Explication de ce dernier code de droite à gauche:
^:(#@$)
répéter^:
pour le nombre#
de dimensions$
:],+/
concaténer,
l'argument]
avec la somme de celui-ci sur la dernière dimension+/
0|:
faire pivoter les dimensions|:
en plaçant la première0
à la fin de la liste de dimensionsAprès avoir effectué la procédure ci-dessus, nous récupérons l'entrée d'origine avec des sommes sur toutes les dimensions.
Pour mon ancienne solution, consultez l'historique des révisions.
Essayez-le en ligne ici.
la source
Mathematica,
3220 octetsExemple:
Explication:
La forme complète de
{{1, 2, 3}, {4, 5, 6}}
estList[List[1, 2, 3], List[4, 5, 6]]
. Remplacez ensuite tous lesList
s de l'expression par la fonction({##,+##}&)
.la source
Python 2, 95 octets
Cela itère sur chaque dimension, concaténant ses sommes à l'aide de NumPy.
Je suis tombé sur NumPy's
r_
, ce qui est assez génial pour le golf.r_[:n]
est plus courtrange(n)
et beaucoup plus puissant (par exempler_[:4, 7, 8, 10:100:10]
). Il peut également faire d'autres choses comme la concaténation le long d'un axe arbitraire.Exemple d'utilisation:
la source
APL,
1615 octetsMerci à @ user23013 d'avoir joué sur 3 octets et d'avoir trouvé le bon format d'entrée.
Vérifiez les cas de test en ligne avec TryAPL .
Idée
L'idée générale est la même que dans mon mémoire CJam, pour lequel APL permet une mise en œuvre beaucoup plus courte. Il ne comprend que deux étapes:
Additionnez le tableau sur sa dimension la plus à l'extérieur.
Répétez l'étape 1 pour chaque sous-réseau.
Code
la source
,⊂(,1)(,1)(,1)(,0)
et,⊂,⊂,⊂,¯1
respectivement. Vous pouvez donc supprimer un autre personnage.Pip ,
1815 octetsIl s'agit d'une fonction anonyme, qui prend le tableau en argument et renvoie le résultat. Exemple d'appel, en utilisant l'
-p
indicateur pour obtenir une sortie lisible:L'idée est fondamentalement la même que l'APL de Dennis , bien que dérivée indépendamment. Plus précisement:
Cette méthode fonctionne parce que
+
(avec de nombreux autres opérateurs) fonctionne par élément sur les listes dans Pip - une fonctionnalité inspirée des langages de programmation de tableaux comme APL. Ainsi, lorsque vous$+
une liste comme[[1 2 3] [4 5 6]]
, le résultat est[5 7 9]
comme vous le souhaitez. Également utilisé dans le test de liste ou scalaire:[1 2 3] - [1 2 3]
donne[0 0 0]
, qui est véridique (comme toutes les listes sauf la liste vide).Version précédente de 18 octets:
Changements:
[1 2 3] != 123
);M
une priorité inférieure à?
(bien que je vais probablement changer cela, surtout maintenant): sans eux, le code serait analysé comme(Ja=a?af)M(aAE$+a)
, conduisant à des messages d'erreur bizarres. Cependant, l'argument du milieu d'un opérateur ternaire peut être n'importe quelle expression de n'importe quelle priorité, sans parenthèses nécessaires. Donc, en faisant de la liste le cas vrai, je peux enregistrer ces deux octets.la source
APL (25)
Les tableaux d'APL ont des dimensions intégrées, c'est donc une fonction qui prend un tableau à n dimensions, puis additionne le long de chaque dimension.
Explication:
N←⍵
: stocker le tableau dansN
.⍴⍴N
: obtenez le nombre de dimensionsN
a. (⍴
donne les dimensions, c'est-à-dire⍴↑(1 2 3)(4 5 6)
donne2 3
, donc⍴⍴
donne les dimensions des dimensions.){
...}¨⍳
: pour chaque nombre de 1 à⍴⍴N
:+/[⍵]N
: somme leN
long de la dimension⍵
N,[⍵]←
: joindre le résultat àN
dans cette dimensionN
: enfin, revenezN
.la source
↑(1 2 3)(4 5 6)
fait est simplement de construire un tableau à 2 dimensions à partir de 2 à 1 dimensions en utilisant↑
. Ce n'est pas une notation intégrée et elle ne généralise pas la façon dont vous pourriez penser. La manière canonique de construire les 3e et 4e tableaux serait1 4 1⍴1 1 1 0
et1 1 1 1⍴¯1
, mais il est également possible de les construire sans se référer aux tailles, par exemple, le troisième tableau peut également être construit avec↑⍉⍪(,1)(,1)(,1)(,0)
, le quatrième peut être construit avec↑⍪⊂⍪¯1
.f←{0=≡⍵:⍵⋄f¨⍵,+/⍵}⋄f((1 2)(3 4))((5 6)(7 8))
), mais il semble que les vecteurs et les tableaux imbriqués sont différents et que le premier ne différencie pas les scalaires des singletons ...{×≡⍵:∇¨⍵,+/⍵⋄⍵}((1 2)(3 4))((5 6)(7 8))
. Correction:{×⍴⍴⍵:∇↓⍵,+/⍵⋄⍵}1 4 1⍴1 1 1 0
. C'est plus court que Mathematica maintenant ...CJam, 36 octets
Il s'agit d'une fonction nommée récursive qui extrait un tableau de la pile et en laisse un en retour.
Essayez les cas de test dans l' interpréteur CJam .
Idée
Malheureusement, CJam n'a pas d'opérateur automagique qui permet d'ajouter des tableaux imbriqués arbitrairement, nous devons donc l'implémenter nous-mêmes. Heureusement, cela fait que deux opérateurs infixes,
:
(réduire) et.
(vectoriser), qui s'avéreront utiles pour cette tâche.La première étape consiste à calculer le nombre de dimensions. C'est simple: convertissez le tableau en sa représentation sous forme de chaîne et comptez le nombre de [ .
Maintenant, pour réduire un tableau d'une dimension, vous exécutez généralement simplement
:+
:Pour un tableau à deux dimensions,
+
effectuerait la concaténation au lieu de l'addition, nous devons donc le vectoriser:Maintenant, pour un tableau de trois dimensions,
.+
fonctionnerait sur des tableaux de deux dimensions et effectuerait, encore une fois, la concaténation. Cette fois, nous devons vectoriser.+
:Pour le cas général, un tableau de dimension D , nous devons enchaîner un
:
, D - 1.
et un+
.Bien sûr, cela ne résume le tableau que dans sa dimension la plus éloignée. On peut résoudre cela en définissant une fonction S qui calcule la dimension (et ne fait rien si elle est nulle), effectue la somme comme indiqué ci-dessus et, enfin, s'applique aux éléments du tableau.
Code
la source
Rubis (
181139119 119108 octets)Suppose que l'entrée est passée en JSON.
la source
d
dans cette réponse.Java, 669 octets
ne va pas mentir, je suis assez fier de moi pour celui-ci: p
élargi avec des tests:
l'exécution de la version de test étendue imprime ceci:
la source