Dada una matriz 2D de enteros, clasifiquemos sus filas y columnas en bloques. Esto significa que solo tiene que ordenar una fila o columna dada, pero aplicando las transformaciones necesarias para ordenarla a cada otra fila o columna en la matriz 2D.
Reglas
- La entrada será una matriz 2D de enteros y un entero indexado 1. Este entero representará la fila que se ordenará si el número es positivo, o la columna que se ordenará si el número es negativo (o al revés que desee). Ejemplo: Dada una
4x3
matriz (filas x columnas), puede ordenar la segunda columna con un-2
argumento o la tercera fila con un3
argumento. Este segundo argumento nunca será cero y su valor absoluto nunca será mayor que la dimensión correspondiente de la matriz. - La salida también será una matriz 2D de enteros con las transformaciones necesarias aplicadas para ordenar la fila o columna dada. Alternativamente, puede escribir la matriz en STDOUT.
- La matriz de salida tendrá la fila o columna especificada ordenada en orden ascendente. Solo tenga en cuenta que cuando necesite intercambiar dos números seguidos, se intercambiarán todas las columnas donde se encuentran los números. Y cuando necesite intercambiar dos números en una columna, se intercambiarán todas las filas donde se encuentran los números.
- En el caso en que el mismo número aparezca varias veces en la fila / columna que se va a ordenar, habrá varias soluciones posibles de acuerdo con la forma en que intercambia los valores, solo haga lo que corresponda con el resto de filas / columnas que se intercambiarán.
Ejemplos
Positive indices for rows and negative indices for columns
[5 8 7 6 [1 3 2 4
1 3 2 4 order by -3 (3rd column) --> 9 6 3 0
9 6 3 0] 5 8 7 6]
[5 8 7 6 [9 6 3 0
1 3 2 4 order by -4 (4th column) --> 1 3 2 4
9 6 3 0] 5 8 7 6]
[5 8 7 6 [5 7 8 6
1 3 2 4 order by 2 (2nd row) --> 1 2 3 4
9 6 3 0] 9 3 6 0]
[5 8 7 6 [6 7 8 5
1 3 2 4 order by 3 (3rd row) --> 4 2 3 1
9 6 3 0] 0 3 6 9]
[1 2 [1 2 [3 2
3 2] order by -2 (2nd column) --> 3 2] or 1 2] (both are valid)
[7 5 9 7 [5 7 7 9 [5 7 7 9
1 3 2 4 order by 1 (1st row) --> 3 1 4 2 or 3 4 1 2
9 6 3 0] 6 9 0 3] 6 0 9 3]
Este es el código de golf , ¡así que puede ganar el código más corto para cada idioma!
code-golf
array-manipulation
sorting
Charlie
fuente
fuente
Respuestas:
R , 55 bytes
Pruébalo en línea!
Reasigna el
+
operador (en realidad una función en R) a laorder
función, que devuelve los índices de un vector de menor a mayor. Entonces es solo manipulación de matriz.fuente
R , 55 bytes
Pruébalo en línea!
Alternativa a la respuesta de ngm ; Una función recursiva inspirada en la respuesta de DimChtz
fuente
Matlab,
736247 bytesPruébalo en línea!
-11 bytes gracias a @Giuseppe.
-15 bytes gracias a @LuisMendo.
fuente
Japt ,
1817 bytesnegativo para filas y positivo para columnas
Pruébalo en línea!
fuente
U
es negativo; sin embargo, la versión anterior de 17 bytes funciona.ß
que se aplica automáticamenteU
. Podría crear problemas al tratar de pasar cadenas literales, pero publicar una sugerencia al repositorio de GitHub de todos modos para una mayor investigación.05AB1E ,
252414 bytesEnorme -10 bytes gracias a @Emigna .
Utiliza una entrada entera positiva para ordenar las filas, negativa para las columnas.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
diø}Σ¹Ä<è]¹diø
cuál es un subconjunto tuyo, así que no publicaré una respuesta por separado.JavaScript (ES6), 90 bytes
Pruébalo en línea!
¿Cómo?
JS no tiene un método de transposición nativo, por lo que debemos definir uno:
Función principal:
fuente
MATL , 17 bytes
Pruébalo en línea!
O verificar todos los casos de prueba
Explicación
fuente
APL (Dyalog Classic) , 23 bytes
Pruébalo en línea!
fuente
Python 2 ,
7170 bytesPruébalo en línea!
Si
n
es negativo, las filas se ordenan según la columnan
.De lo contrario, la matriz se transpone, se ordena de la misma manera y se transpone nuevamente.
fuente
Jalea , 12 bytes
Pruébalo en línea!
fuente
C # (.NET Core) , 186 bytes
Pruébalo en línea!
Sin golf:
La función shift la usaremos dos veces, por lo que una variable de función ahorrará espacio. La función itera a través de la dimensión horizontal de la matriz en el índice y agrega cada elemento en ese índice de cada matriz horizontal a una nueva matriz de salida (horizontalmente), muy similar a la solución JS de Arnoud.
Ahora el orden es simple, ordene la matriz horizontal por número en el índice (argumento -1), opcionalmente desplazando la matriz antes y después de la clasificación.
Visto cómo la pregunta habla específicamente de arreglos, los convertimos a arreglos varias veces (muy, muy derrochador). Sentirse un poco tonto por usar un lenguaje tan detallado en el código de golf jeje.
fuente
C # (.NET Core) ,
142/139138/135 bytes (y otro -1 más por Kevin)Pruébalo en línea!
Sin golf:
Nuevo enfoque todo en línea; la respuesta negativa todavía ordena las matrices por elemento en el índice. De lo contrario, se crea una colección de value-index-pair del array-at-index y se ordena por valor. Esto crea efectivamente una colección de índices en orden de tener que ser agregado. Luego, para cada conjunto, se seleccionan los elementos en las posiciones predeterminadas. Bastante recorte de código y feo, feo, feo ** sollozos silenciosos ** implica la reutilización de los parámetros de entrada, y ahí tienes ... 142 bytes.
Nuevamente, el argumento de matrices se aplica estrictamente, agregando bastante sobrecarga para las llamadas .ToArray ().
Reclamación de 135 bytes, ¿eh? Las tuplas de valor inferido de C # 7.2 recortarían tres bytes adicionales, pero tio.run no lo permite. Por lo tanto, esta es la respuesta que decidí publicar para una fácil verificación.
fuente
(a,s)=>
Puede ser un currya=>s=>
.(s<0)?
no necesita el paréntesis, y-s-1
puede serlo~s
. Pruébelo en línea: 137 bytesJava (OpenJDK 8) , 326 bytes
Pruébalo en línea!
Bueno, muchachos, esta pregunta fue muy frustrante para mí, y publiqué mi respuesta SABIENDO que estaba olvidando algo, afortunadamente tenemos leyendas como Kevin Cruijssen aquí para ayudarnos :)
Java (OpenJDK 8) , 281 bytes
Pruébalo en línea!
fuente
a->b->
lugar de(a,b)->
eliminar lareturn
declaración, ya que está modificando la matriz de entrada. 281 bytes Sin embargo, sigue siendo una buena respuesta. +1 de mi parte Hice el desafío en 05AB1E, pero esta vez ni siquiera lo habría probado en Java. ;)Limpio , 95 bytes
Pruébalo en línea!
fuente
Kotlin , 192 bytes
Pruébalo en línea!
fuente
Ruby , 69 bytes
Pruébalo en línea!
fuente
Rojas ,
190185 bytesPruébalo en línea!
Explicación:
Mi solución real es de 175 bytes de largo, pero no funciona en TIO. Aquí está, trabajando normalmente en la consola roja:
Rojo , 175 bytes
fuente
VBA (Excel), 205 bytes
¡Hurra! ¡Segundo conteo de bytes más largo! No perdí por completo: D
Golfizado:
Esto ordena todos los datos en la hoja de trabajo abierta (activa) usando UsedRange ... que puede tener errores, pero solo debe contener celdas que se hayan editado.
Sin golf:
fuente
Sub d(a)
With Sheet1.Sort
.SortFields.Clear
.SortFields.Add IIf(a<0,Columns(Abs(a)),Rows(Abs(a)))
.SetRange Sheet1.UsedRange
.Orientation=(a<0)+2
.Apply
End With
End Sub
.SortFields
Definido, por lo que también puede eliminar la.Sortfields.Clear
línea.Perl 6 , 43 bytes
Pruébalo en línea!
Función curry
Explicación
fuente
Physica , 45 bytes
Muy similar a la respuesta JS de Arnauld .
Pruébalo en línea!
¿Cómo funciona?
Se puede encontrar una explicación más elaborada y visual en la respuesta vinculada.
fuente
J , 32 bytes
Pruébalo en línea!
Nota la
g=.
del verbo principal no cuenta.Una versión explícita para los mismos bytes.
J , 32 bytes
Pruébalo en línea!
fuente
Clojure, 91 bytes
Argh,
apply map list
* 2.fuente