Tengo un montón de calcetines limpios que quiero clasificar en pares. Desafortunadamente, solo puedo tomar medias de cualquier extremo de la pila, no del medio. Además, solo puedo quitar los calcetines de la pila de un par a la vez. Mi estrategia es dividir primero la pila en una o más pilas más pequeñas. Creo que algunos ejemplos aclararán esto. Representaré cada calcetín como un entero positivo (los enteros coincidentes indican medias iguales).
Si la pila inicial de calcetines es
1 2 3 3 2 1
entonces no tengo que hacer ninguna división. Puedo quitar los dos 1
calcetines, luego los dos 2
y luego los dos 3
.
Si en cambio la pila inicial es
1 2 3 2 3 1
luego tengo que dividirlo primero porque no podré emparejar todos los calcetines simplemente quitándolos del final. Una posibilidad es dividirlo en dos pilas
1 2 3 and 2 3 1
Ahora puedo quitar los 1
calcetines, irme 2 3 and 2 3
, seguidos de los 3
calcetines, irme 2 and 2
y finalmente los 2
calcetines.
Tu trabajo
Dado el montón inicial de calcetines, escriba un programa que lo dividirá en montones más pequeños que me permitirán ordenar los calcetines. Su programa debe dividir la pila en la menor cantidad posible de pilas (si hay varias mejores soluciones, solo necesita encontrar una).
La entrada se dará como una lista, cadena delimitada u otra forma conveniente. Contendrá solo enteros entre 1
y un valor máximo n
, con cada entero exactamente dos veces.
El resultado debe consistir en la lista de entrada dividida en listas más pequeñas, en cualquier forma conveniente.
Ejemplos
Input Sample Output
1 1 1 1
1 2 1 2 1; 2 1 2
1 3 2 4 3 2 1 4 1 3 2; 4 3 2 1 4
1 2 3 4 3 4 1 2 1; 2 3; 4 3 4 1 2
1 1 2 2 3 3 1 1 2; 2 3 3
4 3 4 2 2 1 1 3 4 3 4 2; 2 1 1 3
Tenga en cuenta que esta no es la única salida permitida para la mayoría de estas entradas. Para el segundo caso, por ejemplo, las salidas 1 2; 1 2
o 1 2 1; 2
también serían aceptadas.
¡Gracias a Sp3000 por algunas sugerencias de prueba!
Odio pasar mucho tiempo clasificando mi ropa, así que haga su código lo más corto posible. ¡La respuesta más corta en bytes gana!
Notas
- No quiero tener que mirar detrás de un calcetín para ver si su par coincidente está ahí, por lo que no está permitido tomar ambos calcetines en un par del mismo extremo. Por ejemplo, si el montón es
1 1 2 2
así, no podría dejarlo como un montón y tomar ambos1
calcetines del extremo izquierdo.
123213
, ¿ podría dividirse en1; 23; 213
(1; 23; 213
->1; 2; 21
->; 2; 2
)?123213
usando solo dos pilas, su respuesta tendría que dar una de las divisiones de dos pilas.Respuestas:
Pyth, 25 bytes
Banco de pruebas
Explicación:
fuente
JavaScript (ES6), 329
No es una tarea fácil para un lenguaje que no tiene incorporados combinatorios.
Probablemente un poco más golfable.
Nota: todas las particiones son al menos de tamaño 2, ya que una partición con un solo elemento siempre es menos útil.
Explicación en partes
(es demasiado detallado, pero me resultó difícil de explicar, eventualmente salte a "poner todo junto")
Una función recursiva para enumerar todas las divisiones posibles de una matriz
Ahora, necesito particiones de tamaño 2 o más, por lo que debo usar esta función con parámetros ligeramente diferentes. El parámetro v es "tamaño de matriz - número de particiones deseadas - 1". Luego debo construir las particiones de una manera ligeramente diferente.
Por lo tanto, puedo enumerar la lista de particiones sin división, 1 división, 2 divisiones, etc. Cuando encuentre una partición que funcione, me detendré y mostraré el resultado encontrado.
Para verificar, escanee la lista de particiones, tenga en cuenta los valores al inicio y al final de cada uno, si encuentra un valor reparado, elimínelo. Repita hasta que no se pueda eliminar nada, por fin: si se eliminaron todos los pares, entonces esta partición es buena.
Entonces, la parte que falta es solo un ciclo que llama a la función G y aumenta el recuento de particiones. La salida del bucle cuando se encuentra un resultado.
Ponlo todo junto
Prueba
fuente