pes una función (tipo polimórfico de clase) que toma una permutación como una lista de Ints, y una lista anidada que representa una matriz multidimensional de Ints.
Llame como p [2,1] [[10,20,30],[40,50,60]], sin embargo, si el valor predeterminado de tipo no tiene éxito, es posible que tenga que agregar una anotación de tipo como :: [[Int]](anidada adecuadamente) dando el tipo del resultado.
import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]
Pruébalo en línea!
Los desafíos de golf con matrices anidadas de profundidad arbitraria son un poco incómodos en Haskell, porque la escritura estática tiende a interferir. Si bien las listas de Haskell (con la misma sintaxis exacta que en la descripción del desafío) se pueden anidar perfectamente, las listas de diferentes profundidades de anidación son de tipos incompatibles. Además, las funciones de análisis estándar de Haskell requieren conocer el tipo del valor que está intentando analizar.
Como resultado, parece inevitable que el programa necesite incluir declaraciones relacionadas con el tipo, que son relativamente detalladas. Para la parte de golf, decidí definir una clase de tipo P, tal que ppueda ser polimórfica sobre el tipo de matriz.
Mientras tanto, el arnés de prueba del TIO muestra una forma de sortear el problema del análisis.
Cómo funciona
Para resumir la esencia de este algoritmo: realiza una clasificación de burbujas en la lista de permutación, transponiendo dimensiones vecinas cuando se intercambian los índices de permutación correspondientes.
Como lo indica la class P adeclaración, en cualquier caso, ptoma dos argumentos, una permutación (siempre de tipo [Int]) y una matriz.
- La permutación se puede dar en la forma en la descripción del desafío, aunque la forma en que funciona el algoritmo, la elección de los índices es arbitraria, excepto por su orden relativo. (Así que tanto el trabajo basado en 0 como en el 1).
- La base
instance P Intmaneja matrices de dimensión 1, que psimplemente regresa sin cambios, ya que la única dimensión solo se puede asignar a sí misma.
- El otro
instance P a => P [a]se define de forma recursiva, llamando pcon dimensión n submatrices con el fin de definir para la dimensión n + 1 arrays.
p(x:r)mprimeras llamadas de forma p rrecursiva en cada elemento de m, dando una matriz de resultados nen la que todas las dimensiones, excepto la primera, se han permutado correctamente entre sí.
- La permutación restante que debe realizarse
nestá dada por x:y:z = x:sort r.
- Si
x<yentonces, la primera dimensión de nya está colocada correctamente, y nsimplemente se devuelve.
- Si
x>y, entonces la primera y segunda dimensión de nnecesidad de intercambiarse, que se hace con la transposefunción. Finalmente, p(x:z)se aplica de forma recursiva a cada elemento del resultado, asegurando que la primera dimensión original se transponga a la posición correcta.
exec(guardar dos bytes) , ya que es una declaración en Python 2.