Introducción
Un disco es un contenedor lineal con bloques indexados 0
a través size-1
.
Un archivo es una lista con nombre de índices de bloque utilizados por ese archivo.
Un sistema de archivos de ejemplo se expresa así:
15 ALPHA=3,5 BETA=11,10,7
"El disco tiene 15 bloques, el primer bloque de archivo ALPHA es el bloque de disco en el índice 3 ..."
El mapa del disco podría dibujarse así:
Block Index 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
Contents | | | |A0 | |A1 | |B2 | | |B1 |B0 | | | |
Un disco se considera desfragmentado cuando todos los archivos que contiene se almacenan de manera contigua.
TU META:
Emitir una secuencia más corta de movimientos legales que desfragmentarán un disco determinado.
Movimientos Legales
Un movimiento contiene tres piezas de información: el nombre de un archivo, un índice del bloque en el archivo que se va a mover y el índice del bloque de disco al que se mueve.
Por ejemplo
ALPHA:1>4
"Mueva el bloque 1 del archivo ALPHA al bloque 4 del disco".
Después de este movimiento, el sistema de archivos de ejemplo ahora es este
15 ALPHA=3,4 BETA=11,10,7
Block Index 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
Contents | | | |A0 |A1 | | |B2 | | |B1 |B0 | | | |
El bloque de disco previamente habitado se borra implícitamente. De manera equivalente, puede ver esto como el intercambio de dos bloques en el disco, pero uno de los bloques en el intercambio debe estar vacío .
Los datos no pueden ser destruidos. Los archivos no pueden compartir bloques en ninguna etapa y los movimientos deben estar dentro del alcance del disco. Los siguientes movimientos son ilegales : ALPHA:0>10
(propiedad de BETA), ALPHA:3>0
(no existe tal bloqueo en ALPHA),ALPHA:0>-1
(no existe dicho índice de disco), ALPHA:0>15
(índice de disco demasiado grande)
Ejemplo 1
Resolviendo el ejemplo anterior en su totalidad.
ALPHA:0>4
BETA:0>9
BETA:2>11
Los archivos no tienen que ser adyacentes en la solución, solo continuos dentro de sí mismos.
Ejemplo 2
Aquí hay un caso más restringido
Entrada:
10 A=1,2,3 B=6,7,8 C=4,5,0
Salida:
B:2>9
B:1>8
B:0>7
C:2>6
La progresión de este sistema de archivos es:
Block Index 00 01 02 03 04 05 06 07 08 09
Contents |C2 |A0 |A1 |A2 |C0 |C1 |BO |B1 |B2 | |
|C2 |A0 |A1 |A2 |C0 |C1 |BO |B1 | |B2 |
|C2 |A0 |A1 |A2 |C0 |C1 |BO | |B1 |B2 |
|C2 |A0 |A1 |A2 |C0 |C1 | |B0 |B1 |B2 |
| |A0 |A1 |A2 |C0 |C1 |C2 |B0 |B1 |B2 |
Una forma alternativa de desfragmentar esto sería C:2>9
luego A
bajar un paso, luego C
bajar un paso, luego hacerlo, C:2>5
pero esto no sería una solución legal porque contiene más movimientos que la alternativa .
Representación
Puede usar cualquier representación para la entrada siempre que esté razonablemente cerca de una cadena básica. Dependiendo de su idioma, la entrada al primer ejemplo se puede anotar como
"15 ALPHA=3,5 BETA=11,10,7"
[15," ","ALPHA","=",3,",",5," ","BETA","=",11,",",10,",",7]
(15,(("ALPHA",(3,5)),("BETA",(11,10,7))))
etc
Del mismo modo, la salida puede ser lo que sea conveniente para su idioma, ya que se imprime, puede leerse por humanos y representa una lista ordenada de movimientos legales, cada movimiento se describe con 1) nombre de archivo, 2) índice de bloque de archivo , 3) índice de bloque de disco nuevo
"ALPHA:1>6 BETA:2>9"
(0=>(0=>"ALPHA",1=>"1",2=>"6"), 1=>(0=>"BETA",1=>"2",2=>"9"))
["ALPHA",1,6,"BETA",2,9]
etc
Requisitos
Su código debe aceptar cualquier tamaño de disco y cualquier número y tamaño de archivos.
Las entradas que no describen los estados legales iniciales del sistema de archivos pueden conducir a un comportamiento indefinido.
Su código debe producir una solución de movimientos más cortos , para cualquier entrada bien definida.
Todos los movimientos que produzcas deben ser legales; el sistema de archivos debe estar en un estado válido después de aplicar cada paso que produzca.
Su código debe terminar para todas las entradas válidas, es decir, nunca debe bloquearse en un bucle, el sistema de archivos debe estar en un estado claramente nuevo después de aplicar cada movimiento.
Cuando existe más de una solución más corta, cualquiera puede seleccionarse como válida.
El código más corto gana. Publique al menos una nueva entrada de ejemplo no trivial y su salida con su código.
Respuestas:
Python 3 , 295 bytes
Pruébalo en línea!
Otro caso de prueba
Versión sin golf .
fuente