Con una ventana similar a la que se muestra a continuación, se le proporciona una lista de cadenas, que desea poner en orden alfabético.
Como se muestra, tiene cinco operaciones:
- Mover hacia arriba [U]: mueve la cadena seleccionada hacia arriba un lugar
- Mover hacia abajo [D]: mueve la cadena seleccionada hacia abajo un lugar
- Mover primero [F]: mueve la cadena seleccionada al principio de la lista
- Mover último [L]: mueve la cadena seleccionada al final de la lista
- Invertir [R]: invierte el orden de la lista
Con STDIN, acepte un número (cuántas cadenas), seguido de la lista desordenada de cadenas. Cada cadena consta de 2-99 letras en inglés minúsculas. (El ejemplo anterior no sería una entrada válida).
Con STDOUT, imprima la forma de ordenar la lista. Primero, mencione un elemento para seleccionar, y luego las operaciones a realizar en él para poner la lista en orden alfabético.
Por ejemplo: February U December F May D D June D R D...
Explicación: Haga clic en febrero, muévalo hacia arriba 1. Seleccione Diciembre, muévalo hacia arriba. Mayo, muévelo hacia abajo dos veces. Junio, baja una vez, invierte la lista, baja otra vez ...
Como obviamente hay muchas soluciones válidas, debe elegir la más corta posible. Es decir, elija el método con el menor número de operaciones (7 en el ejemplo anterior).
Si hay un vínculo entre las salidas correctas con la entrada, resuélvalas en el siguiente orden.
Elija el que tenga menos selecciones de cadena (4 en el ejemplo anterior).
Elija el que tenga la menor cantidad de operaciones, contando operaciones idénticas consecutivas (en una cadena) como una (6 en el ejemplo anterior).
Elija el que tenga la salida más corta (menor número de caracteres totales, espacios de conteo).
Elija el que tiene la salida que viene primero alfabéticamente.
Este es el código de golf; gana el envío más corto que siempre produce el resultado correcto.
Ejemplos
- EN
2 zz abc
- FUERA
zz D
- FUERA
- EN
3 cc bb aa
- FUERA
aa R
- FUERA
- EN
4 abc def cd ccc
- FUERA
abc L R
- FUERA
- EN
6 rr mm nn oo qq pp
- FUERA
pp U rr L
- FUERA
Ejemplos adicionales (proporcionados por Scott Leadley, cualquier error es mío y no de ypnypn)
Algunos casos difíciles:
- IN => OUT
6 xx aa dd bb ee cc
=>dd L ee L xx L
7 aa bb ee cc dd ff gg
=>ee D D
8 dd ww aa bb cc xx yy zz
=>ww D D D dd D D D
- ( no el número mínimo de movimientos, que sería
cc F bb F aa F
)
- ( no el número mínimo de movimientos, que sería
Permutaciones de 4 elementos aa bb cc dd
con rutas de clasificación de longitud> 1:
- IN => OUT
4 aa cc dd bb
=>bb F D
4 aa dd cc bb
=>aa L R
4 bb aa dd cc
=>aa F cc U
4 bb dd aa cc
=>aa F cc U
4 bb dd cc aa
=>bb D D R
4 cc aa bb dd
=>cc D D
4 cc aa dd bb
=>bb F aa F
4 cc bb aa dd
=>dd F R
4 cc bb dd aa
=>dd F R
4 cc dd aa bb
=>bb F aa F
4 cc dd bb aa
=>cc D R
4 dd aa cc bb
=>aa L R
4 dd bb aa cc
=>cc F D R
4 dd bb cc aa
=>bb D R
4 dd cc aa bb
=>aa D R
Variaciones sobre un tema, 4 elementos aaaaa bbbb ccc dd
donde la longitud de la cadena marca la diferencia:
- IN => OUT
4 ccc dd aaaaa bbbb
=>ccc L dd L
4 bbbb aaaaa dd ccc
=>bbbb D dd D
4 bbbb dd aaaaa ccc
=>dd L bbbb D
4 ccc aaaaa dd bbbb
=>ccc L dd L
4 ccc dd bbbb aaaaa
=>dd F R
4 dd bbbb ccc aaaaa
=>ccc R D
4 dd ccc aaaaa bbbb
=>bbbb R D
A
que no existe.ddkP
, D =ddp
, F =ddggP
, L =ddGp
, R =:g/^/m0
. : PRespuestas:
Python 2 -
593521Es una fuerza muy bruta con algunas eficiencias, por lo que en realidad terminaría. La lista de 6 elementos con los que estoy probando está tomando alrededor de 5 segundos en mi computadora portátil.
Tenga en cuenta que estoy ignorando el número en la entrada. Lo encuentro inútil.
Ugh, me acabo de dar cuenta de que no estoy manejando varias operaciones con el mismo valor correctamente. Trataré de arreglar eso.
fuente
Ruby 2.0
Con el operador configurado [U, D, F, L], el menor número de selecciones de cadena para ordenar la lista es el número de elementos en la lista menos la subsecuencia común más larga. Para agregar el operador R, simplemente invierta la cadena y aplique la misma regla. Desafortunadamente, minimizar las selecciones de cadenas no es lo mismo que minimizar el número de operaciones. Por ejemplo, para una entrada de
8 dd ww aa bb cc xx yy zz
, la respuesta correcta esww D D D dd D D D
, pero sería la menor cantidad de operaciones (que cumpla con los otros criterios en la pregunta)cc F bb F aa F
. Esto significa que es necesario explorar una porción mucho más grande del conjunto de posibles rutas de clasificación.Esta solución utiliza una estrategia de búsqueda de profundidad y poda alfa-beta. Es importante bajar el valor alfa rápidamente para minimizar la profundidad de búsqueda, de lo contrario el árbol de búsqueda explota exponencialmente. Por ejemplo, para determinar la ruta de clasificación con el puntaje mínimo para el ejemplo introductorio de OP, clasificar los meses en orden de calendario en orden léxico, probablemente tomará algunas décadas con el método de puntuación actual de este programa. El programa encuentra el número mínimo de selecciones de cadena, 8, muy rápidamente. Desafortunadamente, eso todavía deja un árbol enorme por el que caminar.
Estoy usando gnome sort como mi función de puntuación porque:
El número 4 sería suficiente. Todo lo demás es un extra.
Para una búsqueda en profundidad, el orden en que se exploran las operaciones tiene un impacto significativo en el tiempo de búsqueda. Dado que cualquier conjunto no vacío de N elementos puede clasificarse con operaciones ≤ N-1 F (primero) o L (ast), esas operaciones se intentan primero.
Pasa este conjunto de pruebas TAP perl :
fuente