Étant donné (par tout moyen):
- Une fonction de boîte noire à deux arguments (ou un seul argument composé d'une liste à deux éléments) , (l'entrée et la sortie sont 1, 2, 3,…)
f: ℤ+ × ℤ+ → ℤ+
- Une matrice entière strictement positive avec au moins deux lignes et deux colonnes
retourne la trace de fonction de la matrice .
Qu'est-ce qu'une trace de fonction ?
Une trace matricielle normale est la somme de la diagonale principale (en haut à gauche à en bas à droite) d'une matrice:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ 1+5+9
→15
Mais au lieu de résumer, nous voulons appliquer le f
long de la diagonale:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ f(f(1,5),9)
ouf(1,f(5,9))
Veuillez indiquer si vous utilisez de gauche à droite ou de droite à gauche.
La matrice donnée et toutes les valeurs intermédiaires seront des entiers strictement positifs dans le domaine entier de votre langue. La matrice peut être non carrée.
Exemples
f(x,y) = xy
, [[1,2,3],[4,5,6],[7,8,9]]
→ 1×5×9
→45
f(x,y) = xy
, [[1,2,3],[4,5,6],[7,8,9]]
→ →159
1
f(x,y) = x-y
, [[4,5,6],[1,2,3]]
→ 4-2
→2
f(x,y) = (x+y)⁄2
, [[2,3,4],[5,6,7],[8,9,10]]
→ 5
ou7
f(x,y) = x+2y
, [[1,2,3],[4,5,6],[7,8,9]]
→ 47
ou29
f(x,y) = max(x,y)
, [[1,2,3],[4,5,6],[7,8,9]]
→ max(1,5,9)
→9
f(x,y) = 2x
, [[1,2,3],[4,5,6],[7,8,9]]
→ 2
ou4
f(x,y) = lcm(x,y)
, [[2,2,2],[2,2,3],[2,3,3],[4,4,4]]
→ lcm(2,2,3)
→6
[[2,2,2],[2,2,3],[2,3,3],[4,4,4]]
?[2,2,3]
Réponses:
R ,
4030 octetsEssayez-le en ligne!
Vérifiez les cas de test.
Traverse la diagonale, donc de gauche à droite dans ce cas. Pour les opérateurs arithmétiques, vous pouvez utiliser des
"+"
barres obliques inverses autour des opérateurs (+,*,-,%/%,^,%%
)Assez simple:
Reduce
est l'équivalent de R à afold
, etla diagonale d'une matrice est les élémentsa_ij
oùi==j
, c'est-à-dire où les indicesrow
etcol
umn sont les mêmes.diag
a le comportement approprié pour les matrices non carrées.la source
Haskell , 39 octets
Merci @Laikoni de m'avoir aidé à corriger la solution précédemment invalide!
Associés à gauche, essayez-le en ligne! (remplacer
foldl1
parfoldr1
pour associatif à droite)la source
foldl1 f$zipWith(!!)m[0..]
?Mathematica , 16 octets
-1 octet merci à Martin Ender.
Essayez-le en ligne!
Solution alternative, 17 octets
Essayez-le en ligne!
la source
@*{}
syntaxe n'a pas beaucoup de sens (vous vouliez probablement dire@*List
), mais le fait qu'elle fonctionne de toute façon est plutôt cool. En fait, cela signifie que vous pouvez remplacer le{}
par un0
et enregistrer un octet.List
abord, mais j'ai essayé{}
juste pour le diable et j'ai été extrêmement surpris que cela fonctionne. C'est logique, mais comment ça0
marche? o0{}
. Vous utilisez actuellement{}
une fonction (ou en fait une "tête" en utilisant la terminologie Mathematica). Si vous utilisiez un génériquef
là-bas, vous obtiendriezf[1,2,3]
(si c'est la diagonale). Mais avec{}
vous obtenez{}[1,2,3]
. C'est une expression complètement dénuée de sens, mais les têtes peuvent être des expressions arbitraires elles-mêmes, et si Mathematica ne sait pas quoi en faire, il les laisse telles quelles. La plupart des fonctions de manipulation de liste de Mathematica fonctionnent réellement avec des expressions avec une tête arbitraire et dans le cas deFold
, la tête est simplement ignorée. [à confirmer]0
comme tête à la place, ce qui donne0[1,2,3]
ce qui n'a toujours pas de sens, mais fonctionne tout de même.Octave ,
615753 octetsEssayez-le en ligne!
Définit une fonction
g
qui prend un descripteur de fonctionf
et une matricem
. À la première itération,m(1)
renvoie l'élément de matrice en haut à gauche; après cela, il revient justem
.la source
Nettoyer , 56 octets
Essayez-le en ligne!Se plie de droite à gauche.
[t\\[_:t]<-r]
est le même quemap tl r
, mais n'a pas besoinimport StdEnv
.la source
StdEnv
Haskell ,
474542 octetsEssayez-le en ligne! Définit une fonction
(%)
qui prend une fonction et une matrice comme liste de listes en entrée.La fonction se plie de droite à gauche:
Edit: -2 octets grâce à BMO et -3 octets grâce à Zgarb !
la source
$
et en simplifiant le conditionnel avec*>
.*>
!APL (Dyalog Unicode) , 7 octets ( SBCS d'Adám )
Essayez-le en ligne!
-3 grâce à une suggestion de convertir cela en un programme complet par Adám .
De droite à gauche.
la source
Haskell , 44 octets
Essayez-le en ligne!
la source
ML standard (MLton) , 59 octets
Essayez-le en ligne! Se plie de droite à gauche.
Non golfé:
Essayez-le en ligne!
la source
Python 2 , 61 octets
Essayez-le en ligne!
Cela fonctionne de gauche à droite.
la source
(x+y)⁄2
etx+2y
JavaScript (ES6),
5856 octetsSe plie de gauche à droite. Edit: enregistré 2 octets en utilisant le fait que le tableau est strictement positif. Solution alternative, également 56 octets:
la source
1/
et vous pouvez enregistrer 2 autres octets en déplaçant des choses autour de :f=>a=>(h=r=>(e=a[++i]&&a[i][i])?h(f(r,e)):r)(a[i=0][0])
. TIOf,
) off the first version?f,
when callingg
again.JavaScript, 46 bytes
Thanks to @Shaggy, use bitwise or save one byte. That's magic.
Show code snippet
la source
Java 8,
888170 bytesFolds
[[1,2,3],[4,5,6],[7,8,9]]
tof(f(1,5),9)
.-7 bytes indirectly thanks to @KamilDrakari by using a similar trick as he did in his C# answer: instead of having a maximum boundary for the loop based on the rows/columns, simply try-catch the
ArrayIndexOutOfBoundsException
.-11 bytes replacing
catch(Exception e)
withfinally
.Try it online.
Old 88 bytes answer:
Try it online.
Explanation:
Black box input format:
Assumes a named function
int f(int x,int y)
is present, which is allowed according to this meta answer.I have an abstract class
Test
containing the default functionf(x,y)
, as well as the lambda above:For the test cases, I overwrite this function
f
. For example, the first test case is called like this:la source
Attache, 14 bytes
Try it online! Set to
f
and call asf[function, array]
.Explanation
This is a fork of two functions:
Fold
and/Diagonal
. This, for argumentsf
anda
, is equivalent to:/
, when applied monadically to a function, returns a function that is applied to its last argument. So, this is equivalent to:This folds the function
f
over the main diagonal ofa
.la source
AWK, 77 bytes
Try it online!
I was curious if
AWK
could do functional programming at all. I think this counts.The "Matrix" is defined as a standard associative array, with extra fields
M[1]=#rows
andM[2]=#columns
. The function name is passed in as a string which is evaluated via the@F(...)
syntax. Evaluation is performed left to right. Ther
parameter is a placeholder to prevent overwriting an existingr
variable and to avoid the need to reinitialize for each call. Typically extra space is added to designate such placeholders inAWK
, but this is code golf, so every byte counts. :)The TIO link implements all the test cases.
la source
05AB1E,
1510 bytesFolds from right-to-left
Saved 5 bytes using a new built-in as suggested by Kevin Cruijssen
Explanation
Works the same as the old version, except that
Å\
is a new built-in for pushing the main diagonal.Try it online! or as a Test Suite
Old Version
Try it online! or as a Test suite
Explanation
la source
¬g£vyNè}[
can beÅ\`[
now, saving 5 bytes.Husk, 7 bytes
Thanks @Zgarb for fixing my submission!
Associates to the left, Try it online! (for a right-associative version simply replace
Ḟ
byF
)Explanation
Unfortunately there's no easy way to get the diagonal of a matrix, so most the bytes are for that:
la source
SNOBOL4 (CSNOBOL4), 86 bytes
Try it online!
Defines a function
T
(forTRACE
) that takes anARRAY
and a stringF
that's the name of a function. Folds left-to-right.Using indirect reference (
$
) doesn't work with functions. So usingEVAL
and passing a string to the name seems to be the only way to get a black-box function in SNOBOL.Also, it's quite painful to define arrays; however, because invalid array references cause
FAILURE
, this works for non-square arrays -- ifI
is out-of-bounds in either dimension, theF(RETURN)
forces the function to return.Edit:
Possibly, based on this meta post, I may assume that the black-box function
F
is defined under the nameF
, which would drop this to 75 bytes (remove use ofEVAL
and,F
in the function definition). However, I prefer this version since it's closer to passing a reference to a function.la source
C, 76 bytes
Left-to-right.
Try it online!
la source
tinylisp, 79 bytes
The last line is an unnamed lambda function that takes a function and matrix and returns the matrix trace. The trace is left-associative (i.e.
f(f(1,5),9)
). Try it online!Ungolfed
We define a helper function to compute the diagonal; then
generalized-trace
is merely a small wrapper around the library functionfoldl
.When computing the diagonal recursively, we check whether
(head matrix)
is truthy. If the matrix is out of rows, it will be the empty list (nil), andhead
of nil is nil--falsey. Or, if the matrix is out of columns, its first row (head) will be the empty list (nil)--falsey. Otherwise, there will be a nonempty first row, which is truthy.So, if the first row doesn't exist or is empty, we return nil. Otherwise, if there is a nonempty first row, we take
(head (head matrix))
--the first element of the first row--andcons
(prepend) it to the result of the recursive call. The argument to the recursive call is(map tail (tail matrix))
--that is, take all rows but the first, and take all but the first element of each row.la source
Pari/GP, 42 bytes
Try it online!
la source
C# (Visual C# Compiler),
726960 bytesTry it online!
try/catch
allows the diagonal to be correctly reached by simply going along it and terminating when out of bounds.3 bytes saved because, as pointed out by Kevin Cruijssen, black-box functions can be assumed to exist under a specific name.
9 bytes saved by returning via modifying an argument.
Thus, the function is called by storing the desired function under the name
f
, callingtrace(matrix)
, and the result is stored inmatrix[0][0]
.Alternatively, if you really like verbosity,
C# (Visual C# Compiler),
97 + 13 = 1107869 bytesTry it online!
32 bytes saved by using a predefined function, because not taking the function as a parameter allowed removing the
System
import and the longFunc
generic type.la source
catch(Exception e)
instead ofcatch
. :) EDIT: Oh, been able to replace thecatch(Exception e)
withfinally
to save more bytes. Thanks again. +1 from me.finally
intocatch(Exception e)
, because I'm not returning inside the finally anymore. Som->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 bytes) is unfortunately longer for me in comparison to my current answerm->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}
(70 bytes) But indeed a nice way to save bytes in your answer! :) Too bad I can only +1 your answer once.JavaScript,
61575652504442 bytesReduces left to right. Assumes the function is assigned to variable
f
, as per this meta post brought to my attention by Mr. Xcoder & totallyhuman. Can't say as I agree with it as it directly contradicts our existing consensus that we may not assume input is assigned to a pre-defined variable, but I'll take the few bytes saving for now.Test Cases
la source
APL NARS, 20 bytes, 10 chars
test:
la source
Jelly, 5 bytes
Left-to-right.
Try it online!
Disclaimer: I do not know if this an acceptable input method for black-box functions. This assumes that the function is implemented in the link above, and is thus "named" (that is, it's callable with)
ç
, but otherwise I have no way to assign it toç
. If anyone has more experience with Jelly + black box functions, I would appreciate thoughts. After spending some time in chat, we figured that usingç
might indeed be valid.la source
Clojure, 30 bytes
Reduces "from the left".
la source
Ruby,
5553 bytesTry it online!
la source