여러 파일을 조각 모음하기위한 가장 적은 디스크 쓰기


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

"파일 ALPHA의 블록 1을 디스크의 블록 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(베타 소유), ALPHA:3>0(알파에 해당 블록 없음), 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

요구 사항

코드는 모든 크기의 디스크와 파일 수 및 크기를 허용해야합니다.

유효한 초기 파일 시스템 상태를 설명하지 않는 입력은 정의되지 않은 동작을 유발할 수 있습니다.

코드는 잘 정의 된 입력에 대해 최단 이동 솔루션을 생성해야합니다 .

당신이 생산하는 모든 움직임은 합법적이어야합니다. 생성 한 각 단계를 적용한 후 파일 시스템이 유효한 상태 여야합니다.

모든 유효한 입력에 대해 코드를 종료해야합니다. 즉, 루프에 걸리지 않아야합니다. 각 이동이 적용된 후 파일 시스템이 완전히 새로운 상태에 있어야합니다.

가장 짧은 솔루션이 둘 이상있는 경우 유효한 솔루션을 선택할 수 있습니다.

가장 짧은 코드가 승리합니다. 최소한 하나의 새로운 예제 입력과 출력을 코드와 함께 게시하십시오.


임의의 디스크에 대해 "가장 짧은 시퀀스"의 길이는 어떻게 알 수 있습니까? (답변 A가 가장 짧은 것이 6 움직임이고 답 B가 가장 짧은 것이 5라고 대답하면 대답 A가 실격 처리됩니까?)
ASCIIThenANSI

너비 우선 탐색은 필요한 경우 참조 솔루션을 제공 할 수 있습니다.
spraff

2
이것은 아마도 [원자 코드 골프] 도전으로 더 잘 작동 할 것입니다. 그런 식으로 더 많은 답변을 얻을 수 있습니다. 가장 짧은 코드 대신 가장 적은 디스크 쓰기로 답을 얻을 수 있습니다.
mbomb007

답변:


1

파이썬 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 베팅 = 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

언 골프 버전 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.