Ít đĩa nhất ghi để chống phân mảnh nhiều tệp


18

Giới thiệu

Một đĩa là một thùng chứa tuyến tính với các khối được lập chỉ mục 0thông qua size-1.

Một tệp là một danh sách có tên của các chỉ mục khối được sử dụng bởi tệp đó.

Một hệ thống tập tin ví dụ được thể hiện như thế này:

15 ALPHA=3,5 BETA=11,10,7

"Đĩa có 15 khối, khối đầu tiên của tệp ALPHA là khối đĩa ở chỉ mục 3 ..."

Bản đồ đĩa có thể được vẽ như thế này:

Block Index  00  01  02  03  04  05  06  07  08  09  10  11  12  13  14
Contents    |   |   |   |A0 |   |A1 |   |B2 |   |   |B1 |B0 |   |   |   |

Một đĩa được coi là phân mảnh khi tất cả các tệp trong đó được lưu trữ liên tục.

MỤC TIÊU CỦA BẠN:

Phát ra một chuỗi ngắn nhất của các động thái hợp pháp sẽ chống phân mảnh một đĩa nhất định.

Di chuyển hợp pháp

Một di chuyển chứa ba mẩu thông tin: tên của một tệp, một chỉ mục của khối trong tệp sẽ được di chuyển và chỉ mục của khối đĩa mà nó di chuyển đến.

Ví dụ

ALPHA:1>4

"Di chuyển khối 1 của tệp ALPHA sang khối 4 của đĩa."

Sau động thái này, hệ thống tệp ví dụ bây giờ là

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

Khối đĩa có người ở trước đó bị xóa hoàn toàn. Tương tự, bạn có thể xem điều này như hoán đổi hai khối trên đĩa nhưng một trong các khối trong trao đổi phải trống .

Dữ liệu có thể không bị phá hủy. Các tệp không thể chia sẻ các khối ở bất kỳ giai đoạn nào và các chuyển động phải nằm trong phạm vi của đĩa. Các động thái sau đây là bất hợp pháp : ALPHA:0>10(thuộc sở hữu của BETA), ALPHA:3>0(không có khối như vậy trong ALPHA), ALPHA:0>-1(không có chỉ số đĩa như vậy), ALPHA:0>15(chỉ mục đĩa quá lớn)

ví dụ 1

Giải quyết ví dụ trên đầy đủ.

ALPHA:0>4
BETA:0>9
BETA:2>11

Các tập tin không phải liền kề trong giải pháp, chỉ cần liên tục trong chính chúng.

Ví dụ 2

Đây là một trường hợp hạn chế hơn

Đầu vào:

10 A=1,2,3 B=6,7,8 C=4,5,0

Đầu ra:

B:2>9
B:1>8
B:0>7
C:2>6

Sự phát triển của hệ thống tập tin này là:

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 |

Một cách khác để chống phân mảnh điều này bằng cách C:2>9sau đó đưa Axuống một bước, sau đó đưa Cxuống một bước, sau đó thực hiện C:2>5nhưng đây sẽ không phải là một giải pháp hợp pháp vì nó chứa nhiều di chuyển hơn so với thay thế .

Đại diện

Bạn có thể sử dụng bất kỳ biểu diễn nào cho đầu vào miễn là nó gần với chuỗi cơ bản. Tùy thuộc vào ngôn ngữ của bạn, đầu vào của ví dụ đầu tiên có thể được ký hiệu là

"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

Tương tự, đầu ra có thể là bất cứ điều gì thuận tiện cho ngôn ngữ của bạn khi nhật ký được in, có thể đọc được và thể hiện một danh sách các lệnh di chuyển hợp pháp, mỗi di chuyển được mô tả bởi 1) tên tệp, 2) chỉ mục chặn tệp , 3) chỉ mục khối đĩa mới

"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

Yêu cầu

Mã của bạn phải chấp nhận bất kỳ kích thước đĩa, và bất kỳ số lượng và kích thước của tệp.

Các đầu vào không mô tả trạng thái hệ thống tập tin ban đầu hợp pháp có thể dẫn đến hành vi không xác định.

Mã của bạn phải tạo ra một giải pháp di chuyển ngắn nhất , cho bất kỳ đầu vào nào được xác định rõ.

Tất cả các động thái bạn sản xuất phải hợp pháp; hệ thống tập tin phải ở trạng thái hợp lệ sau khi áp dụng từng bước bạn sản xuất.

Mã của bạn phải chấm dứt cho tất cả các đầu vào hợp lệ, nghĩa là nó sẽ không bao giờ bị kẹt trong một vòng lặp, hệ thống tập tin phải ở trạng thái mới rõ ràng sau mỗi lần di chuyển được áp dụng.

Trong trường hợp tồn tại nhiều hơn một giải pháp ngắn nhất, bất kỳ giải pháp nào cũng có thể được chọn là hợp lệ.

Mã ngắn nhất sẽ thắng. Vui lòng gửi ít nhất một đầu vào ví dụ không cần thiết mới và đầu ra của nó với mã của bạn.


Làm thế nào chúng ta sẽ tìm thấy "chuỗi ngắn nhất" là bao lâu cho một đĩa tùy ý? (Hỏi vì nếu câu trả lời A nói ngắn nhất là 6 lần di chuyển và câu trả lời B nói ngắn nhất là 5, câu trả lời A có bị loại không?)
ASCIIThenANSI

Breadth-first-search có thể cung cấp giải pháp tham khảo nếu cần.
spraff

2
Điều này có thể sẽ hoạt động tốt hơn như là một thách thức [nguyên tử-mã-golf]. Bạn sẽ nhận được nhiều câu trả lời theo cách đó. Thay vì mã ngắn nhất, người chiến thắng sẽ là câu trả lời với số lần ghi đĩa ít nhất.
mbomb007

Câu trả lời:


1

Python 3 , 295 byte

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

Hãy thử trực tuyến!


Một trường hợp thử nghiệm khác

Đầu vào:
   7 ALEF = 6,4,0 BET = 5,1 GIMEL = 3

Trạng thái đĩa ban đầu:
   A2 B1 __ G0 A1 B0 A0

Giải pháp:
   ALEF: 2> 2
   ALEF: 0> 0
   BET: 1> 6
   ALEF: 1> 1

Giải pháp trực quan:
   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

Phiên bản bị đánh cắp .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.