Ordenar no tiene sentido para una matriz bidimensional ... ¿o sí?
Su tarea es tomar una cuadrícula de entrada y aplicarle un algoritmo de tipo burbuja hasta que todos los valores de la cuadrícula no disminuyan de izquierda a derecha y de arriba a abajo a lo largo de cada fila y columna.
El algoritmo funciona de la siguiente manera:
- Cada pase va fila por fila, de arriba abajo, comparando / intercambiando cada celda con sus vecinos derecho e inferior.
- si la celda es mayor que solo uno de sus vecinos derechos e inferiores, intercambie con el que es mayor que
- Si la celda es mayor que sus vecinos derecho e inferior, intercambie con el vecino más pequeño
- si la celda es mayor que sus vecinos derecho e inferior, que tienen el mismo valor, intercambie con el vecino inferior.
- si la celda no es mayor que cualquiera de sus vecinos derechos e inferiores, no haga nada
- Continúe esto hasta que no se realicen intercambios en todo el pase. Esto será cuando cada fila y columna estén en orden, de izquierda a derecha y de arriba a abajo.
Ejemplo
4 2 1
3 3 5
7 2 1
La primera fila del pase intercambiará el 4 y el 2, luego el 4 con el 1.
2 1 4
3 3 5
7 2 1
Cuando obtengamos el 3 del medio, se intercambiará con el 2 a continuación
2 1 4
3 2 5
7 3 1
Luego el 5 se intercambia con el 1 a continuación
2 1 4
3 2 1
7 3 5
La última fila de la primera pasada mueve el 7 completamente hacia la derecha
2 1 4
3 2 1
3 5 7
Luego volvemos a la fila superior nuevamente
1 2 1
3 2 4
3 5 7
Y continuar fila por fila ...
1 2 1
2 3 4
3 5 7
... hasta que la cuadrícula esté "ordenada"
1 1 2
2 3 4
3 5 7
Otro ejemplo
3 1 1
1 1 1
1 8 9
se convierte
1 1 1
1 1 1
3 8 9
más bien que
1 1 1
1 1 3
1 8 9
porque el intercambio hacia abajo tiene prioridad cuando los vecinos derecho e inferior de una celda son iguales.
Una implementación de referencia paso a paso se puede encontrar aquí .
Casos de prueba
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
se convierte
0 0 1 1 2 2 3 6
2 2 3 3 6 7 8 8
3 3 5 7 8 9 9 9
2 1 2 7 8 2 1 0
2 2 2 2 3 2 1 0
1 2 3 4 5 4 3 2
9 8 7 6 5 4 3 6
6 5 4 3 2 2 1 0
se convierte
0 0 0 1 1 1 2 2
1 1 2 2 2 2 2 2
2 2 2 2 3 3 3 3
3 4 4 4 4 5 6 6
5 5 6 7 7 8 8 9
Reglas
- Puede tomar la cuadrícula de entrada en cualquier formato conveniente
- Puede suponer que los valores de la cuadrícula son todos enteros no negativos en el rango de 16 bits sin signo (0-65535).
- Puede suponer que la cuadrícula es un rectángulo perfecto y no una matriz irregular. La cuadrícula será al menos 2x2.
- Si usa otro algoritmo de clasificación, debe proporcionar una prueba de que siempre producirá el mismo orden resultante que esta marca particular de clasificación de burbujas 2D, sin importar cuál sea la entrada. Espero que esto sea una prueba no trivial, por lo que probablemente sea mejor usar el algoritmo descrito.
¡Feliz golf!
Respuestas:
JavaScript (Node.js) , 129 bytes
Pruébalo en línea!
fuente
APL (Dyalog Unicode) , SBCS de 75 bytes
Gracias a @ Adám por guardar 11 bytes.
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 183 bytes
Pruébalo en línea!
No soy un experto en Mathematica, estoy seguro de que se puede hacer más corto. Particularmente creo que la declaración double if podría acortarse usando
Transpose
pero no sé cómo.fuente
R ,
169165144132 bytesPruébalo en línea!
fuente
Limpio , 240 bytes
Pruébalo en línea!
Implementa el algoritmo exactamente como se describe.
El enlace incluye análisis de entrada para tomar el formato en la pregunta.
fuente
Python 2 ,
215208 bytesPruébalo en línea!
-7 bytes, gracias a los ovs
fuente
C # (.NET Core) , 310 bytes
Sin LINQ Se usa System.Collections.Generic solo para formatear la salida después de que se devuelve la función. La cosa es estúpidamente enorme. Mirando hacia el golf!
Pruébalo en línea!
fuente
Python 2 , 198 bytes
Pruébalo en línea!
Desarrollado independientemente de la respuesta de TFeld, tiene algunas diferencias.
fuente
Carbón , 118 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. También he gastado algunos bytes en un formato más bonito. Explicación:
JavaScript tiene la propiedad conveniente que
a[i]>a[i+1]
es falsa sii
es el último elemento de la matriz. Para emular eso en el carbón, calculo unnan
por9.e999
flotación y luego lo resta de sí mismo. (El carbón no admite constantes de flotación exponencial). Luego relleno la matriz original a la derecha con elnan
y también agrego una fila adicional que contiene solo elnan
. (La indexación cíclica del carbón vegetal significa que solo necesito un elemento en esa fila).Bucle para cada elemento en la matriz. Esto debería ser bucles más que suficientes para hacer el trabajo, ya que también incluyo todos los
nan
s adicionales .Pase por encima de cada índice de fila y obtenga la fila en ese índice. (El carbón puede hacer ambas cosas con una expresión pero no con un comando). Esto incluye la fila ficticia, pero eso no es un problema porque todas las comparaciones fallarán.
Recorra cada índice de columna y obtenga el valor en ese índice. Nuevamente, esto repetirá los valores ficticios, pero las comparaciones simplemente fallarán nuevamente.
También obtenga los valores a la derecha y a continuación.
Si la celda es mayor que el valor de abajo y no es cierto que el valor de abajo es mayor que el valor de la derecha, entonces intercambie la celda con el valor de abajo.
De lo contrario, si la celda es mayor que el valor de la derecha, cámbielos.
Elimine los
nan
valores y formatee la matriz para la salida implícita.fuente
Kotlin , 325 bytes
Pruébalo en línea!
fuente