Вступ
Диск - це лінійний контейнер з блоками, проіндексовані 0
наскрізь size-1
.
Файл - це названий список індексів блоків, використовуваних цим файлом.
Приклад файлової системи виражається так:
15 ALPHA=3,5 BETA=11,10,7
"Диск містить 15 блоків. Перший блок файлу ALPHA - це блок диска в індексі 3 ..."
Карта диска може бути намальована так:
Block Index 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
Contents | | | |A0 | |A1 | |B2 | | |B1 |B0 | | | |
Диск вважається дефрагментованим, коли всі файли в ньому зберігаються безперервно.
ВАША ЦІЛЬ:
Випустіть найкоротшу послідовність законних кроків, яка дефрагментує певний диск.
Юридичні рухи
Хід містить три фрагменти інформації: ім'я файлу, індекс блоку у файлі, який потрібно перемістити, та індекс блоку диска, до якого він переміщується.
Наприклад
ALPHA:1>4
"Перемістіть блок 1 файлу ALPHA до блоку 4 диска."
Після цього переходу прикладна файлова система тепер це
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 | | | |
Раніше заселений диск диска неявно очищається. У рівному випадку ви можете розглядати це як заміну двох блоків на диску, але один з блоків в свопі повинен бути порожнім .
Дані не можуть бути знищені. Файли не можуть ділитися блоками на будь-якому етапі, і рухи повинні бути в межах діапазону диска. Наступні кроки є незаконними : ALPHA:0>10
(належить BETA), ALPHA:3>0
(немає такого блоку в ALPHA), ALPHA:0>-1
(немає такого дискового індексу), ALPHA:0>15
(індекс диска занадто великий)
Приклад 1
Вирішення наведеного прикладу в повному обсязі.
ALPHA:0>4
BETA:0>9
BETA:2>11
Файли не повинні бути сусідніми в розчині, а лише безперервно всередині себе.
Приклад 2
Ось більш обмежений випадок
Вхід:
10 A=1,2,3 B=6,7,8 C=4,5,0
Вихід:
B:2>9
B:1>8
B:0>7
C:2>6
Прогресування цієї файлової системи:
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 |
Альтернативним способом дефрагментації цього методу є те, щоб C:2>9
потім A
збити крок, потім C
збити крок, а потім зробити, C:2>5
але це не було б правовим рішенням, оскільки воно містить більше кроків, ніж альтернатива .
Представництво
Ви можете використовувати будь-яке представлення для введення, якщо воно досить близьке до базового рядка. Залежно від вашої мови, вхід до першого прикладу може бути позначений як
"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
Аналогічно, вихід може бути будь-яким зручним для вашої мови, як журнал, оскільки він друкується, читається людиною та являє собою упорядкований список легальних кроків, кожен крок описується 1) ім'ям файлу, 2) файловим блоком-індексом , 3) індекс-новий-блок-індекс
"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
Вимоги
Ваш код повинен приймати диск будь-якого розміру та будь-яке число та розмір файлів.
Входи, які не описують початкові стани файлової системи, можуть призвести до невизначеної поведінки.
Ваш код повинен створювати рішення для найкоротших переміщень для будь-якого чітко визначеного введення.
Усі ваші кроки повинні бути законними; файлова система повинна бути у дійсному стані після застосування кожного кроку, який ви створюєте.
Ваш код повинен припинятись для всіх дійсних входів, тобто він ніколи не повинен застрявати в циклі, файлова система повинна бути у виразно новому стані після застосування кожного ходу.
Там, де існує більше одного найкоротшого рішення, будь-яке може бути обране як дійсне.
Найкоротший код виграє. Будь ласка, опублікуйте принаймні один новий нетривіальний приклад введення та його вихід із кодом.