यह कोर वॉर का एक रूपांतरण है , एक प्रोग्रामिंग कोठ जो 20 वीं शताब्दी में वापस डेटिंग कर रहा है। अधिक विशिष्ट होने के लिए, यह मूल प्रस्ताव से मुख्य रूप से आधारित अविश्वसनीय रूप से सरलीकृत अनुदेश सेट का उपयोग कर रहा है ।
पृष्ठभूमि
कोर वार में, कंप्यूटर पर नियंत्रण के लिए जूझ रहे दो कार्यक्रम हैं। प्रत्येक कार्यक्रम का लक्ष्य विरोधी कार्यक्रम का पता लगाने और समाप्त करके जीतना है।
लड़ाई कंप्यूटर की मुख्य मेमोरी के भीतर होती है। इस मेमोरी को कोर कहा जाता है, और इसमें 8192 पते हैं। जब लड़ाई शुरू होती है, तो प्रत्येक प्रतियोगी (जिसे योद्धा कहा जाता है) के लिए कोड को स्मृति के यादृच्छिक क्रम में रखा जाता है। योद्धाओं के बीच कार्यक्रम निष्पादन वैकल्पिक, प्रत्येक के एक निर्देश का प्रदर्शन। प्रत्येक निर्देश कोर के एक हिस्से को संशोधित करने में सक्षम है, जिससे स्व-संशोधित कार्यक्रमों की संभावना बढ़ जाती है।
लक्ष्य विरोधी कार्यक्रम को समाप्त करना है। जब कोई अमान्य निर्देश निष्पादित करने का प्रयास करता है, तो एक कार्यक्रम समाप्त हो जाता है, जो कि कोई भी DAT
निर्देश है।
निर्देश सेट
प्रत्येक कार्यक्रम में निम्न-स्तरीय निर्देशों की एक श्रृंखला होती है, जिनमें से प्रत्येक दो क्षेत्रों को लेता है, जिन्हें ए और बी फ़ील्ड कहा जाता है।
यह निर्देश सेट मूल कल्पना से भारी है। मुख्य जोड़ 1) कमांड जोड़ने / घटाने पर स्पष्टीकरण है, और 2) #
एड्रेसिंग मोड का एक परिवर्तन इसे कहीं भी उपयोग करने की अनुमति देता है। कोर वार्स के अधिकांश पूर्ण संस्करणों में 20 से अधिक ऑपकोड, 8 एड्रेसिंग मोड और "इंस्ट्रूमेंट मॉडिफायर" का एक सेट है।
opcodes
प्रत्येक निर्देश में सात अलग-अलग ऑपकोड में से एक होना चाहिए।
DAT A B
- (डेटा) - यह केवल संख्या रखता हैA
औरB
। महत्वपूर्ण रूप से, एक प्रक्रिया मर जाती है जब यह एक डीएटी अनुदेश को निष्पादित करने का प्रयास करता है।MOV A B
- (चाल) - यह स्मृति स्थान की सामग्री को स्मृति स्थानA
पर ले जाता हैB
। यहाँ पहले और बाद का प्रदर्शन है:MOV 2 1 ADD @4 #5 JMP #1 -1
MOV 2 1 JMP #1 -1 JMP #1 -1
ADD A B
- (जोड़ने) - यह स्मृति स्थान की सामग्री कहते हैंA
स्मृति स्थान के लिएB
। दोनों के दो पहले फ़ील्ड जोड़े गए हैं, और दूसरे फ़ील्ड जोड़े गए हैं।ADD 2 1 MOV @4 #5 JMP #1 -1
ADD 2 1 MOV @5 #4 JMP #1 -1
SUB A B
- (घटाना) - यह स्मृति स्थान की सामग्री को घटाताA
है (और परिणाम को मेमोरी स्थान में संग्रहीत करता है)B
।SUB 2 1 MOV @4 #5 JMP #1 -1
SUB 2 1 MOV @3 #6 JMP #1 -1
JMP A B
- (कूद) - स्थान पर कूदेंA
, जिसे अगले चक्र में निष्पादित किया जाएगा।B
एक संख्या होनी चाहिए, लेकिन कुछ भी नहीं है (आप इसका उपयोग जानकारी संग्रहीत करने के लिए कर सकते हैं, हालांकि)।JMP 2 1337 ADD 1 2 ADD 2 3
कूद का मतलब है कि
ADD 2 3
अगले चक्र को निष्पादित किया जाएगा।JMZ A B
- (शून्य होने पर कूदें) - यदि रेखा के दोनों क्षेत्रB
0 हैं, तो प्रोग्राम स्थान पर कूदता हैA
।JMZ 2 1 SUB 0 @0 DAT 23 45
चूंकि निर्देश 1 के दो क्षेत्र 0 हैं, DAT कमांड को अगले मोड़ पर क्रियान्वित किया जाएगा, जिससे आसन्न मौत हो जाएगी।
CMP A B
- (तुलना करें और छोड़ें यदि नहीं के बराबर) - यदि निर्देश में फ़ील्डA
औरB
बराबर नहीं हैं, तो अगले निर्देश को छोड़ दें।CMP #1 2 ADD 2 #3 SUB @2 3
चूंकि निर्देश 1 और 2 के दो क्षेत्र मूल्य के बराबर हैं, इसलिए ADD कमांड को छोड़ नहीं दिया जाता है और इसे अगले मोड़ पर निष्पादित किया जाता है।
जब दो निर्देश जोड़े / घटाए जाते हैं, तो दो फ़ील्ड (A और B) जोड़े / घटाए जाते हैं। एड्रेसिंग मोड और ओपकोड को नहीं बदला जाता है।
मोड्स को संबोधित करते हुए
तीन प्रकार के एड्रेसिंग मोड हैं। एक निर्देश के दो क्षेत्रों में से प्रत्येक में इन तीन संबोधित मोड में से एक है।
तत्काल
#X
-X
कम्प्यूटेशन में सीधे उपयोग की जाने वाली लाइन है। उदाहरण के लिए,#0
कार्यक्रम की पहली पंक्ति है। नकारात्मक रेखाएं कार्यक्रम की शुरुआत से पहले कोर में लाइनों को संदर्भित करती हैं।... //just a space-filler ... ADD #3 #4 DAT 0 1 DAT 2 4
यह दो DAT लाइनों के पहले को दूसरे में जोड़ देगा, क्योंकि वे क्रमशः 3 और 4 लाइनों में हैं। हालाँकि, आप इस कोड का उपयोग नहीं करना चाहेंगे, क्योंकि DAT आपके बॉट को अगले चक्र पर मार देगा।
सापेक्ष
X
- संख्याX
वर्तमान पते के सापेक्ष लक्ष्य स्मृति पते के स्थान का प्रतिनिधित्व करती है। इस स्थान पर संख्या का उपयोग गणना में किया जाता है। यदि लाइन#35
निष्पादित हो रही है और इसमें शामिल है-5
, तो लाइन#30
का उपयोग किया जाता है।... //just a space-filler ... ADD 2 1 DAT 0 1 DAT 2 4
यह दूसरी DAT लाइन को पहले जोड़ देगा।
अप्रत्यक्ष
@X
- संख्याX
एक सापेक्ष पते का प्रतिनिधित्व करती है। उस स्थान की सामग्री को अस्थायी रूप से एक नए रिश्तेदार पते को बनाने के लिए संख्या X में जोड़ा जाता है, जिसमें से संख्या को पुनः प्राप्त किया जाता है। यदि लाइन#35
निष्पादित की जा रही है, और इसका दूसरा क्षेत्र है@4
, और लाइन के दूसरे क्षेत्र में#39
संख्या है-7
, तो लाइन#32
का उपयोग किया जाता है।... //just a space-filler ... ADD @1 @1 DAT 0 1 DAT 2 4
यह पहले DAT को दूसरे में जोड़ देगा, लेकिन अधिक जटिल तरीके से। पहला फ़ील्ड @ 1 है, जो उस संबंधित पते से डेटा प्राप्त करता है, जो कि पहले DAT का पहला क्षेत्र है, 0. यह उस स्थान से दूसरे रिश्तेदार पते के रूप में व्याख्या किया गया है, इसलिए 1 + 0 = 1 कुल देता है मूल अनुदेश से ऑफसेट। दूसरे क्षेत्र के लिए, @ 1 को उस सापेक्ष पते (पहले DAT के दूसरे क्षेत्र में 1) से मान मिलता है और उसी तरह से खुद को जोड़ता है। कुल ऑफसेट तब 1 + 1 = 2 है। तो, इस निर्देश को इसी तरह निष्पादित किया जाता है
ADD 1 2
।
प्रत्येक कार्यक्रम में 64 तक निर्देश हो सकते हैं।
जब एक दौर शुरू होता है, तो दो कार्यक्रमों को 8192 स्थानों के साथ एक मेमोरी बैंक में यादृच्छिक रूप से रखा जाता है। प्रत्येक कार्यक्रम के लिए निर्देश सूचक कार्यक्रम की शुरुआत में शुरू होता है और प्रत्येक निष्पादन चक्र के बाद बढ़ जाता है। एक बार अपने अनुदेश सूचक एक DAT
अनुदेश को निष्पादित करने का प्रयास करता है, तो कार्यक्रम मर जाता है ।
कोर के पैरामीटर
8192 * 8 = 65536 टिक के टाइमआउट के साथ मूल आकार 8192 है। कोर चक्रीय है, इसलिए 8195 पते को लिखना पते के लिए लिखने के समान है। सभी अप्रयुक्त पते प्रारंभिक हैं DAT #0 #0
।
प्रत्येक प्रतियोगी को 64 लाइनों से अधिक नहीं होना चाहिए। पूर्णांक 32-बिट हस्ताक्षरित पूर्णांक के रूप में संग्रहीत किए जाएंगे।
पदच्छेद
प्रतियोगियों के लिए प्रोग्रामिंग को आसान बनाने के लिए, मैं पार्सर में एक लाइन-लेबल सुविधा जोड़ूंगा। किसी भी शब्द जो एक ओपकोड से पहले एक लाइन पर होते हैं, उन्हें लाइन लेबल के रूप में व्याख्या किया जाएगा। उदाहरण के लिए, tree mov 4 6
लाइन लेबल है tree
। यदि, कार्यक्रम में कहीं भी, एक क्षेत्र है जिसमें tree
#tree
या @tree
, एक नंबर प्रतिस्थापित किया जाएगा। साथ ही, पूंजीकरण की अनदेखी की जाती है।
यहां एक उदाहरण दिया गया है कि लाइन लेबल कैसे प्रतिस्थापित किए जाते हैं:
labelA add labelB @labelC
labelB add #labelC labelC
labelC sub labelA @labelB
यहाँ, लेबल A, B, और C लाइन 0, 1 पर हैं, और 2. उदाहरण के #label
लेबल की लाइन संख्या के साथ प्रतिस्थापित किया जाएगा। के उदाहरण label
या @label
लेबल के सापेक्ष स्थान के साथ प्रतिस्थापित किए जाते हैं। एड्रेसिंग मोड संरक्षित हैं।
ADD 1 @2
ADD #2 1
SUB -2 @-1
स्कोरिंग
प्रतियोगियों की प्रत्येक जोड़ी के लिए, हर संभव लड़ाई की जाती है। चूंकि एक लड़ाई का परिणाम दो कार्यक्रमों के सापेक्ष ऑफसेट पर निर्भर करता है, हर संभव ऑफसेट (उनमें से लगभग 8000) की कोशिश की जाती है। इसके अलावा, प्रत्येक प्रोग्राम को प्रत्येक ऑफसेट में पहले स्थानांतरित करने का मौका है। जो कार्यक्रम इन ऑफसेट में से अधिकांश को जीतता है वह जोड़ी का विजेता है।
प्रत्येक जोड़ी के लिए जो एक योद्धा जीतता है, उसे 2 अंक दिए जाते हैं। प्रत्येक टाई के लिए, एक योद्धा को 1 अंक से सम्मानित किया जाता है।
आपको एक से अधिक योद्धाओं को जमा करने की अनुमति है। मल्टीपल सबमिशन के लिए सामान्य नियम लागू होते हैं, जैसे कोई टैग-टीमिंग, कोई सहयोग नहीं, कोई किंग-मेकिंग, आदि। कोर वॉर वैसे भी इसके लिए वास्तव में कोई जगह नहीं है, इसलिए यह एक बड़ा सौदा नहीं होना चाहिए।
नियंत्रक
नियंत्रक के लिए कोड, दो आसान उदाहरण बॉट के साथ, यहां स्थित है । चूंकि यह प्रतियोगिता (आधिकारिक सेटिंग्स का उपयोग करके चलाया जाता है) पूरी तरह से नियतात्मक है, आपके द्वारा बनाया गया लीडरबोर्ड आधिकारिक लीडरबोर्ड के समान ही होगा।
उदाहरण बॉट
यहाँ एक उदाहरण बॉट है जो भाषा की कुछ विशेषताओं को प्रदर्शित करता है।
main mov bomb #-1
add @main main
jmp #main 0
bomb dat 0 -1
यह बॉट "बम" के साथ बदलकर धीरे-धीरे कोर में अन्य सभी मेमोरी को मिटा देता है। चूंकि बम एक DAT
निर्देश है, कोई भी कार्यक्रम जो बम तक पहुंचता है, नष्ट हो जाएगा।
दो लाइन लेबल हैं, "मुख्य" और "बम" जो संख्याओं को बदलने के लिए कार्य करते हैं। प्रीप्रोसेसिंग के बाद, प्रोग्राम इस तरह दिखता है:
MOV 3 #-1
ADD @-1 -1
JMP #0 0
DAT 0 -1
पहली पंक्ति बम को प्रोग्राम के ठीक ऊपर लाइन में कॉपी करती है। अगली पंक्ति 0 -1
चाल कमांड में बम ( ) का मान जोड़ती है , और यह @
एड्रेसिंग मोड के उपयोग को भी दर्शाता है। यह अतिरिक्त कदम कमांड को एक नए लक्ष्य की ओर इशारा करता है। अगला कमांड बिना शर्त कार्यक्रम की शुरुआत में वापस कूदता है।
वर्तमान लीडरबोर्ड
२४ - टर्बो
२२ - बौनाईंगनेयर
२० - हनशॉटफ़र्स्ट १war
- ड्वार्फ
१४ - स्कैनबॉम्बेर
१० - पैरानॉयड
१० - फर्स्टटीमर
१० - जेनिटर
१० - विकसित
६ - ईस्टरबनी
६ - कॉपीपास्टा
४ - छोटा
२ - स्लग
जोड़ीदार परिणाम:
Dwarf > Imp
CopyPasta > Imp
Evolved > Imp
FirstTimer > Imp
Imp > Janitor
Imp > ScanBomber
Slug > Imp
DwarvenEngineer > Imp
HanShotFirst > Imp
Turbo > Imp
EasterBunny > Imp
Paranoid > Imp
Dwarf > CopyPasta
Dwarf > Evolved
Dwarf > FirstTimer
Dwarf > Janitor
Dwarf > ScanBomber
Dwarf > Slug
DwarvenEngineer > Dwarf
HanShotFirst > Dwarf
Turbo > Dwarf
Dwarf > EasterBunny
Dwarf > Paranoid
Evolved > CopyPasta
FirstTimer > CopyPasta
Janitor > CopyPasta
ScanBomber > CopyPasta
CopyPasta > Slug
DwarvenEngineer > CopyPasta
HanShotFirst > CopyPasta
Turbo > CopyPasta
CopyPasta > EasterBunny
Paranoid > CopyPasta
Evolved > FirstTimer
Evolved > Janitor
ScanBomber > Evolved
Evolved > Slug
DwarvenEngineer > Evolved
HanShotFirst > Evolved
Turbo > Evolved
EasterBunny > Evolved
Paranoid > Evolved
Janitor > FirstTimer
ScanBomber > FirstTimer
FirstTimer > Slug
DwarvenEngineer > FirstTimer
HanShotFirst > FirstTimer
Turbo > FirstTimer
FirstTimer > EasterBunny
FirstTimer > Paranoid
ScanBomber > Janitor
Janitor > Slug
DwarvenEngineer > Janitor
HanShotFirst > Janitor
Turbo > Janitor
Janitor > EasterBunny
Janitor > Paranoid
ScanBomber > Slug
DwarvenEngineer > ScanBomber
HanShotFirst > ScanBomber
Turbo > ScanBomber
ScanBomber > EasterBunny
ScanBomber > Paranoid
DwarvenEngineer > Slug
HanShotFirst > Slug
Turbo > Slug
EasterBunny > Slug
Paranoid > Slug
DwarvenEngineer > HanShotFirst
Turbo > DwarvenEngineer
DwarvenEngineer > EasterBunny
DwarvenEngineer > Paranoid
Turbo > HanShotFirst
HanShotFirst > EasterBunny
HanShotFirst > Paranoid
Turbo > EasterBunny
Turbo > Paranoid
Paranoid > EasterBunny
नवीनतम अपडेट (टर्बो और पैरानॉयड के नए संस्करण) को एक पुराने लैपटॉप पर चलाने में लगभग 5 मिनट लगे। मैं नियंत्रक में सुधार के लिए इल्मरी करोनन को धन्यवाद देना चाहूंगा । यदि आपके पास नियंत्रक की एक स्थानीय प्रतिलिपि है, तो आपको अपनी फ़ाइलों को अपडेट करना चाहिए।