परिचय
एक डिस्क अनुक्रमित ब्लॉक के साथ एक रेखीय कंटेनर है 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 उदाहरण इनपुट और इसके आउटपुट पोस्ट करें।