Birden çok dosyayı birleştirmek için en az disk yazıyor


18

Giriş

Bir disk endeksli blokları olan bir doğrusal konteyner 0aracı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>9daha sonra Abir adım aşağı çekmek, sonra Cbir adım aşağı çekmek, sonra yapmaktır, C:2>5ancak 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.


"En kısa sıralamanın" keyfi bir disk için ne kadar sürdüğünü nasıl bulabiliriz? (A cevabının en kısa 6 hamle ve B cevabının en kısa 5 olduğunu söylüyorsa, A cevabı diskalifiye olur mu
diye soruyorlar.

Genişlik ilk arama, gerekirse bir referans çözüm sağlayabilir.
spraff

2
Bu muhtemelen bir [atom-kod-golf] meydan okuması olarak daha iyi çalışır. Bu şekilde daha fazla cevap alacaksınız. En kısa kod yerine, kazanan en az disk yazılan cevap olacaktır.
mbomb007

Yanıtlar:


1

Python 3 , 295 bayt

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

Çevrimiçi deneyin!


Başka bir test örneği

Giriş:
   7 ALEF = 6,4,0 BAHİS = 5,1 GIMEL = 3

İlk disk durumu:
   A2 B1 __ G0 A1 B0 A0

Çözüm:
   ALEF: 2> 2
   ALEF: 0> 0
   BET: 1> 6
   ALEF: 1> 1

Görselleştirilmiş çözüm:
   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

Ungolfed sürümü .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.