Pocos discos escriben para desfragmentar múltiples archivos

18

Introducción

Un disco es un contenedor lineal con bloques indexados 0a 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>9luego Abajar un paso, luego Cbajar un paso, luego hacerlo, C:2>5pero 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.

rociar
fuente
¿Cómo encontraríamos cuánto dura la "secuencia más corta" para un disco arbitrario? (Preguntando porque si la respuesta A dice que la más corta es de 6 movimientos y la respuesta B dice que la más corta es 5, ¿la respuesta A se descalifica?)
ASCIIThenANSI
Breadth-first-search puede proporcionar una solución de referencia si es necesario.
Spray
2
Esto probablemente funcionaría mejor como un desafío [atomic-code-golf]. Obtendrá más respuestas de esa manera. En lugar del código más corto, el ganador sería la respuesta con la menor cantidad de escrituras en disco.
mbomb007

Respuestas:

1

Python 3 , 295 bytes

S,F=eval(input());d=[0]*S;E=enumerate
for n,P in F:
 for j,p in E(P):d[int(p)]=n,j
Z=[(d,())]
while Z:d,p=Z.pop(0);any(e and(e[0],e[1]+1)in d and(S<j+2or(e[0],e[1]+1)!=d[j+1])for j,e in E(d))or print(p).q;{d[j]or exec("D=d[:];D[j]=e;D[k]=0;Z+=(D,p+(e,j)),")for j,_ in E(d)for k,e in E(d)if d[k]}

Pruébalo en línea!


Otro caso de prueba

Entrada:
   7 ALEF = 6,4,0 BET = 5,1 GIMEL = 3

Estado inicial del disco:
   A2 B1 __ G0 A1 B0 A0

Solución:
   ALEF: 2> 2
   ALEF: 0> 0
   APUESTA: 1> 6
   ALEF: 1> 1

Solución visualizada:
   A2 B1 __ G0 A1 B0 A0
   __ B1 A2 G0 A1 B0 A0
   A0 B1 A2 G0 A1 B0 __
   A0 __ A2 G0 A1 B0 B1
   A0 A1 A2 G0 __ B0 B1

Versión sin golf .

Jonathan Frech
fuente