Gegeben (mit allen Mitteln):
- Ein Zwei-Argument (oder einziges Argument , bestehend aus einer Zwei-Element - Liste) Blackbox - Funktion , (Eingang und Ausgang ist 1, 2, 3, ...)
f: ℤ+ × ℤ+ → ℤ+
- Eine streng positive Ganzzahlmatrix mit mindestens zwei Zeilen und zwei Spalten
Gibt den Funktions-Trace der Matrix zurück .
Was ist ein Funktionsablauf ?
Eine normale Matrixkurve ist die Summe der Hauptdiagonalen (oben links bis unten rechts) einer Matrix:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ 1+5+9
→15
Aber anstatt zu summieren, wollen wir f
entlang der Diagonale anwenden :
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ f(f(1,5),9)
oderf(1,f(5,9))
Bitte geben Sie an, ob Sie von links nach rechts oder von rechts nach links arbeiten.
Die angegebene Matrix und alle Zwischenwerte sind ausschließlich positive Ganzzahlen innerhalb der Ganzzahldomäne Ihrer Sprache. Die Matrix kann nicht quadratisch sein.
Beispiele
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
oder7
f(x,y) = x+2y
, [[1,2,3],[4,5,6],[7,8,9]]
→ 47
oder29
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
oder4
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]
Antworten:
R ,
40-30BytesProbieren Sie es online!
Überprüfen Sie die Testfälle.
Fährt die Diagonale entlang, in diesem Fall also von links nach rechts. Für arithmetische Operatoren können Sie
"+"
oder Backticks um die Operatoren verwenden (+,*,-,%/%,^,%%
)Ziemlich einfach:
Reduce
ist R a entsprichtfold
, unddie Diagonalen einer Matrix diejenigen Elemente ,a_ij
woi==j
, dh wo dierow
undcol
UMN Indices gleich.diag
hat das passende Verhalten für nicht quadratische Matrizen.quelle
Haskell , 39 Bytes
Vielen Dank an @Laikoni für die Hilfe bei der Behebung der zuvor ungültigen Lösung!
Associates auf der linken Seite, probieren Sie es online! (Ersetzen
foldl1
vonfoldr1
für rechtsassoziativ)quelle
foldl1 f$zipWith(!!)m[0..]
?Mathematica , 16 Bytes
-1 Byte dank Martin Ender.
Probieren Sie es online!
Alternative Lösung, 17 Bytes
Probieren Sie es online!
quelle
@*{}
Syntax macht nicht viel Sinn (Sie meinten wahrscheinlich@*List
), aber die Tatsache, dass es trotzdem funktioniert, ist ziemlich cool. Tatsächlich bedeutet dies, dass Sie das{}
durch ein ersetzen0
und ein Byte speichern können.List
zuerst, aber ich habe es{}
nur zum Teufel versucht und war extrem überrascht, dass es funktioniert hat. Sinnvoll, aber wie geht das0
? o0{}
. Sie verwenden derzeit{}
als Funktion (oder tatsächlich als "Kopf" unter Verwendung der Mathematica-Terminologie). Wenn Sie dort ein Generikum verwendenf
, erhalten Sief[1,2,3]
(wenn dies die Diagonale ist). Aber mit{}
dir bekommen{}[1,2,3]
. Das ist ein völlig bedeutungsloser Ausdruck, aber Köpfe können selbst beliebige Ausdrücke sein, und wenn Mathematica nicht weiß, was sie damit machen sollen, belässt es sie einfach so, wie sie sind. Die meisten Listenmanipulationsfunktionen von Mathematica funktionieren tatsächlich mit Ausdrücken mit einem beliebigen Kopf, und im Fall vonFold
wird der Kopf einfach ignoriert. [noch zu bestätigen]0
stattdessen als Kopf verwenden, was0[1,2,3]
zwar noch bedeutungslos ist, aber trotzdem funktioniert.Oktave ,
615753 BytesProbieren Sie es online!
Definiert eine Funktion,
g
die ein Funktionshandlef
und eine Matrix übernimmtm
. Gibt bei der ersten Iterationm(1)
das Matrixelement oben links zurück. danach kehrt es einfach zurückm
.quelle
Sauber , 56 Bytes
Probieren Sie es online! Falten von rechts nach links.
[t\\[_:t]<-r]
ist das gleiche wiemap tl r
, braucht aber nichtimport StdEnv
.quelle
StdEnv
Haskell ,
474542 BytesProbieren Sie es online! Definiert eine Funktion,
(%)
die eine Funktion und eine Matrix als Liste von Listen als Eingabe annimmt.Die Funktion ist von rechts nach links gefaltet:
Edit: -2 Bytes dank BMO und -3 Bytes dank Zgarb !
quelle
$
und Vereinfachung der Bedingung mit*>
.*>
!APL (Dyalog Unicode) , 7 Bytes ( Adáms SBCS )
Probieren Sie es online!
-3 dank eines Vorschlags, dies von Adám in ein vollständiges Programm umzuwandeln .
Rechts nach links.
quelle
Haskell , 44 Bytes
Probieren Sie es online!
quelle
Standard-ML (MLton) , 59 Bytes
Probieren Sie es online! Falten von rechts nach links.
Ungolfed:
Probieren Sie es online!
quelle
Python 2 , 61 Bytes
Probieren Sie es online!
Dies funktioniert von links nach rechts.
quelle
(x+y)⁄2
undx+2y
BeispieleJavaScript (ES6),
5856 ByteFalten von links nach rechts. Bearbeiten: 2 Bytes werden gespeichert, indem die Tatsache verwendet wird, dass das Array streng positiv ist. Alternative Lösung, auch 56 Bytes:
quelle
1/
und Sie können , indem ein paar Sachen um weitere 2 Bytes speichern:f=>a=>(h=r=>(e=a[++i]&&a[i][i])?h(f(r,e)):r)(a[i=0][0])
. TIOf,
) von der ersten Version sparen würde ?f,
bei erneutem anruf zu zähleng
.JavaScript, 46 Bytes
Verwenden Sie dank @Shaggy bitweise oder speichern Sie ein Byte. Das ist Magie.
Code-Snippet anzeigen
quelle
Java 8,
888170 BytesFalten
[[1,2,3],[4,5,6],[7,8,9]]
zuf(f(1,5),9)
.-7 Bytes indirekt dank @KamilDrakari mit einem ähnlichen Trick wie in seiner C # -Antwort : Anstatt eine maximale Grenze für die Schleife basierend auf den Zeilen / Spalten zu haben, versuchen Sie einfach, die zu fangen
ArrayIndexOutOfBoundsException
.-11 Bytes ersetzen
catch(Exception e)
durchfinally
.Probieren Sie es online aus.
Alte 88 Bytes Antwort:
Probieren Sie es online aus.
Erläuterung:
Blackbox-Eingabeformat:
Nimmt an, dass eine benannte Funktion
int f(int x,int y)
vorhanden ist, die gemäß dieser Meta-Antwort zulässig ist .Ich habe eine abstrakte Klasse,
Test
die die Standardfunktionf(x,y)
sowie das obige Lambda enthält:Für die Testfälle überschreibe ich diese Funktion
f
. Zum Beispiel heißt der erste Testfall so:quelle
Attache , 14 Bytes
Probieren Sie es online! Festlegen auf
f
und anrufen alsf[function, array]
.Erläuterung
Dies ist eine Gabelung mit zwei Funktionen:
Fold
und/Diagonal
. Dies ist für Argumentef
unda
äquivalent zu:/
Bei monadischer Anwendung auf eine Funktion wird eine Funktion zurückgegeben, die auf ihr letztes Argument angewendet wird. Das entspricht also:Dies faltet die Funktion
f
über die Hauptdiagonale vona
.quelle
AWK , 77 Bytes
Probieren Sie es online!
Ich war neugierig, ob
AWK
ich überhaupt funktionale Programmierung machen kann. Ich denke das zählt.Die "Matrix" ist als standardmäßiges assoziatives Array mit zusätzlichen Feldern
M[1]=#rows
und definiertM[2]=#columns
. Der Funktionsname wird als String übergeben, der über die@F(...)
Syntax ausgewertet wird . Die Auswertung erfolgt von links nach rechts. Derr
Parameter ist ein Platzhalter, um das Überschreiben einer vorhandenenr
Variablen und die Neuinitialisierung bei jedem Aufruf zu vermeiden. In der Regel wird zusätzlicher Speicherplatz hinzugefügt, um solche Platzhalter festzulegen.AWK
Dies ist jedoch Codegolf, sodass jedes Byte zählt. :)Der TIO-Link implementiert alle Testfälle.
quelle
05AB1E ,
1510 BytesFalten von rechts nach links
Gespeicherte 5 Bytes mit einer neuen integrierten Funktion, wie von Kevin Cruijssen vorgeschlagen
Erläuterung
Funktioniert genauso wie die alte Version, mit der Ausnahme, dass
Å\
eine neue Funktion zum Drücken der Hauptdiagonale eingebaut ist.Probieren Sie es online! oder als Test Suite
Alte Version
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
¬g£vyNè}[
kannÅ\`[
jetzt 5 Bytes sparen.Schale , 7 Bytes
Vielen Dank an @Zgarb für die Korrektur meiner Einsendung!
Associates auf der linken Seite, versuchen Sie es online! (für eine rechtsassoziative Version einfach ersetzen
Ḟ
durchF
)Erläuterung
Leider gibt es keine einfache Möglichkeit, die Diagonale einer Matrix zu ermitteln. Die meisten Bytes sind dafür:
quelle
SNOBOL4 (CSNOBOL4) , 86 Bytes
Probieren Sie es online!
Definiert eine Funktion
T
(fürTRACE
), die eineARRAY
und eine Zeichenfolge akzeptiertF
, die der Name einer Funktion ist. Falten von links nach rechts.Die Verwendung von indirect reference (
$
) funktioniert nicht mit Funktionen. Die VerwendungEVAL
und Übergabe eines Strings an den Namen scheint daher die einzige Möglichkeit zu sein, eine Black-Box-Funktion in SNOBOL zu erhalten.Es ist auch ziemlich schmerzhaft, Arrays zu definieren. Da ungültige Array-Referenzen jedoch dazu führen
FAILURE
, funktioniert dies für nicht quadratische Arrays. WennI
sie in einer der beiden Dimensionen außerhalb der Grenzen liegen,F(RETURN)
wird die Funktion zur Rückgabe gezwungen.Bearbeiten:
Möglicherweise kann ich aufgrund dieses Meta- Posts davon ausgehen, dass die Black-Box-Funktion
F
unter dem Namen definiert istF
, wodurch diese auf 75 Byte reduziert wird (Verwendung vonEVAL
und,F
in der Funktionsdefinition entfernen ). Ich bevorzuge diese Version jedoch, da sie näher an der Übergabe eines Verweises auf eine Funktion liegt.quelle
C 76 Bytes
Links nach rechts.
Probieren Sie es online!
quelle
tinylisp , 79 bytes
Die letzte Zeile ist eine unbenannte Lambda-Funktion, die eine Funktion und eine Matrix aufnimmt und den Matrix-Trace zurückgibt. Die Spur ist linksassoziativ (dh
f(f(1,5),9)
). Probieren Sie es online!Ungolfed
Wir definieren eine Hilfsfunktion zur Berechnung der Diagonale; dann
generalized-trace
ist nur ein kleiner Wrapper um die Bibliotheksfunktionfoldl
.Wenn wir die Diagonale rekursiv berechnen, prüfen wir, ob sie
(head matrix)
wahr ist. Wenn die Matrix keine Zeilen enthält, ist dies die leere Liste (nil) undhead
von nil ist nil - falsey. Wenn die Matrix keine Spalten mehr enthält, ist die erste Zeile (Kopf) die leere Liste (Null) - Falsey. Andernfalls wird es eine nicht leere erste Zeile geben, was wahr ist.Wenn also die erste Zeile nicht existiert oder leer ist, geben wir nil zurück. Andernfalls nehmen wir, wenn es eine nicht leere erste Zeile gibt, das
(head (head matrix))
erste Element der ersten Zeile undcons
(stellen) es dem Ergebnis des rekursiven Aufrufs voran . Das Argument für den rekursiven Aufruf lautet(map tail (tail matrix))
--das heißt, alle Zeilen bis auf die erste und alle bis auf das erste Element jeder Zeile.quelle
Pari / GP , 42 Bytes
Probieren Sie es online!
quelle
C # (Visual C # -Compiler) ,
726960 ByteProbieren Sie es online!
try/catch
Ermöglicht das korrekte Erreichen der Diagonale, indem Sie einfach daran entlang gehen und außerhalb der Grenzen enden.3 Bytes gespart, weil, wie von Kevin Cruijssen hervorgehoben, angenommen werden kann , dass Black-Box-Funktionen unter einem bestimmten Namen existieren .
9 Bytes gespart durch Rückgabe durch Ändern eines Arguments .
Somit wird die Funktion aufgerufen, indem die gewünschte Funktion unter dem Namen
f
, dem Aufruftrace(matrix)
und dem Ergebnis gespeichert wirdmatrix[0][0]
.Alternativ, wenn Sie wirklich Ausführlichkeit mögen,
C # (Visual C # -Compiler) ,
97 + 13 = 1107869 ByteProbieren Sie es online!
32 Byte, die mit einer vordefinierten Funktion gespeichert wurden, da der
System
Import und der langeFunc
generische Typ entfernt werden konnten, wenn die Funktion nicht als Parameter verwendet wurde.quelle
catch(Exception e)
stattcatch
:) EDIT:. Oh, in der Lage gewesen , das zu ersetzen ,catch(Exception e)
mitfinally
mehr Bytes zu speichern. Danke noch einmal. +1 von mir.finally
incatch(Exception e)
, weil ich nicht in der schließlich mehr zurückkehrt. Alsom->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 Bytes) ist leider länger für mich im Vergleich zu meiner aktuellen Antwortm->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}
(70 Bytes) Aber in der Tat eine schöne Möglichkeit, Bytes in Ihrer Antwort zu speichern! :) Schade, ich kann deine Antwort nur einmal +1 geben.JavaScript,
61575652504442 BytesVerkleinert von links nach rechts. Es wird davon ausgegangen, dass die Funktion der Variable zugewiesen ist
f
, wie in diesem Meta-Post beschrieben , auf den ich von Herrn Xcoder & Totalhuman aufmerksam gemacht wurde. Kann nicht sagen, da ich damit einverstanden bin, da dies unserem bestehenden Konsens direkt widerspricht, dass wir möglicherweise nicht davon ausgehen, dass die Eingabe einer vordefinierten Variablen zugewiesen ist, aber ich nehme die wenigen Bytes, die vorerst gespart werden.Testfälle
quelle
APL NARS, 20 Bytes, 10 Zeichen
Prüfung:
quelle
Gelee , 5 Bytes
Links nach rechts.
Probieren Sie es online!
Haftungsausschluss: Ich weiß nicht, ob dies eine akzeptable Eingabemethode für Black-Box-Funktionen ist. Dies setzt voraus, dass die Funktion in dem obigen Link implementiert ist und daher "benannt" ist (das heißt, sie ist mit aufrufbar)
ç
, aber ansonsten habe ich keine Möglichkeit, sie zuzuweisenç
. Wenn jemand mehr Erfahrung mit Jelly + Blackbox-Funktionen hat, würde ich mich über Gedanken freuen. Nachdem wir einige Zeit im Chat verbracht hatten, stellten wir fest, dass die Verwendungç
tatsächlich gültig sein könnte.quelle
Clojure, 30 Bytes
Verkleinert "von links".
quelle
Ruby ,
5553 BytesProbieren Sie es online!
quelle