Найменше диск записує для дефрагментації декількох файлів


18

Вступ

Диск - це лінійний контейнер з блоками, проіндексовані 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

Вимоги

Ваш код повинен приймати диск будь-якого розміру та будь-яке число та розмір файлів.

Входи, які не описують початкові стани файлової системи, можуть призвести до невизначеної поведінки.

Ваш код повинен створювати рішення для найкоротших переміщень для будь-якого чітко визначеного введення.

Усі ваші кроки повинні бути законними; файлова система повинна бути у дійсному стані після застосування кожного кроку, який ви створюєте.

Ваш код повинен припинятись для всіх дійсних входів, тобто він ніколи не повинен застрявати в циклі, файлова система повинна бути у виразно новому стані після застосування кожного ходу.

Там, де існує більше одного найкоротшого рішення, будь-яке може бути обране як дійсне.

Найкоротший код виграє. Будь ласка, опублікуйте принаймні один новий нетривіальний приклад введення та його вихід із кодом.


Як ми могли б знайти, скільки часу "найкоротша послідовність" для довільного диска? (Запитуючи, тому що якщо у відповіді А сказано, що найкоротший - 6 ходів, а відповідь Б - найкоротший - 5, чи відповідає відповідь А, то дискваліфікується?)
ASCIIThenANSI

Перший пошук за шириною може запропонувати довідкове рішення при необхідності.
шприц

2
Це, мабуть, буде краще працювати як проблема [атомний код-гольф]. Так ви отримаєте більше відповідей. Замість найкоротшого коду переможцем стала б відповідь з найменшими записами на диску.
mbomb007

Відповіді:


1

Python 3 , 295 байт

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]}

Спробуйте в Інтернеті!


Ще один тестовий випадок

Вхід:
   7 ALEF = 6,4,0 BET = 5,1 GIMEL = 3

Початковий стан диска:
   A2 B1 __ G0 A1 B0 A0

Рішення:
   ALEF: 2> 2
   ALEF: 0> 0
   БЕТ: 1> 6
   ALEF: 1> 1

Візуалізоване рішення:
   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

Безгольова версія .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.