Presentado en honor a APL como una herramienta interactiva que cumple 50 este año
Fondo
Ken [Iverson] presentó su artículo Formalismo en lenguajes de programación en agosto de 1963 en una Conferencia de trabajo sobre estructuras de lenguaje mecánico, Princeton, NJ La lista de congresistas está llena de nombres famosos y que pronto serán famosos, y algunos ganadores futuros del Premio Turing (Backus, Curry, Dijkstra, Floyd, Iverson, Newell, Perlis, Wilkes). El documento también registra la discusión que tuvo lugar después de la presentación, que terminó con un intercambio entre Ken y [Edsger] Dijkstra , en el que la respuesta de Ken a la pregunta de Dijkstra fue de una sola línea.
Reto
¿Cómo representaría una operación más compleja, por ejemplo, la suma de todos los elementos de una matriz M que son iguales a la suma de los índices de fila y columna correspondientes?
Escriba un fragmento o expresión (sin necesidad de un programa o función completa) para calcular la suma de cada elemento en una matriz entera dada que sea igual a la suma de sus índices. O, como dice FryAmTheEggman: dada una matriz M con elementos a ij devuelve la suma de cada a ij donde a ij = i + j.
Puede suponer que la matriz ya está en una ubicación variable o de memoria, o puede tomarla como argumento o entrada. Puede usar 0 o 1 índices basados.
Casos de prueba
0
para matriz vacía
2
0
para índices basados en 0 o 2
para índices basados en 1
1 5 2
9 4 2
5 9 6
2
para 0 basado o 10
para 1 basado
0 3 0 4
0 4 1 4
4 3 1 2
-2 4 -2 -1
11
3 -1 3 3
3 -1 3 1
6
para 0 basado o 3
para 1 basado
Anécdota
La respuesta de Iverson fue ++ / ( M = ⍳ ¹ ⨢ ⍳ ¹) // M , que no es válida en la notación de Iverson como se define en un lenguaje de programación , ni en lo que finalmente se convirtió en APL. En la notación Iverson, que habría sido + / ( M = ⍳ ¹ ( μ ( M )) ⨢ ⍳ ¹ ( ν ( M ))) / M . En las primeras versiones de APL lo era +/(,M=(⍳1↑⍴M)∘.+⍳1↓⍴M)/,M
.
fuente
Respuestas:
APL,
1312 bytes1 byte gracias a @ jimmy23013.
1 indexado.
La matriz se almacena en la variable
m
.Pruébalo en línea!
Basado en la respuesta en J , que es un lenguaje basado en APL.
En TryAPL, para ingresar:
+/m`em`c`1+/`1`i`rm
Con la matriz:
+/m`em`c`1+/`1`i`rm `[ 2 4 `r 3 `21 3 3 3 `21 3 1
Explicación
fuente
`
significa "clave APL".+/∊m∩¨+/¨⍳⍴m
.MATL ,
151410 bytesLa entrada tiene filas separadas por
;
. Por ejemplo:[1 5 2; 9 4 2; 5 9 6]
. Se utiliza la indexación basada en 1.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Usaré el ejemplo con entrada
[3 -1 3 3; 3 -1 3 1]
en la explicación.fuente
JavaScript,
4946 bytesEditar: Guardado 3 bytes gracias a @MartinEnder que señala que los fragmentos están permitidos.
fuente
Retina , 46 bytes
El recuento de bytes asume la codificación ISO 8859-1.
La entrada usa separadores de espacio y salto de línea para representar la matriz. Los índices están basados en 0.
Pruébalo en línea!
Explicación
No es exactamente el tipo de desafío para el que se hizo Retina, pero lo está haciendo sorprendentemente bien ... :)
Etapa 1: sustitución
Esto simplemente expande todos los enteros en la cadena como números unarios utilizando
1
como dígito unario. Los números negativos como-3
simplemente se convertirán en cosas como-111
.Etapa 2: partido
Debido a la
!
opción, esto imprime todas las coincidencias de la expresión regular dada. Dicha expresión regular utiliza grupos de equilibrio para verificar si el número actual es el mismo que la suma de sus índices.Para hacer eso, primero determinamos la suma de los índices con el lookbehind
(?<=(\S* |.*¶)*)
. Esto agrega una captura para cada número frente a la actual en la misma línea (vía\S*
), así como una captura para cada línea frente a la actual (vía.*¶
) para agrupar1
. Por lo tanto, obtenemos la suma de índices basada en cero como resultado.Luego intentamos hacer coincidir el siguiente número completo mientras eliminamos las capturas de esta pila
(?<-1>1)+\b
. Y luego hacemos el partido fallar si cualquier captura se dejan en grupo1
con el(?(1)1)
de garantizar la igualdad.Tenga en cuenta que los números negativos nunca coinciden, porque el mirar hacia atrás no puede pasar
-
por delante de la lista de1
sy(?<-1>1)+
tampoco puede coincidir.Esto nos da una lista de todos los números unarios que equivalen a la suma de sus índices.
Etapa 3: partido
Terminamos con otra etapa de coincidencia, pero sin la
!
opción, esto solo cuenta el número de coincidencias, que suma todos los números unarios del resultado anterior y también convierte esa suma de nuevo a decimal.fuente
Jalea,
151410 bytes4 bytes gracias a Adnan.
1 indexado.
Pruébalo en línea!
Verifique todas las cajas de prueba a la vez. (Ligeramente modificado.)
fuente
J€
lugar de hacerloL€R€
?Python 2 -
60 6057 bytesEs un fragmento de código, por lo que supondría unos pocos bytes más si realmente devuelvo el valor.
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
Gracias por la ayuda Leaky Num :-)
Explicación rápida
a
es una matriz que contiene números. Simplemente recorra los índices y sume todos los valores donde el valor sea igual a la suma del índice.fuente
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
R, 24 bytes
Basado en 1.
Casos de prueba:
fuente
J, 15 bytes
Utiliza indexación basada en cero y supone que la matriz ya está almacenada en la variable M .
Explicación
fuente
CJam,
232120 bytesGracias a Peter Taylor por guardar 3 bytes.
Espera que la matriz esté en la pila y deja la suma en su lugar. Los índices están basados en cero en cualquier caso.
Pruébalo aquí.
fuente
_,,
lugar del internoee
y.
para el bucle interno:ee{~_,,@f+1$.=.*~}%1b
ee{~_@f-_,,.=.*~}%1b
k4, 24 bytes
Asume que la matriz está almacenada
m
.Este es uno de esos acertijos donde las simplificaciones involucradas en el diseño de k a partir de APL (y J) realmente duelen: k
!
es el equivalente de APL⍳
pero solo funciona en vectores, así que tengo que armar la matriz de índices yo mismo; El producto interno es un carácter en APL pero cinco en k; y pierdo tres caracteres por manejar la matriz vacía correctamente porque k no tiene matrices fuertemente tipadas.fuente
Pyth, 14 bytes
0 indexado.
Banco de pruebas.
fuente
PowerShell v2 +, 43 bytes
Como un fragmento El uso es canalizar explícitamente la matriz a esto (ver ejemplos a continuación). Asume eso
$i
, y$o
son nulos o cero al comienzo (los configuré explícitamente como tales en los ejemplos a continuación), y utiliza 0-index.Hace un bucle foreach en cada fila de la matriz. Nosotros fijamos
$j
a0
, y luego ir a través de cada elemento de la fila en otro bucle$_|%{...}
. Cada bucle interno, incrementamos$o
por el elemento actual multiplicado por un booleano($_-eq$i+$j++)
, lo que significa que si ese booleano es$TRUE
, lo será1
, de lo contrario0
. Luego salimos del bucle interno, incrementamos$i
y comenzamos la siguiente fila. Finalmente nos vamos$o
en la tubería al final.Ejemplos
fuente
Ruby, 63 bytes
Con z como una matriz bidimensional de números:
No es terriblemente emocionante en absoluto.
Si z es una matriz aplanada con xey teniendo los tamaños de las matrices, como por ejemplo:
Luego tenemos esta monstruosidad, quizás más rubí con sus lujosos productos y cremalleras, pero en realidad más grande:
fuente
En realidad, 21 bytes
Pruébalo en línea!
Gracias a Leaky Nun por hacerme dejar de ser flojo y finalmente escribir esto.
Esto utiliza matrices indexadas a 0 y toma la entrada como una lista anidada.
Explicación:
fuente
Matlab / Octave, 48 bytes
1 indexado.
No manejará el primer caso de prueba porque
[1:0]
tiene un tamaño de 1x0 por alguna razónProbado en Octave 3.
Programa completo:
fuente
sum((M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0))(:))
. Además, creo que puede cambiar==0
por e inicial~
para reducir aún más el recuento de bytes. Finalmente, tenga en cuenta que debe manejar todos los casos de prueba o, de lo contrario, la pregunta debe eliminarseLua, 70 bytes
1 indexado.
Bonificación: ¡funciona para matrices irregulares!
Entrada almacenada en
a
, salida almacenada ens
.Programa completo:
fuente
PHP, 59 bytes
espera la matriz $ a definida; debe estar vacío o bidimensional, indexado a 0.
calcula la suma a $ s (anteriormente 0 o indefinido - 0 es igual a NULL)
inserte
+2
antes del final)
para un comportamiento indexado 1Feliz cumpleaños APL!
funciones y conjunto de pruebas
fuente
Brachylog , 15 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 42 bytes
Pruébalo en línea!
1 indexado.
fuente