Wprowadzenie
Dysk jest liniową pojemnik z bloków indeksowanych 0
przez size-1
.
Plik to nazwana lista indeksów bloków używanych przez ten plik.
Przykładowy system plików jest wyrażony w następujący sposób:
15 ALPHA=3,5 BETA=11,10,7
„Dysk ma 15 bloków, pierwszym blokiem pliku ALPHA jest blok dysku o indeksie 3 ...”
Mapę dysku można narysować w następujący sposób:
Block Index 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
Contents | | | |A0 | |A1 | |B2 | | |B1 |B0 | | | |
Dysk uważa się za zdefragmentowany, gdy wszystkie znajdujące się na nim pliki są przechowywane w sposób ciągły.
TWÓJ CEL:
Emituj najkrótszą sekwencję legalnych ruchów, która zdefragmentuje dany dysk.
Legalne ruchy
Ruch zawiera trzy informacje: nazwę pliku, indeks bloku w pliku, który ma zostać przeniesiony, oraz indeks bloku dysku, do którego się przenosi.
Na przykład
ALPHA:1>4
„Przenieś blok 1 pliku ALPHA do bloku 4 dysku.”
Po tym przeniesieniu przykładowy system plików jest teraz taki
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 | | | |
Poprzednio zamieszkały blok dysku jest domyślnie usuwany. Odpowiednio można to postrzegać jako zamianę dwóch bloków na dysku, ale jeden z bloków w zamianie musi być pusty .
Dane nie mogą zostać zniszczone. Pliki nie mogą współużytkować bloków na żadnym etapie, a ruchy muszą znajdować się w zasięgu dysku. Następujące ruchy są nielegalne : ALPHA:0>10
(własność BETA), ALPHA:3>0
(brak takiego bloku w ALPHA), ALPHA:0>-1
(brak takiego indeksu dysku), ALPHA:0>15
(indeks dysku zbyt duży)
Przykład 1
Rozwiązanie powyższego przykładu w całości.
ALPHA:0>4
BETA:0>9
BETA:2>11
Pliki nie muszą przylegać do rozwiązania, tylko ciągłe w sobie.
Przykład 2
Oto bardziej ograniczony przypadek
Wejście:
10 A=1,2,3 B=6,7,8 C=4,5,0
Wynik:
B:2>9
B:1>8
B:0>7
C:2>6
Postęp tego systemu plików jest następujący:
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 |
Alternatywnym sposobem na to by przez oszukiwać, aby C:2>9
następnie doprowadzić A
dół krok, a następnie przynieść C
dół krok, potem zrobić C:2>5
, ale to nie byłoby to rozwiązanie prawne, ponieważ zawiera więcej ruchów niż alternatywa .
Reprezentacja
Możesz użyć dowolnej reprezentacji danych wejściowych, o ile jest ona dość zbliżona do podstawowego ciągu. W zależności od języka dane wejściowe do pierwszego przykładu można zapisać jako
"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
Podobnie, wyjście może być tym, co jest wygodne dla twojego języka, ponieważ dziennik jest drukowany, czytelny dla człowieka i reprezentuje uporządkowaną listę legalnych ruchów, przy czym każdy ruch jest opisany przez 1) nazwa-pliku, 2) indeks-bloku-pliku , 3) indeks nowego bloku dysku
"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
Wymagania
Twój kod musi akceptować dysk o dowolnym rozmiarze oraz dowolną liczbę i rozmiar plików.
Dane wejściowe, które nie opisują początkowych stanów systemu plików, mogą prowadzić do nieokreślonego zachowania.
Twój kod musi generować najkrótsze ruchy , dla każdego dobrze zdefiniowanego wejścia.
Wszystkie wykonywane ruchy muszą być legalne; system plików musi znajdować się w poprawnym stanie po zastosowaniu każdego wykonanego kroku.
Twój kod musi kończyć się dla wszystkich poprawnych danych wejściowych, tj. Nigdy nie powinien utknąć w pętli, system plików powinien być w wyraźnie nowym stanie po zastosowaniu każdego ruchu.
Jeśli istnieje więcej niż jedno najkrótsze rozwiązanie, każde można wybrać jako prawidłowe.
Najkrótszy kod wygrywa. Proszę zamieścić co najmniej jedno nowe nietypowe przykładowe wejście i jego wynik wraz z kodem.