Definición
Una matriz de punta de flecha es una matriz que tiene todas las entradas iguales a 0 , excepto las de la diagonal principal, la fila superior y la columna más a la izquierda. En otras palabras, la matriz debería verse así:
* * * * * * * * 0 0 0 0 * 0 * 0 0 0 * 0 0 * 0 0 * 0 0 0 * 0 * 0 0 0 0 *
Donde cada * es cualquier entrada distinta de cero.
Tarea
Dada una matriz cuadrada de enteros no negativos, verifique si es punta de flecha de acuerdo con la definición anterior.
Es posible que no se toma el tamaño de la matriz como entrada, a menos que el equivalente en su idioma a un arreglo es algo así como un puntero y una longitud (como C). Siempre será al menos 3 x 3.
El código más corto en bytes en cada idioma gana.
Entrada y salida
Puede elegir entre cualquiera de los siguientes formatos para recibir entradas:
- Una matriz en el tipo de matriz nativa (si su idioma tiene uno)
- Una matriz 2D 1 (una matriz de matrices 1D, cada una correspondiente a una fila)
- Una matriz 1D (ya que la matriz siempre es cuadrada)
- Una cadena (elegiste el espaciado, pero no abuses de esto de ninguna manera).
Cuando se trata de proporcionar resultados, puede informar un valor verdadero / falso siguiendo la definición estándar del problema de decisión , o elegir dos valores distintos y consistentes.
Además, puede tomar entrada y dar salida a través de cualquier método estándar , en cualquier lenguaje de programación , mientras toma nota de que estas lagunas están prohibidas por defecto. Si desea elegir cualquier otro formato o no está seguro acerca de algo, pregunte en los comentarios.
1: o el equivalente de su idioma (lista, vector, etc.)
Ejemplos
Veamos los siguientes ejemplos:
1 2 2 2 2 1 0 0 3 0 1 0 4 0 0 1
Esta es una matriz de punta de flecha (sus programas deben informar un valor verdadero), porque los elementos en la diagonal principal son 1 1 1 1
, los de la fila superior 1 2 2 2
y los de la columna de la izquierda 1 2 3 4
. Todas las demás entradas son 0 , por lo que cumple todas las condiciones.
3 5 6 7 1 0 8 0 0
Esta matriz no es punta de flecha porque hay un 0 en la diagonal principal.
9 9 9 9 9 9 0 0 9 7 9 0 9 0 0 9
Este tampoco es una punta de flecha, porque contiene un 7 en lugar de un 0 .
Más casos de prueba
Verdad:
[[1, 1, 1], [1, 1, 0], [1, 0, 1]] [[1, 2, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]] [[1, 2, 2, 2], [2, 1, 0, 0], [3, 0, 1, 0], [4, 0, 0, 1]] [[34, 11, 35, 5], [56, 567, 0, 0], [58, 0, 679, 0], [40, 0, 0, 7]]
Falsy
[[3, 5, 6], [7, 1, 0], [8, 0, 0]] [[9, 9, 9, 9], [9, 9, 0, 0], [9, 7, 9, 0], [9, 0, 0, 9]] [[1, 0, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]] [[1, 6, 3, 4], [13, 2, 0, 6], [29, 0, 1, 0], [2, 0, 0, 4]]
fuente
Respuestas:
Javascript (ES6),
4847 bytesGuardado 1 byte gracias a edc65
Devuelve las
false
matrices de punta de flecha y las matricestrue
sin punta de flecha (permitido ya que se pueden usar dos valores distintos para representar verdadero y falso)Casos de prueba:
Mostrar fragmento de código
fuente
f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
f=
por supuesto;-)
J ,
2120191715 bytes-4 bytes gracias a @GalenIvanov.
Toma la entrada como una matriz (rango 2).
Pruébalo en línea!
Explicación
Deje que el historial de edición le sirva de lección para no jugar golf y escriba una explicación al mismo tiempo.
Explicación visual
Tenga en cuenta que esto se hace en REPL (las entradas se dan comenzando con tres espacios y la salida se da sin espacios iniciales). Debido a eso, a veces omito funciones de composición como
@
y&
dado que las cosas en REPL se evalúan de derecha a izquierda (las funciones son más complejas).Supongamos que tiene la siguiente matriz de muestra:
Primero, me gustaría explicar (y agradecer) la manera muy inteligente de @GalenIvanov de generar la matriz de identidad, que es la siguiente
=&/:@}.
.Primero, decapitamos la matriz de entrada (
}.
).Luego obtenemos los índices en los que estaría cada fila si las filas se
/:
ordenaran usando -grade arriba.Tenga en cuenta que los índices resultantes son únicos : la lista no tiene elementos duplicados (¿y por qué lo haría? No hay forma de colocar dos elementos en la misma posición en una matriz).
Finalmente, usamos el nicho pero útil:
=
auto-clasificar. Esta mónada compara cada elemento único con todos los demás elementos en una matriz. ¿Recuerdas cómo mencioné que era importante que las indicaciones resultantes fueran únicas? Dado que=
-self-classify realiza las comparaciones en el orden en que aparecen los elementos únicos en la lista, el resultado resultante será la matriz de identidad para una entrada única (es por eso=@i.
que puede hacer una matriz de identidad de una longitud determinada).Una vez que tenemos la matriz de identidad, se trata de agregar una fila de unos y una columna de unos, lo que se hace de manera muy simple (si se le da un átomo, es decir, un solo elemento, la
,
familia lo repetirá para llenar cuando se agregue) :Luego simplemente comparamos la matriz de punta de flecha generada con el signo de la matriz de entrada.
fuente
*
suficiente en lugar de0@<
(para 17 bytes)? Pruébalo=&/:
cuando la combiné}.
, obtuve esto*-:1,1,.=&/:@}.
por 15 bytes. ¡ Pruébelo en línea!/:
y}.
-behead), ¡gracias de nuevo! Lo editaré.*-:1,1,.=@}.
funciona bien, no hay necesidad de una forma elegante de encontrar la matriz de identidad. Puede generar una matriz de identidad a partir de la matriz cuadrada simplemente mediante=
. Por lo tanto, suelte una fila con}.
, cree la matriz de identidad con=
, agregue una fila y una columna con,1
etc.Wolfram Language (Mathematica) , 47 bytes
Pruébalo en línea!
Explicación:
Clip@#
reemplaza todos los números distintos de cero en la matriz con 1s, luego lo comparamos con una matriz con dimensiones{1,1}Tr[1^#]
={Length@#, Length@#}
con 0 en posicióni,j
cuando1 < i != j > 1
, y 1 en caso contrario.(Aproximadamente basado en la respuesta de Uriel ).
Aquí hay otra idea que tiene 16 bytes más: siéntase libre de robarla si puede jugar golf:
Pruébalo en línea!
fuente
APL (Dyalog Classic) ,
19161513 bytes-1 byte gracias a @ErikTheOutgolfer
(
⎕IO←0
)Pruébalo en línea!
-2 bytes gracias a @ngn y @ H.PWiz
¿Cómo?
(Matriz de entrada 2D S )
×≡
Compruebe si S es positivo solo en ...(∧=⌊
... las diagonales o la fila superior y la columna izquierda ...)/¨∘⍳∘⍴
... de S .fuente
⍳∘⍴
producto cartesiano.×≡(=/∨1∊⊢)¨∘⍳∘⍴
(=/∨1∊⊢)
->(~≠⌊⌊)/
(∧=⌊)/
por supuesto, ambos requieren⎕IO←0
PowerShell ,
112108 bytesPruébalo en línea!
Toma datos y los manipula como una matriz de matrices, ya que PowerShell no admite matrices (fuera del soporte de matrices de transformación Direct3D de .NET, que es algo completamente diferente).
Todo el algoritmo se basa en el hecho de que los números distintos de cero son verdaderos y cero es falsey en PowerShell, y utiliza la multiplicación para determinar esos valores de verdad / falsey.
Primero tomamos la primera fila,
$a[0]
y verificamos si0
es-in
esa matriz, la almacenamos en nuestra$o
variable de rendimiento. Si algo en esa fila es cero, entonces$o
también es cero, de lo contrario es uno, hecho por un rápido cast-to-int con+
.A continuación, recorremos de
1
arriba a abajo$a.count-1
, configurando$x
en el camino: vamos a recorrer cada fila de una en una.En cada iteración establecemos la variable auxiliar
$i
para realizar un seguimiento de la fila en la que estamos, luego hacemos un bucle desde0
hasta$x
para iterar cada elemento en esta fila. Dentro del bucle interno, nuevamente estamos multiplicando$o
, esta vez seleccionando desde una configuración de tupla como un operador pseudoternario.El condicional de la tupla
!$_-or$_-eq$i
dice "cuando estamos en la columna 0 o la columna coincide con la fila (es decir, la diagonal principal)" para seleccionar la segunda mitad de la tupla cuando es verdadera o la primera mitad cuando es falsa. La tupla se compone de!($y=$a[$i][$_]), $y
. La primera mitad establece$y
para jugar golf la segunda mitad, pero de cualquier manera estamos seleccionando el elemento actual. La primera mitad hace negación booleana, mientras que la segunda mitad solo toma el elemento tal como está. Por lo tanto, si no estamos en la columna 0 ni en la diagonal principal, nos aseguramos de que el elemento sea cero al quitarle el booleano. Del mismo modo, nos aseguramos de que la columna 0 o la diagonal principal no sea cero simplemente tomándola.Entonces, ahora que hemos iterado a través de cada elemento en la matriz,
$o
será0
si algún elemento era incorrecto o algún número entero distinto de cero si es una matriz de punta de flecha. Hacemos doble booleano, no para obtener unoFalse
oTrue
respectivamente, para que nuestra salida sea coherente, y eso queda en la tubería donde la impresión está implícita.fuente
+
=[int]
? Eso es bueno.Jalea ,
1412 bytes-2 bytes de Pietu1998
Pruébalo en línea!
Explicación
Use la matriz anterior como entrada de ejemplo.
fuente
APL (Dyalog) ,
211817 bytesPruébalo en línea!
¿Cómo?
Este va a la inversa:
=/¨∘⍳
- crea la matriz de identidad1-⍨⍴
- paran - 1
1⍪1,
- antepone una columna y una fila de 1s≡
- se compara con×
- la matriz original, después de que se haya convertido en una firma de elementos sabiosfuente
MATL , 15 bytes
La entrada es una matriz (que se usa
;
como separador de filas). La salida es1
para punta de flecha, de lo0
contrario.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
C (gcc) ,
8075 bytesPruébalo en línea!
¡Guardado 5 bytes gracias a scottinet!
Reutilizó el código de prueba de esta respuesta .
Escanea linealmente la matriz en busca de valores incorrectos, devolviendo 0 para una matriz de punta de flecha y 1 en caso contrario. Verificamos calculando el exclusivo o si el artículo en una posición dada es cero y si esa posición está en la flecha.
Codificar la información de la matriz 2D en una dimensión conduce a un conjunto bastante simple de condiciones. Si dejamos
i
ser nuestro índice basado en 0 en lan
matriz dimensional, entonces sei<n
describe la primera fila. Del mismo modo,i%n==0
describe la primera columna yi/n==i%n
describe la diagonal.El mejor truco que encontré para manejar el retorno es establecer la dimensión a cero cuando se encuentra con un error. Esto hace que el ciclo finalice de inmediato, y luego devolver la negación lógica de la dimensión nos dará uno de dos valores distintos. scottinet encontró la manera de hacer que GCC lo devolviera más amablemente.
fuente
Python 2 , 75 bytes
Pruébalo en línea!
Python 2 , 85 bytes
Tomando la matriz como una matriz 1D:
Pruébalo en línea!
fuente
R ,
787069685453 bytesPruébalo en línea!
Portar la respuesta de Luis Mendo es mucho más corto que mi enfoque anterior.
¡Gracias a rturnbull por señalar un error y jugar golf por un byte!
respuesta anterior, 68 bytes:
Pruébalo en línea!
La respuesta de duckmayr prueba que todas las entradas en la diagonal principal y la primera fila / columna (
m[i]
) son distintas de cero y el resto (m[-i]
) son cero, utilizando una buena aritmética para obtener la diagonal y la primera fila.Sin embargo, esta respuesta prueba para asegurarse de que (1) las entradas cero no están en la diagonal principal o la primera fila / columna, y (2) que hay, dada una
n x n
matriz,3*n-2
entradas distintas de cero.which
devuelve los índices donde está su entradaTRUE
, y con el opcionalarr.ind=T
, devuelve una matriz de índices para cada dimensión de matriz, en este caso, dos.Por lo tanto
any(i[,1]==i[,2])
, cuando existe un cero en la diagonal y cuandoany(i==1)
existe un cero en la primera fila o la primera columna.Finalmente, una pequeña aritmética muestra que el número de entradas distintas de cero debe ser
3*n-2
,n
desde la primera columna,n-1
desde la diagonal yn-1
desde la primera fila.fuente
all(!m==!d)
en la última línea?(!!m)==d
pero!
tiene menor prioridad que==
. Sind==!!m
embargo, creo que debería hacer el truco.d!=!m
hace lo mismo, por un byte menos. Puede guardar otro byte utilizando lapryr::f
sintaxis en lugar defunction
también.Python 2 ,
9290 bytesPruébalo en línea!
Créditos
fuente
Haskell , 62 bytes
-3 bytes gracias al Sr. Xcoder. -13 bytes gracias al usuario 28667. -5 bytes gracias a Zgarb.
Pruébalo en línea!
fuente
<1
esos trucos? : P(x==y||x==0||y==0)==(m!!y!!x/=0)
debería ser más cortox*y<1
.Jalea , 10 bytes
Pruébalo en línea!
fuente
Python 3 ,
7271 bytes¡Gracias a @xnor por jugar golf en 1 byte!
Pruébalo en línea!
fuente
0<i!=j>0
ahorra un byte,Pyth,
2221 bytesDefinitivamente este no es el lenguaje para la manipulación matricial.
Para cada fila
b
y su índicek
en la matriz (.e
), toma la primera y lak
tercera entrada (lado izquierdo y diagonal) con,@bkh
y (+
) todas las otras entradas con.Db,0k
. Sik
no corresponde a 0 con la primera fila (Wk
), entonces!
noM
todas esas entradas. Una vez que todos hayan sido seleccionados, asegúrese de que todos sean verdaderos. (.As
) Si hay un 0 donde no debería haberlo, entonces la ubicación correspondiente se tomará como está y desordenará el y, y si hay un valor distinto de cero donde no debería haberlo, se!
anotará a 0, que es También falso.Banco de pruebas.
-1 bytes para intercambiar las órdenes.
fuente
@VQUQ
o.DVQUQ
Para diagonales / eliminar diagonales. Pero eso requeriría un enfoque completamente diferente. Aunque no estoy seguro ... (¿BTW olvidó actualizar el enlace?)VQUQ
idea:>.A++hCQhQ.(VQUQsstCt
. Sin embargo, esto parece muy redundante. Es posible que pueda modificarlo para ahorrar algunos bytes.Pip ,
312322 bytesEsta es una función que toma una lista anidada 2D de números. Pruébalo en línea!
Explicación
Aquí hay muchas comparaciones. Lo primero que debe saber es que los operadores de comparación en Pip se pueden encadenar juntos, como en Python:
5>4>3
es5>4 and 4>3
(verdadero), no(5>4)>3
(falso). El segundo es que esto no se aplica al==
operador "exactamente igual". Otra diferencia: las comparaciones regulares tienen mayor prioridad que los operadores de asignaciónMC
yMM
y pueden ser utilizados en las expresiones lambda, mientras que==
tiene menor precedencia y no puede.Para generar la primera matriz, usamos
MC
"map-coords". Este operador toma un número, genera una cuadrícula de coordenadas cuadradas de ese tamaño y asigna una función a cada par de coordenadas (x, y), devolviendo una lista de listas de resultados. Por ejemplo,{a+b} MC 3
daría el resultado[[0; 1; 2]; [1; 2; 3]; [2; 3; 4]]
.Aquí, el tamaño de la cuadrícula es
#a
, el tamaño de nuestro argumento original. La función es0<_!=B>0
, que es una forma más corta de escribir{0 < a != b > 0}
:Esto devuelve 0 para la primera fila / columna y la diagonal principal, y 1 en otro lugar.
fuente
Casco ,
1211 bytesPruébalo en línea!
Explicación
La idea es que Husk define 0 a la potencia de 0 como 1, por lo que el producto externo tiene 1s en la primera fila y columna. Además, 1 a la potencia de cualquier número es 1, por lo que el producto externo tiene 1s en la diagonal. Otras entradas son 0 a la potencia de algún número positivo, que es 0. Esto da una matriz de punta de flecha binaria, que comparamos con la entrada con
≡
.fuente
APL + WIN,
3633 bytesSolicita la entrada en pantalla de una matriz APL 2d.
fuente
Clojure,
128959285 bytesSiempre es emocionante ver dos corchetes de apertura consecutivos.
Versión original:
La primera parte funciona
assoc
colocando elementos diagonales de la submatriz en cero y verificando que todas las filas sean iguales :) Usé un truco similar en el método jacobiano .La parte
concat
posterior activa la diagonal + primera fila y columna y comprueba que sean positivas.fuente
Javascript (ES6), 58 bytes
Mi solución para Javascript:
No es tan inteligente como la respuesta de Herman , pero sentí que debería publicarlo aquí también.
Mostrar fragmento de código
fuente
Clojure,
212206188 bytes-6 bytes eliminando algunos espacios perdidos y atajos
range
. Puede que tenga que dejar que esto se asiente para poder pensar en una mejor manera.-18 bytes gracias a @NikoNyrh, y creando atajos para
map
.Horrible, simplemente horrible. No sé por qué no puedo entender una solución razonable.
Toma un vector anidado como entrada.
Intenté reescribir esto desde cero usando un método diferente, y terminó por más tiempo. En lugar de tallar manualmente las secciones de "descanso" de la matriz, decidí intentar generar todas las coordenadas en la matriz, generar las coordenadas de la punta de flecha, y luego usar
clojure.set/difference
para obtener las celdas sin punta de flecha. Desafortunadamente, la llamada a ese incorporado es costosa:223 bytes
fuente
#(drop 1 %)
es igualrest
y#(not(zero? %))
es igual quepos?
(ya que tenemos números no negativos). Es posible que desee echar un vistazo a mi respuesta de 128 bytes, que tiene un enfoque similar a este. Después de implementar eso, me di cuenta de que es muy corto tratar con el acceso basado en índices en un ciclo for.rest
. Probablemente debería descartar este intento e intentarlo de nuevo.Stax , 11 bytes CP437
Pruébalo en línea!
Versión desempaquetada con 13 bytes:
Finalmente atado a Husk y golpeado por Jelly por solo un byte ...
Explicación
fuente
R ,
8179 bytes-2 bytes gracias al Sr. Xcoder
Pruébalo en línea!
fuente
C, 117 bytes
Pruébalo en línea!
fuente
PowerShell , 186 bytes
Pruébalo en línea!
fuente
param($a)
para recibir información, se-contains
pueden cambiar por uno-in
y todos-eq0
se pueden intercambiar!
. Finalmente, puede realizar un bucle desde1
arriba$a.length
y deshacerse delif($_-ne0)
cuerpo del bucle.Perl 5 , 136 + 2 (
-ap
) = 138 bytesPruébalo en línea!
fuente
Limpio , 79 bytes
Pruébalo en línea!
fuente
Japt , 16 bytes
¡Pruébelo en línea!
Hombre, esto me lleva de vuelta a los viejos tiempos cuando Japt era regularmente mucho más tiempo que otros langos de golf ...
fuente
K (oK) ,
2730 bytesSolución:
Pruébalo en línea!
Explicación:
Debo estar haciendo algo tonto ya que las soluciones APL son menos de la mitad del conteo de bytes ...
Pasaron 24 bytes creando la punta de flecha.
or
juntas las siguientes tres matrices:Desglose completo:
fuente