Desafío:
Dada una entrada de matriz, determine la cantidad de diagonales y anti-diagonales con números duplicados.
Entonces, si tenemos una matriz como esta:
[[aa,ab,ac,ad,ae,af],
[ba,bb,bc,bd,be,bf],
[ca,cb,cc,cd,ce,cf],
[da,db,dc,dd,de,df]]
Todas las diagonales y anti-diagonales serían:
[[aa],[ab,ba],[ac,bb,ca],[ad,bc,cb,da],[ae,bd,cc,db],[af,be,cd,dc],[bf,ce,dd],[cf,de],[df],
[af],[ae,bf],[ad,be,cf],[ac,bd,ce,df],[ab,bc,cd,de],[aa,bb,cc,dd],[ba,cb,dc],[ca,db],[da]]
Ejemplo:
[[1,2,1,2,1,2],
[1,2,3,4,5,6],
[6,5,4,3,2,1],
[2,1,2,1,2,1]]
Todas las diagonales y anti-diagonales serían:
[[1],[2,1],[1,2,6],[2,3,5,2],[1,4,4,1],[2,5,3,2],[6,2,1],[1,2],[1],
[2],[1,6],[2,5,1],[1,4,2,1],[2,3,3,2],[1,2,4,1],[1,5,2],[6,1],[2]]
Eliminar todas las diagonales y anti-diagonales solo que contengan números únicos:
[[2,3,5,2],[1,4,4,1],[2,5,3,2],[1,4,2,1],[2,3,3,2],[1,2,4,1]]
Entonces, la salida es la cantidad de diagonales y antiagoniales que contienen números duplicados:
6
Reglas de desafío:
- Si la matriz de entrada está vacía, contiene solo 1 número o contiene solo números únicos en toda la matriz, la salida es siempre
0
. - Se garantiza que la entrada solo contiene dígitos positivos
[1,9]
(a menos que esté completamente vacía). - La matriz siempre será rectangular (es decir, todas las filas tienen la misma longitud).
- I / O es flexible. La entrada se puede tomar como una lista de listas de enteros, o una matriz 2D de enteros, o un objeto Matrix, como una cadena, etc., etc. También se le permite tomar una o ambas dimensiones de la matriz como entrada adicional si guardaría bytes en su idioma de elección.
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de código. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
- Además, se recomienda agregar una explicación para su respuesta.
Casos de prueba:
Input: Output:
[[1,2,1,2,1,2], 6
[1,2,3,4,5,6],
[6,5,4,3,2,1],
[2,1,2,1,2,1]]
[[]] 0
[[1,2], 0
[3,4]]
[[1,1], 2
[1,1]]
[[9,9,9], 6
[9,9,9],
[9,9,9]]
[[7,7,7,7], 8
[7,7,7,7],
[7,7,7,7]]
[[1,1,1], 1
[2,3,4],
[2,5,1]]
[[1,8,4,2,9,4,4,4], 12
[5,1,2,7,7,4,2,3],
[1,4,5,2,4,2,3,8],
[8,5,4,2,3,4,1,5]]
[[1,2,3,4], 4
[5,6,6,7],
[8,6,6,9],
[8,7,6,5]]
fuente
row
ycol
a mi lista de 'funciones extremadamente situacionales'. Solución realmente inteligente.c(m|x-y,m|x+y)
directo a la llamada de muestra, eliminar lal=
parte. No veo ninguna prueba fallida. Pruébalo en línea!l
instancia.row
ycolumn
a R esta mañana, porque nunca he oído hablar de ellas.J ,
2120 bytes-1 byte gracias a Jonás!
Pruébalo en línea!
Explicación:
fuente
(-.@-:~.)
"los artículos únicos no coinciden" en J, pero también me he encontrado con esto muchas veces y no creo que puedas ... tenemos=
y~:
, en uno mano, y-:
y<this is missing>
.1#.|.,&((~:&#~.)/.)]
. Pruébalo en línea!&
, gracias!Japt , 31 bytes
Pruebe todos los casos de prueba
Explicación:
También probé una versión basada en la respuesta Haskell de Kirill L., pero no pude encontrar una buena manera de "agrupar en función de los índices X e Y" y la alternativa que encontré no era lo suficientemente buena.
fuente
JavaScript (ES6),
107 105 10198 bytesPruébalo en línea!
Nota
Por la forma en que se juega este código, nunca se prueba el anti-diagonal que consiste en la única celda inferior izquierda. Eso está bien porque no puede contener valores duplicados.
Comentado
fuente
05AB1E , 25 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
Siento que me he perdido algo aquí.
Necesito probar y jugar golf más tarde.
fuente
rotate N left
lo seríaN._
ahora. Asíí‚εεygÅ0«N._]
también funciona. También puede eliminar el aplanamiento con este nuevo cambio ... aunque todavía no hay ahorro de bytes:í‚vyεygÅ0«N._}ø}«ʒ0KDÙÊ}g
N(._
, supongo, pero tuNFÁ}
es de la misma longitud, e incluso más corta en este caso debido al]
cierre simultáneo del bucle y los mapas. En general, el uso de._
solo es útil cuando se va a la izquierda para guardar 1 byte, en comparación conNFÀ}
.Python 2 ,
144136 bytesPruébalo en línea!
fuente
Octava , 98 bytes
Pruébalo en línea!
fuente
cellfun
también, y para los masoquistas,structfun
también. En Octave, ¡es un bucle for o está teniendofun
!Haskell,
118112 bytesPruébalo en línea!
fuente
Carbón ,
615653 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Pase sobre diagonales hacia adelante y hacia atrás;
i=0
representa diagonales hacia adelante mientras quei=1
representa diagonales inversas.Pase sobre cada índice de fila. Esto representa el índice del inicio de la diagonal.
Pase sobre el índice de cada columna.
Calcule el índice de fila de la diagonal en este índice de columna. Utilizo un
for
bucle sobre una matriz de un solo elemento en lugar de una asignación, ya que esto evita tener que ajustar la asignación en un bloque con la siguiente instrucción, lo que ahorra un byte.Compruebe si esta es la primera columna o si la diagonal está a punto de envolverse entre la parte inferior y la superior.
Si no es así, pop la última lista de la lista de listas.
si es así, comience una nueva lista vacía.
Agregue la entrada diagonal actual a esa lista.
Y empuje esa lista (atrás) a la lista de listas.
Cuente el número de listas que contienen duplicados.
Tomemos un ejemplo cuando
i=0
yk=1
. Esto significa que ya hemos recogido dos diagonales,[[1,1,5,2],[9,4,3,5]]
. Aquí está nuestra entrada:Luego pasamos
l
de0
a7
. Esto avanza tanto la fila como la columna en 1 cada vez:La lista es ahora
[[1,1,5,2],[9,4,3,5],[5,4,4]]
. Sin embargo, cuandol
es3
, tenemosk+l=4
, un múltiplo de la altura de la matriz. Esto significa que tenemos que empezar una nueva lista:[[1,1,5,2],[9,4,3,5],[5,4,4],[]]
. Luego continuamos recolectando elementos diagonales:La lista es ahora
[[1,1,5,2],[9,4,3,5],[5,4,4],[2,7,2,1]]
. Ahora cuandol
es7
, tenemosk+l=8
, otro múltiplo de la altura de la matriz. Esto significa que tenemos que empezar una nueva lista, que termina con el último elemento de la diagonal que:[[1,1,5,2],[9,4,3,5],[5,4,4],[2,7,2,1],[4]]
.Al recopilar diagonales de envoltura que comienzan en el primer elemento de cada fila, eventualmente acumulamos todas las diagonales de la matriz.
fuente
Wolfram Language (Mathematica) ,
99 98 96 9483 bytesPruébalo en línea!
Function[a,a~Diagonal~#&/@Range[t=-#~Total~2,-t]]
obtiene todas las diagonales dea
, lo que funciona porque#~Total~2
es más grande que cualquier dimensión dea
.fuente
APL + WIN, 69 bytes
Solicita una matriz 2D de la forma 4 6⍴1 2 1 2 1 2 1 2 3 4 5 6 6 5 4 3 2 1 2 1 2 1 2 1
Esto produce:
Pruébalo en línea! Cortesía de Dyalog Classic.
Explicación:
Rendimientos:
fuente
Perl 5,
8982 bytesTIO
fuente
TSQL,
140128 bytesEncontré una manera de jugar al golf 12 personajes. Esta ya no es la solución más larga.
Golfizado:
Sin golf:
Pruébalo
fuente