कई फ़ाइलों को डीफ़्रैग करने के लिए सबसे कम डिस्क लिखती है


18

परिचय

एक डिस्क अनुक्रमित ब्लॉक के साथ एक रेखीय कंटेनर है 0के माध्यम से size-1

एक फ़ाइल उस फ़ाइल द्वारा उपयोग किए गए ब्लॉक इंडेक्स की एक नामित सूची है।

एक उदाहरण फाइलसिस्टम इस तरह व्यक्त किया गया है:

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

"डिस्क में 15 ब्लॉक हैं, फ़ाइल अल्फा का पहला ब्लॉक इंडेक्स 3 में डिस्क ब्लॉक है ..."

डिस्क मैप को इस तरह तैयार किया जा सकता है:

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

डिस्क को डीफ़्रेग्ड माना जाता है, जब उसके भीतर मौजूद सभी फ़ाइलों को संचित रूप से संग्रहीत किया जाता है।

आपका लक्ष्य:

एक फेंकना कम से कम के अनुक्रम कानूनी चाल जो किसी दिए गए डिस्क defrag जाएगा।

कानूनी कदम

एक मूव में तीन टुकड़े होते हैं: फाइल का नाम , फाइल को स्थानांतरित करने के लिए ब्लॉक का एक इंडेक्स और डिस्क ब्लॉक का इंडेक्स जिसके पास जाता है।

उदाहरण के लिए

ALPHA:1>4

"डिस्क के 4 को ब्लॉक करने के लिए फ़ाइल को अल्फा 1 के ब्लॉक 1 में ले जाएँ।"

इस कदम के बाद, उदाहरण फ़ाइल सिस्टम अब यह है

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

आवश्यकताएँ

आपके कोड को किसी भी आकार की डिस्क, और किसी भी संख्या और फ़ाइलों के आकार को स्वीकार करना होगा।

इनपुट जो कानूनी प्रारंभिक फाइलसिस्टम राज्यों का वर्णन नहीं करते हैं वे अपरिभाषित व्यवहार का कारण बन सकते हैं।

किसी भी अच्छी तरह से परिभाषित इनपुट के लिए आपके कोड को सबसे छोटी चाल का हल निकालना होगा।

आपके द्वारा उत्पादित सभी चालें कानूनी होनी चाहिए; फाइल सिस्टम आपके द्वारा उत्पादित प्रत्येक चरण को लागू करने के बाद एक वैध स्थिति में होना चाहिए।

आपके कोड को सभी मान्य इनपुट के लिए समाप्त करना चाहिए, अर्थात इसे कभी भी लूप में नहीं फंसना चाहिए, प्रत्येक चरण लागू होने के बाद फाइल सिस्टम एक अलग नई स्थिति में होना चाहिए।

जहां एक से अधिक लघु समाधान मौजूद हैं, किसी को भी वैध के रूप में चुना जा सकता है।

सबसे छोटा कोड जीतता है। कृपया अपने कोड के साथ कम से कम एक नया nontrivial उदाहरण इनपुट और इसके आउटपुट पोस्ट करें।


हम कैसे पाएंगे कि मनमाना डिस्क के लिए "सबसे छोटा अनुक्रम" कितना लंबा है? (यह पूछने के कारण कि यदि उत्तर A कहता है कि सबसे छोटी 6 चाल है और उत्तर B कहता है कि सबसे छोटी 5 है, क्या उत्तर A तब अयोग्य हो जाता है?)
ASCIIThenANSI

यदि आवश्यक हो तो चौड़ाई-पहली-खोज एक संदर्भ समाधान प्रदान कर सकती है।
स्पैर्फ

2
यह संभवतः [परमाणु-कोड-गोल्फ] चुनौती के रूप में बेहतर काम करेगा। आपको इस तरह से और उत्तर मिलेंगे। सबसे छोटे कोड के बजाय, सबसे कम डिस्क लिखने वाले के साथ विजेता उत्तर होगा।
mbomb007 22

जवाबों:


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 BET = 5,1 GIMEL = 3

प्रारंभिक डिस्क स्थिति:
   ए 2 बी 1 __ G0 A1 B0 A0

समाधान:
   दुकान ऑनलाइन: 2> 2
   दुकान ऑनलाइन: 0> 0
   बेट: 1> 6
   दुकान ऑनलाइन: 1> 1

कल्पना समाधान:
   ए 2 बी 1 __ G0 A1 B0 A0
   __ बी १ ए २ जी ० ए १ बी ० ए ०
   A0 B1 A2 G0 A1 B0 __
   A0 __ A2 G0 A1 B0 B1
   A0 A1 A2 G0 __ B0 B1

अनप्लग्ड संस्करण

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.