Dado (por cualquier medio):
- Una función de recuadro negro de dos argumentos (o argumento simple que consiste en una lista de dos elementos) , (entrada y salida son 1, 2, 3, ...)
f: ℤ+ × ℤ+ → ℤ+
- Una matriz entera estrictamente positiva con al menos dos filas y dos columnas.
devuelve el rastro de la función de la matriz .
¿Qué es un rastro de función ?
Un trazado de matriz normal es la suma de la diagonal principal (superior izquierda a inferior derecha) de una matriz:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ 1+5+9
→15
Pero en lugar de sumar, queremos aplicar a lo f
largo de la diagonal:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ f(f(1,5),9)
of(1,f(5,9))
Indique si utiliza de izquierda a derecha o de derecha a izquierda.
La matriz dada y todos los valores intermedios serán enteros estrictamente positivos dentro del dominio de enteros de su idioma. La matriz puede ser no cuadrada.
Ejemplos
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
o7
f(x,y) = x+2y
, [[1,2,3],[4,5,6],[7,8,9]]
→ 47
o29
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
o4
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]
Respuestas:
R ,
4030 bytesPruébalo en línea!
Verificar los casos de prueba.
Atraviesa la diagonal, de izquierda a derecha en este caso. Para operadores aritméticos, puede usar
"+"
o retroceder alrededor de los operadores (+,*,-,%/%,^,%%
)Bastante sencillo:
Reduce
es R del equivalente a unafold
, yla diagonal de una matriz es aquellos elementosa_ij
dondei==j
, es decir, donde elrow
ycol
UMN índices son los mismos.diag
tiene el comportamiento apropiado para matrices no cuadradas.fuente
Haskell , 39 bytes
¡Gracias @Laikoni por ayudarme a solucionar la solución previamente inválida!
Asociados a la izquierda, ¡ pruébelo en línea! (reemplazar
foldl1
porfoldr1
derecho-asociativo)fuente
foldl1 f$zipWith(!!)m[0..]
?Mathematica , 16 bytes
-1 byte gracias a Martin Ender.
Pruébalo en línea!
Solución alternativa, 17 bytes.
Pruébalo en línea!
fuente
@*{}
sintaxis no tiene mucho sentido (probablemente quisiste decir@*List
), pero el hecho de que funcione de todos modos es bastante bueno. De hecho, significa que puede reemplazar el{}
con0
ay guardar un byte.List
primero, pero lo intenté{}
por el gusto de hacerlo y me sorprendió mucho que funcionó. Tiene sentido, pero ¿cómo0
funciona? o0{}
. Actualmente está utilizando{}
como una función (o en realidad como una "cabeza" utilizando la terminología de Mathematica). Si utilizó un genéricof
allí, obtendríaf[1,2,3]
(si esa es la diagonal). Pero con lo{}
que consigues{}[1,2,3]
. Esa es una expresión completamente sin sentido, pero las cabezas pueden ser expresiones arbitrarias en sí mismas, y si Mathematica no sabe qué hacer con ellas, simplemente las deja como están. La mayoría de las funciones de manipulación de listas de Mathematica en realidad funcionan con expresiones con una cabeza arbitraria y, en el caso deFold
, la cabeza simplemente se ignora. [por confirmar]0
como cabeza, lo que da lo0[1,2,3]
que todavía no tiene sentido, pero funciona de todos modos.Octava ,
615753 bytesPruébalo en línea!
Define una función
g
que toma un controlador de funciónf
y una matrizm
. En la primera iteración,m(1)
devuelve el elemento de matriz superior izquierdo; después de eso, simplemente regresam
.fuente
Limpio , 56 bytes
Pruébalo en línea!Se pliega de derecha a izquierda.
[t\\[_:t]<-r]
es lo mismo quemap tl r
, pero no necesitaimport StdEnv
.fuente
StdEnv
Haskell ,
474542 bytesPruébalo en línea!Define una función
(%)
que toma una función y una matriz como una lista de listas como entrada.La función se pliega de derecha a izquierda:
Editar: -2 bytes gracias a BMO y -3 bytes gracias a Zgarb !
fuente
$
y simplificando el condicional con*>
.*>
!APL (Dyalog Unicode) , 7 bytes ( SBCS de Adám )
Pruébalo en línea!
-3 gracias a una sugerencia para convertir esto en un programa completo por Adám .
De derecha a izquierda.
fuente
Haskell , 44 bytes
Pruébalo en línea!
fuente
ML estándar (MLton) , 59 bytes
Pruébalo en línea!Se pliega de derecha a izquierda.
Sin golf:
Pruébalo en línea!
fuente
Python 2 , 61 bytes
Pruébalo en línea!
Esto funciona de izquierda a derecha.
fuente
(x+y)⁄2
yx+2y
JavaScript (ES6),
5856 bytesSe pliega de izquierda a derecha. Editar: se guardaron 2 bytes utilizando el hecho de que la matriz es estrictamente positiva. Solución alternativa, también 56 bytes:
fuente
1/
y usted puede ahorrar otros 2 bytes moviendo algunas cosas en torno a:f=>a=>(h=r=>(e=a[++i]&&a[i][i])?h(f(r,e)):r)(a[i=0][0])
. TIOf,
) de la primera versión?f,
cuando llamé deg
nuevo.JavaScript, 46 bytes
Gracias a @Shaggy, use bitwise o guarde un byte. Eso es magia
Mostrar fragmento de código
fuente
Java 8,
888170 bytesPliegues
[[1,2,3],[4,5,6],[7,8,9]]
af(f(1,5),9)
.-7 bytes indirectamente gracias a @KamilDrakari al usar un truco similar al que hizo en su respuesta de C # : en lugar de tener un límite máximo para el bucle basado en las filas / columnas, simplemente intente atrapar el
ArrayIndexOutOfBoundsException
.-11 bytes reemplazando
catch(Exception e)
confinally
.Pruébalo en línea.
Antigua respuesta de 88 bytes:
Pruébalo en línea.
Explicación:
Formato de entrada de caja negra:
Asume que una función con nombre
int f(int x,int y)
está presente, lo cual está permitido de acuerdo con esta meta respuesta .Tengo una clase abstracta que
Test
contiene la función predeterminadaf(x,y)
, así como la lambda anterior:Para los casos de prueba, sobrescribo esta función
f
. Por ejemplo, el primer caso de prueba se llama así:fuente
Adjunto , 14 bytes
Pruébalo en línea! Establecer
f
y llamar comof[function, array]
.Explicación
Esta es una bifurcación de dos funciones:
Fold
y/Diagonal
. Esto, para argumentosf
ya
, es equivalente a:/
, cuando se aplica monádicamente a una función, devuelve una función que se aplica a su último argumento. Entonces, esto es equivalente a:Esto pliega la función
f
sobre la diagonal principal dea
.fuente
AWK , 77 bytes
Pruébalo en línea!
Tenía curiosidad si
AWK
podría hacer programación funcional en absoluto. Creo que esto cuenta.La "matriz" se define como una matriz asociativa estándar, con campos adicionales
M[1]=#rows
yM[2]=#columns
. El nombre de la función se pasa como una cadena que se evalúa mediante la@F(...)
sintaxis. La evaluación se realiza de izquierda a derecha. Elr
parámetro es un marcador de posición para evitar sobrescribir unar
variable existente y evitar la necesidad de reinicializar cada llamada. Normalmente, se agrega espacio adicional para designar dichos marcadores de posición enAWK
, pero este es el código de golf, por lo que cada byte cuenta. :)El enlace TIO implementa todos los casos de prueba.
fuente
05AB1E ,
1510 bytesSe pliega de derecha a izquierda
Guardado 5 bytes usando un nuevo incorporado como lo sugiere Kevin Cruijssen
Explicación
Funciona igual que la versión anterior, excepto que
Å\
es un nuevo incorporado para empujar la diagonal principal.Pruébalo en línea! o como un conjunto de pruebas
Versión antigua
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
¬g£vyNè}[
puede serÅ\`[
ahora, ahorrando 5 bytes.Cáscara , 7 bytes
¡Gracias @Zgarb por arreglar mi presentación!
Asociados a la izquierda, ¡ Pruébelo en línea! (para una versión asociativa correcta simplemente reemplace
Ḟ
porF
)Explicación
Desafortunadamente, no hay una manera fácil de obtener la diagonal de una matriz, por lo que la mayoría de los bytes son para eso:
fuente
SNOBOL4 (CSNOBOL4) , 86 bytes
Pruébalo en línea!
Define una función
T
(paraTRACE
) que toma unARRAY
y una cadenaF
que es el nombre de una función. Se pliega de izquierda a derecha.Usar la referencia indirecta (
$
) no funciona con funciones. Entonces, usarEVAL
y pasar una cadena al nombre parece ser la única forma de obtener una función de recuadro negro en SNOBOL.Además, es bastante doloroso definir matrices; sin embargo, debido a que las referencias de matriz inválidas causan
FAILURE
, esto funciona para matrices no cuadradas; siI
está fuera de los límites en cualquier dimensión,F(RETURN)
obliga a la función a regresar.Editar:
Posiblemente, en base a esta meta publicación , puedo suponer que la función de recuadro negro
F
se define bajo el nombreF
, lo que lo reduciría a 75 bytes (eliminar el uso deEVAL
y,F
en la definición de la función). Sin embargo, prefiero esta versión ya que está más cerca de pasar una referencia a una función.fuente
C, 76 bytes
De izquierda a derecha.
Pruébalo en línea!
fuente
tinylisp , 79 bytes
La última línea es una función lambda sin nombre que toma una función y una matriz y devuelve la traza de la matriz. La traza es asociativa a la izquierda (es decir
f(f(1,5),9)
). Pruébalo en línea!Sin golf
Definimos una función auxiliar para calcular la diagonal; entonces
generalized-trace
es simplemente un pequeño contenedor alrededor de la función de bibliotecafoldl
.Al calcular la diagonal de forma recursiva, verificamos si
(head matrix)
es verdad. Si la matriz está fuera de filas, será la lista vacía (nil), yhead
de nil es nil - falsey. O, si la matriz está fuera de las columnas, su primera fila (encabezado) será la lista vacía (nula) - falsey. De lo contrario, habrá una primera fila no vacía, lo cual es cierto.Entonces, si la primera fila no existe o está vacía, devolvemos nil. De lo contrario, si hay una primera fila no vacía, tomamos el
(head (head matrix))
primer elemento de la primera fila ycons
(lo anteponemos) al resultado de la llamada recursiva. El argumento para la llamada recursiva es:(map tail (tail matrix))
es decir, tomar todas las filas menos la primera, y tomar todas menos el primer elemento de cada fila.fuente
Pari / GP , 42 bytes
Pruébalo en línea!
fuente
C # (compilador de Visual C #) ,
726960 bytesPruébalo en línea!
try/catch
permite alcanzar correctamente la diagonal simplemente yendo a lo largo y terminando cuando está fuera de los límites.3 bytes guardados porque, como lo señaló Kevin Cruijssen, se puede suponer que las funciones de recuadro negro existen bajo un nombre específico .
9 bytes guardados al regresar mediante la modificación de un argumento .
Por lo tanto, la función se llama almacenando la función deseada bajo el nombre
f
, llamandotrace(matrix)
, y el resultado se almacena enmatrix[0][0]
.Alternativamente, si realmente te gusta la verbosidad,
C # (compilador de Visual C #) ,
97 + 13 = 1107869 bytesPruébalo en línea!
32 bytes guardados mediante el uso de una función predefinida, ya que no tomar la función como parámetro permitió eliminar la
System
importación y elFunc
tipo genérico largo .fuente
catch(Exception e)
lugar decatch
. :) EDITAR: Oh, he podido reemplazarlocatch(Exception e)
confinally
para guardar más bytes. Gracias de nuevo. +1 de mi partefinally
acatch(Exception e)
, porque finalmente ya no volveré al interior. Entoncesm->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 bytes) es, lamentablemente, más largo para mí en comparación con mi respuesta actualm->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}
(70 bytes) ¡Pero, de hecho, es una buena manera de guardar bytes en su respuesta! :) Lástima que solo pueda hacer +1 en tu respuesta una vez.JavaScript,
61575652504442 bytesReduce de izquierda a derecha. Asume que la función está asignada a la variable
f
, según esta meta publicación que me llamó la atención el Sr. Xcoder y totalmente humano. No puedo decir que estoy de acuerdo, ya que contradice directamente nuestro consenso existente de que no podemos asumir que la entrada se asigna a una variable predefinida, pero tomaré los pocos bytes que ahorramos por ahora.Casos de prueba
fuente
NARS APL, 20 bytes, 10 caracteres
prueba:
fuente
Jalea , 5 bytes
De izquierda a derecha.
Pruébalo en línea!
Descargo de responsabilidad: no sé si este es un método de entrada aceptable para las funciones de recuadro negro. Esto supone que la función se implementa en el enlace anterior y, por lo tanto, se "nombra" (es decir, se puede llamar con)
ç
, pero de lo contrario no tengo forma de asignarlaç
. Si alguien tiene más experiencia con las funciones de caja negra de Jelly +, agradecería tener pensamientos. Después de pasar un tiempo en el chat, supusimos que el usoç
podría ser válido.fuente
Clojure, 30 bytes
Reduce "desde la izquierda".
fuente
Ruby ,
5553 bytesPruébalo en línea!
fuente