Giriş
Bir disk endeksli blokları olan bir doğrusal konteyner 0
aracılığıyla size-1
.
Bir dosya, söz konusu dosya tarafından kullanılan adlandırılmış bir blok dizinler listesidir.
Örnek bir dosya sistemi şöyle ifade edilir:
15 ALPHA=3,5 BETA=11,10,7
"Diskin 15 bloğu var, ALPHA dosyasının ilk bloğu dizin 3'teki disk bloğudur ..."
Disk haritası şu şekilde çizilebilir:
Block Index 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
Contents | | | |A0 | |A1 | |B2 | | |B1 |B0 | | | |
Bir disk, içindeki tüm dosyalar bitişik olarak saklandığında birleştirilmiş olarak değerlendirilir.
SENİN HEDEFİN:
Belirli bir diski birleştirecek en kısa yasal hamle dizisi yayar .
Yasal Hareketler
Bir taşıma üç bilgi içerir: bir dosyanın adı , taşınacak dosyadaki bloğun bir dizini ve taşındığı disk bloğunun dizini .
Örneğin
ALPHA:1>4
Msgstr "ALPHA dosyasının blok 1'ini diskin 4'üne taşıyın."
Bu taşıma işleminden sonra, örnek dosya sistemi şimdi
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 | | | |
Önceden yerleşik disk bloğu dolaylı olarak temizlenir. Aynı şekilde, bunu diskteki iki bloğu değiştirerek de görebilirsiniz, ancak takastaki bloklardan biri boş olmalıdır .
Veriler imha edilemez. Dosyalar hiçbir aşamada blok paylaşamaz ve hareketler diskin kapsama alanı içinde olmalıdır. Aşağıdaki hamleler yasa dışı : ALPHA:0>10
(BETA'ya ait), ALPHA:3>0
(ALPHA'da böyle bir blok yok), ALPHA:0>-1
(böyle bir disk dizini yok),ALPHA:0>15
(disk dizini çok büyük)
örnek 1
Yukarıdaki örneği tam olarak çözme.
ALPHA:0>4
BETA:0>9
BETA:2>11
Dosyaların çözüme bitişik olması gerekmez, sadece kendi içlerinde süreklidir.
ÖRNEK 2
İşte daha kısıtlı bir durum
Giriş:
10 A=1,2,3 B=6,7,8 C=4,5,0
Çıktı:
B:2>9
B:1>8
B:0>7
C:2>6
Bu dosya sisteminin ilerlemesi:
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 |
Bunu birleştirmenin alternatif bir yolu C:2>9
daha sonra A
bir adım aşağı çekmek, sonra C
bir adım aşağı çekmek, sonra yapmaktır, C:2>5
ancak bu alternatif bir çözümden daha fazla hamle içerdiğinden yasal bir çözüm olmaz. .
temsil
Temel bir dizeye oldukça yakın olduğu sürece giriş için herhangi bir gösterimi kullanabilirsiniz. Dilinize bağlı olarak, ilk örneğe giriş şu şekilde not edilebilir:
"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
Benzer şekilde, çıktı, yazdırıldığı gibi günlük olarak diliniz için uygun olan her şey olabilir, insan tarafından okunabilir ve yasal hareketlerin sıralı bir listesini temsil eder, her hareket 1) dosya adı, 2) dosya bloğu dizini ile tanımlanır , 3) yeni disk-blok-endeksi
"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
Gereksinimler
Kodunuz herhangi bir boyut diski ile herhangi bir sayı ve boyutta dosyayı kabul etmelidir.
Yasal başlangıç dosya sistemi durumlarını tanımlamayan girdiler tanımlanmamış davranışa yol açabilir.
İyi tanımlanmış herhangi bir girdi için kodunuzun en kısa hamle çözümünü üretmesi gerekir .
Ürettiğiniz tüm hamleler yasal olmalıdır; oluşturduğunuz her adımı uyguladıktan sonra dosya sistemi geçerli bir durumda olmalıdır.
Kodunuz tüm geçerli girdiler için sonlandırılmalıdır, yani her döngüde hiçbir zaman takılmamalı, her hareket uygulandıktan sonra dosya sistemi tamamen yeni bir durumda olmalıdır.
Birden fazla en kısa çözüm olduğunda, herhangi biri geçerli olarak seçilebilir.
En kısa kod kazanır. Lütfen en az bir yeni önemsiz örnek girdi ve çıktıyı kodunuzla birlikte gönderin.