Biorąc pod uwagę (w jakikolwiek sposób):
- Dwu-argument (lub pojedyncza argumentu składającego się z listy dwuelementowej) funkcja czarna skrzynka , (wejście i wyjście są 1, 2, 3, ...)
f: ℤ+ × ℤ+ → ℤ+
- Ściśle dodatnia macierz liczb całkowitych z co najmniej dwoma wierszami i dwiema kolumnami
zwraca ślad funkcji macierzy .
Co to jest ślad funkcji ?
Normalny ślad macierzy jest sumą głównej przekątnej (od lewej górnej do prawej dolnej) macierzy:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ 1+5+9
→15
Ale zamiast sumowania, chcemy zastosować f
wzdłuż przekątnej:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ f(f(1,5),9)
lubf(1,f(5,9))
Podaj, czy używasz od lewej do prawej, czy od prawej do lewej.
Podana macierz i wszystkie wartości pośrednie będą ściśle dodatnimi liczbami całkowitymi w domenie liczb całkowitych twojego języka. Matryca może być niekwadratowa.
Przykłady
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
lub7
f(x,y) = x+2y
, [[1,2,3],[4,5,6],[7,8,9]]
→ 47
lub29
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
lub4
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]
Odpowiedzi:
R ,
4030 bajtówWypróbuj online!
Sprawdź przypadki testowe.
Przechodzi po przekątnej, więc w tym przypadku od lewej do prawej. W przypadku operatorów arytmetycznych możesz używać
"+"
lub wstawiać wokół operatorów (+,*,-,%/%,^,%%
)Całkiem proste:
Reduce
R jest równoważne afold
, aprzekątna macierzy to te elementy, wa_ij
którychi==j
, tj. Gdzie wskaźnikirow
icol
umn są takie same.diag
ma odpowiednie zachowanie dla macierzy niekwadratowych.źródło
Haskell , 39 bajtów
Dzięki @Laikoni za pomoc w naprawieniu wcześniej nieprawidłowego rozwiązania!
Współpracownicy po lewej, spróbuj online! (zamień
foldl1
nafoldr1
na prawo-asocjacyjne)źródło
foldl1 f$zipWith(!!)m[0..]
?Mathematica , 16 bajtów
-1 bajt dzięki Martin Ender.
Wypróbuj online!
Alternatywne rozwiązanie, 17 bajtów
Wypróbuj online!
źródło
@*{}
składnia nie ma większego sensu (prawdopodobnie miałeś na myśli@*List
), ale fakt, że i tak działa, jest całkiem fajny. W rzeczywistości oznacza to, że możesz zamienić na{}
a0
i zapisać bajt.List
pierwszy, ale próbowałem{}
tylko do cholery i byłem bardzo zaskoczony, że zadziałało. Ma sens, ale jak0
działa? o0{}
. Obecnie używasz{}
jako funkcji (a właściwie jako „głowy” używając terminologii Mathematica). Jeśli użyjeszf
tam generycznego , dostanieszf[1,2,3]
(jeśli to przekątna). Ale z{}
tobą dostaniesz{}[1,2,3]
. To całkowicie pozbawione znaczenia wyrażenie, ale głowy mogą same być dowolnymi wyrażeniami, a jeśli Mathematica nie wie, co z nimi zrobić, pozostawia je takimi, jakie są. Większość funkcji manipulowania listami Mathematiki faktycznie działa z wyrażeniami z dowolną głową, aw przypadkuFold
głowy jest ona po prostu ignorowana. [do potwierdzenia]0
zamiast głowy, co daje0[1,2,3]
to, co jest nadal bez znaczenia, ale działa tak samo.Oktawa ,
615753 bajtówWypróbuj online!
Definiuje funkcję,
g
która przyjmuje uchwyt funkcjif
i macierzm
. Przy pierwszej iteracjim(1)
zwraca lewy górny element macierzy; potem po prostu wracam
.źródło
Czysty , 56 bajtów
Wypróbuj online! Składa się od prawej do lewej.
[t\\[_:t]<-r]
jest taki sam jakmap tl r
, ale nie potrzebujeimport StdEnv
.źródło
StdEnv
Haskell ,
474542 bajtówWypróbuj online! Definiuje funkcję,
(%)
która przyjmuje funkcję i macierz jako listę list jako dane wejściowe.Funkcja składa się od prawej do lewej:
Edycja: -2 bajty dzięki BMO i -3 bajty dzięki Zgarb !
źródło
$
i upraszczając warunkowe za pomocą*>
.*>
!APL (Dyalog Unicode) , 7 bajtów ( Adám's SBCS )
Wypróbuj online!
-3 dzięki sugestii, aby przekonwertować to na pełny program Adám .
Od prawej do lewej.
źródło
Haskell , 44 bajty
Wypróbuj online!
źródło
Standardowy ML (MLton) , 59 bajtów
Wypróbuj online! Składa się od prawej do lewej.
Nie golfowany:
Wypróbuj online!
źródło
Python 2 , 61 bajtów
Wypróbuj online!
Działa od lewej do prawej.
źródło
(x+y)⁄2
ix+2y
przykładyJavaScript (ES6),
5856 bajtówSkłada się od lewej do prawej. Edycja: Zapisano 2 bajty, wykorzystując fakt, że tablica jest ściśle dodatnia. Alternatywne rozwiązanie, również 56 bajtów:
źródło
1/
i można zaoszczędzić kolejne 2 bajty przesuwając niektóre rzeczy wokół:f=>a=>(h=r=>(e=a[++i]&&a[i][i])?h(f(r,e)):r)(a[i=0][0])
. TIOf,
) na pierwszej wersji?f,
kiedy dzwonięg
ponownie.JavaScript, 46 bajtów
Dzięki @Shaggy używaj bitów lub oszczędzaj jeden bajt. To magia.
Pokaż fragment kodu
źródło
Java 8,
888170 bajtówSkłada się
[[1,2,3],[4,5,6],[7,8,9]]
naf(f(1,5),9)
.-7 bajtów pośrednio dzięki @KamilDrakari przy użyciu podobnej sztuczki jak w odpowiedzi C # : zamiast mieć maksymalną granicę dla pętli opartą na wierszach / kolumnach, po prostu spróbuj złapać
ArrayIndexOutOfBoundsException
.-11 bajtów wymiana
catch(Exception e)
zfinally
.Wypróbuj online.
Stara 88 bajtów odpowiedź:
Wypróbuj online.
Wyjaśnienie:
Format wejściowy czarnej skrzynki:
Zakłada, że nazwana funkcja
int f(int x,int y)
jest obecna, co jest dozwolone zgodnie z tą meta odpowiedzią .Mam klasę abstrakcyjną
Test
zawierającą funkcję domyślnąf(x,y)
, a także powyższą lambda:W przypadkach testowych nadpisuję tę funkcję
f
. Na przykład pierwszy przypadek testowy nazywa się tak:źródło
Attache , 14 bajtów
Wypróbuj online! Ustaw
f
i dzwoń jakof[function, array]
.Wyjaśnienie
Jest to rozwidlenie dwóch funkcji:
Fold
i/Diagonal
. Dla argumentówf
ia
jest to równoważne z:/
, zastosowane monadycznie do funkcji, zwraca funkcję zastosowaną do jej ostatniego argumentu. Odpowiada to:To składa funkcję
f
na głównej przekątneja
.źródło
AWK , 77 bajtów
Wypróbuj online!
Byłem ciekawy czy
AWK
could do functional programming at all. I think this counts.„Matryca” jest zdefiniowana jako standardowa tablica asocjacyjna z dodatkowymi polami
M[1]=#rows
iM[2]=#columns
. Nazwa funkcji jest przekazywana jako ciąg znaków, który jest analizowany przez@F(...)
składnię. Ocena przeprowadzana jest od lewej do prawej. Tenr
parametr jest symbolem zastępczym, aby zapobiec zastąpieniu istniejącejr
zmiennej i uniknąć konieczności ponownej inicjalizacji każdego połączenia. Zazwyczaj dodaje się dodatkowe miejsce do oznaczenia takich symboli zastępczychAWK
, ale jest to kod golfowy, więc liczy się każdy bajt. :)The TIO link implements all the test cases.
źródło
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
źródło
¬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:
źródło
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.źródło
C, 76 bytes
Left-to-right.
Try it online!
źródło
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.źródło
Pari/GP, 42 bytes
Try it online!
źródło
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.źródło
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
źródło
APL NARS, 20 bytes, 10 chars
test:
źródło
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.źródło
Clojure, 30 bytes
Reduces "from the left".
źródło
Ruby,
5553 bytesTry it online!
źródło