कोड बॉट 3: समानांतर प्रोग्रामिंग एंटीपैटर्न


13

वापसी पर स्वागत है! मैं 3rd CodeBots चुनौती पेश करने के लिए उत्साहित हूं। इसे बनाने में काफी समय लगा है। इस चुनौती को 3 खंडों में विभाजित किया जाएगा: लघु संस्करण, लंबा संस्करण और अतिरिक्त विवरण।

लघु संस्करण

प्रत्येक प्रतियोगी 24-कमांड प्रोग्राम लिखेगा। ये बॉट दुनिया भर में घूमेंगे और अपने कोड को अन्य बॉट्स में कॉपी करेंगे, जबकि अन्य बॉट्स को भी ऐसा करने से रोकने की कोशिश की जाएगी। संभावित आदेशों में से एक नो-ऑप है Flag। यदि किसी बॉट में Flagकिसी अन्य बॉट की तुलना में अधिक है Flag, तो आपको एक बिंदु मिलता है। आप सबसे अधिक अंक प्राप्त करके जीते।

उपरोक्त सभी पिछली दो चुनौतियों के लिए सही थे। इस बार, बॉट एक ही समय में कोड की कई लाइनें चलाने में सक्षम होंगे।

लंबे संस्करण

एपीआई

प्रत्येक बॉट में ठीक 24 लाइनें होंगी, जहां प्रत्येक पंक्ति निम्नलिखित प्रारूप में है:

$label command parameters //comments

लेबल और टिप्पणियां वैकल्पिक हैं, और प्रत्येक आदेश में मापदंडों की एक अलग संख्या है। सब कुछ मामला-असंवेदनशील है।

पैरामीटर

पैरामीटर टाइप किए गए हैं, और निम्न प्रारूप में हो सकते हैं:

  1. 0 से 23 तक का मान।
  2. एक चर: A, B, C,D
  3. जोड़ का उपयोग करके एक मान: A+3या2+C
  4. कोड की एक पंक्ति, जो #संकेत का उपयोग करके निर्दिष्ट है ( #45 वीं पंक्ति का #C+2प्रतिनिधित्व करेगा , जबकि द्वारा गणना की गई रेखा का प्रतिनिधित्व करेगा C+2)।
  5. आप $labelकोड की एक लाइन नामित करने के बजाय उपयोग कर सकते हैं ।
  6. आपके प्रतिद्वंद्वी का चर या लाइन कोड, द्वारा निर्दिष्ट *। आपका विरोधी उस वर्ग में बॉट है जिसका आप सामना कर रहे हैं। ( *Bआपके प्रतिद्वंद्वी के Bमूल्य का *#9प्रतिनिधित्व करता है , जबकि आपके प्रतिद्वंद्वी की 10 वीं पंक्ति का प्रतिनिधित्व करता है)। यदि उस वर्ग में कोई नहीं है, तो कमांड निष्पादित नहीं किया जाता है।

आदेश

V को स्थानांतरित करें

बॉट ले जाता है North+(V*90 degrees clockwise)। आंदोलन दिशा नहीं बदलता है।

V को चालू करें

बॉट को V*90 degreesदक्षिणावर्त घुमाता है।

VW की प्रतिलिपि बनाएँ

प्रतियां जो कुछ भी है Vमें W। अगर Vएक लाइन नंबर है, तो Wएक लाइन नंबर होना चाहिए। यदि Vएक चर या मान है, तो Wएक चर होना चाहिए।

झंडा

कुछ नहीं करता।

स्टार टीवी

वैरिएबल से जुड़ा एक नया सूत्र शुरू करता है V। तुरंत, और प्रत्येक भविष्य के मोड़ पर, थ्रेड लाइन पर कमांड निष्पादित करेगा V

यदि Vपहले से ही एक थ्रेड से जुड़ा हुआ है, तो यह कमांड नो-ऑप है। यदि Vप्रतिद्वंद्वी का चर है, तो प्रतिद्वंद्वी उस चर से जुड़ा एक सूत्र शुरू करेगा।

वी बंद करो

Vइस मोड़ के अंत में चर से जुड़े धागे को रोकता है ।

लॉक वी

उस थ्रेड को छोड़कर किसी भी तरहV से इस्तेमाल होने वाली लाइन या वेरिएबल को रोकें । उसी थ्रेड द्वारा बाद की कॉल अनलॉक होती है । विरोधियों के चर या रेखाओं पर ताले नहीं लगाए जा सकते।LockLockV

अगर कॉन्ड VW

यह परीक्षण करेगा Cond। यदि स्थिति सही है, तो वह थ्रेड पॉइंटर को लाइन नंबर पर ले जाएगा V, अन्यथा लाइन नंबर पर W। फिर उस लाइन को तुरंत निष्पादित किया जाएगा।

सशर्त, हो सकता है X=Y, X<Y, !X, या ?X:

  1. X=Y परीक्षण करता है कि क्या दो पंक्तियाँ एक ही प्रकार की हैं और एक ही बॉट से हैं, या आप परीक्षण करते हैं कि क्या दो मान एक ही राशि के बराबर हैं।
  2. X<Yपरीक्षण करता है कि मूल्य से Xकम है या नहीं Y
  3. !Xपरीक्षण कि क्या चर या रेखा Xबंद है (लौटाए जाने पर सही है)
  4. ?X यह जांचा जाता है कि किसी दिए गए चर में एक धागा है या नहीं

अतिरिक्त जानकारिया

मल्टी थ्रेडेड इंटरैक्शन

एक ही प्रकार के कार्यों को एक ही समय में निष्पादित किया जाता है। क्रियाओं को निम्नलिखित क्रम में निष्पादित किया जाता है:

  1. ताला। यदि कई थ्रेड एक वैरिएबल को लॉक करने का प्रयास करते हैं, तो वे सभी विफल हो जाएंगे। यदि कोई थ्रेड किसी वैरिएबल को अनलॉक कर रहा है, जबकि दूसरा इसे लॉक करने का प्रयास कर रहा है, तो वैरिएबल अनलॉक रहेगा।

  2. शुरू। यदि कई धागे एक चर पर एक धागा शुरू करने का प्रयास करते हैं, तो यह एक एकल शुरुआत के रूप में गिना जाएगा।

  3. प्रति। यदि दो धागे दोनों एक ही चर में कॉपी होते हैं, तो चर एक यादृच्छिक मूल्य के रूप में समाप्त हो जाएगा। यदि वे दोनों एक ही पंक्ति में कॉपी करते हैं, तो भी काम नहीं करेगा। यदि एक थ्रेड एक ही वेरिएबल पर कॉपी करता है तो दूसरा थ्रेड कॉपी कर रहा है, तो बाद वाला थ्रेड एक रैंडम वैल्यू कॉपी करेगा। यदि दो धागे दोनों एक ही चर से नकल कर रहे हैं, तो वे दोनों ठीक काम करेंगे।

  4. अगर। सभी सशर्तियों का एक साथ परीक्षण किया जाएगा, और फिर थ्रेड चर के बाद अपडेट किया जाएगा। Ifकिसी कार्य को निष्पादित करने के लिए एक उच्च प्राथमिकता के साथ एक कार्रवाई को जोड़ा जा सकता है। उच्च प्राथमिकता वाली कार्रवाइयों को अतीत में जाने से पहले निष्पादित किया जाएगा If, जबकि निम्न प्राथमिकता वाली कार्रवाइयों को उसके बाद निष्पादित किया जाएगा If

  5. ले जाएँ। एक ही बॉट पर एकाधिक चालें बॉट को सभी चालों का योग बनाएंगी। यदि एक ही स्थान पर कई बॉट समाप्त हो जाएंगे, तो उन्हें उनके शुरुआती स्थान पर लौटा दिया जाएगा।

  6. मोड़। एक ही बॉट पर कई मोड़ आएंगे।

  7. रूक जा। एक ही चर पर एकाधिक स्टॉप कमांड एक स्टॉप के रूप में गिना जाएगा।

अन्य जानकारी

आपका प्रारंभिक धागा Dचर से जुड़ा हुआ है

एक के साथ पुनरावृत्ति If(एक Ifबयान खुद को इंगित) होने के कारण आपके बॉट को कुछ नहीं करना होगा

यदि लॉक करने के बाद एक धागा बंद कर दिया जाता है, तो उन ताले को अनलॉक कर दिया जाएगा

एक बंद चर या रेखा का उपयोग करने की क्रिया कुछ नहीं करेगी।

यदि कोई बॉट 24 लाइनों से कम है, तो शेष लाइनें भरी जाएंगी Flag

एक चर पर एक लेखन प्रदर्शन करना जो एक शुरुआती धागे से भी जुड़ा हुआ है वास्तव में धागा नए निष्पादन पर अपना निष्पादन शुरू करेगा क्योंकि धागा निम्नलिखित मोड़ शुरू करता है।

बॉट्स को एक टॉरॉयडल वर्ल्ड में निम्नलिखित पैटर्न में रखा गया है:

B...B...B...
..B...B...B.
B...B...B...

मैंने कई नमूना बॉट्स जोड़े हैं जिन्हें भाषा के संदर्भ के रूप में टिप्पणी की जाती है।

नियंत्रक यहाँ स्थित है । मैंने इस पर एक लंबा समय काम किया है, लेकिन इसमें अभी भी कीड़े हैं। जब कल्पना और नियंत्रक विरोधाभास, कल्पना सही है।

स्कोरबोर्ड

1. 771  LockedScannerBot
2. 297  CopyAndSelfFlag
3. 289  DoubleTapBot
4. 197  ThreadCutterBot
5. 191  TripleThread
6. 180  ThickShelled
7. 155  Attacker
8. 99   RandomMover
9. 90   BananaBot
10. 56  LockedStationaryDoubleTap

वाह, कम से कम, DoubleTap नमूनों की तुलना में बहुत बेहतर लगता है!
काटेंकियो

यदि मैं किसी अन्य थ्रेड से लॉक चर को पढ़ने की कोशिश करूं तो क्या होना चाहिए? मान लें कि मैं LOCK A करता हूं तो एक अन्य धागे में एक MOVE है। क्या A 0 या एक यादृच्छिक मान का मूल्यांकन करता है या चाल विफल रहती है या ...?
शुक्राणु

जब एक थ्रेड दूसरे थ्रेड द्वारा लॉक की गई लाइन तक पहुंचता है तो क्या होता है। क्या यह एक noop है? क्या यह छोड़ दिया जाता है?
शुक्राणु

"कॉपी $ ए" काम करना चाहिए? यह "कॉपी # 11 ए" के रूप में व्याख्या करता है जो मान्य नहीं है और इंटरप्रेटर को क्रैश करता है, "कॉपी 11 ए" के बजाय जैसा कि मैं उम्मीद करता हूं।
शुक्राणु

संभव बग ... मुझे लगता है कि जब वे दूसरे धागे से बंद कर दिए गए हैं, तब भी मैं उनसे कॉपी करने के लिए अपनी स्वयं की ध्वज लाइनों को पढ़ने में सक्षम हो सकता हूं।
शुक्राणु

जवाबों:


3

लॉक्ड स्कैनर बॉट

दुश्मन को जितनी जल्दी हो सके और झंडे के साथ लाइनों को बदल देता है।

    Lock D
    Copy $a A
    Start A
    Copy $b B
    Start B

$d  Lock $d0
    Lock $d1    
$d0 Copy $flag *#C+1
$d1 If 1=1 $d0 $d0

$a  Lock A
    Lock $a0
    Lock $a1
    Lock $a2
$a0 Copy $flag *#C
$a1 Copy C+2 C
$a2 If !*#C $a1 $a0

$b  Lock B
    Lock $b0
    Lock $b1
    Lock $b2
$b0 Move C
$b1 Turn 1
$b2 If 1=1 $b0 $b0

$flag Flag

मैं आपके ए थ्रेड में सशर्त के बारे में उत्सुक हूं। * # C जाँचता है कि क्या आपके लक्ष्य की लाइन #C (आपका C) लॉक है, है ना? यह कैसे सहायक है?
शुक्राणु

@Srr यदि थ्रेड लॉक है तो ध्वज के साथ दुश्मन कोड की एक पंक्ति को बदलने में समय बर्बाद नहीं होता है।
TheNumberOne

धन्यवाद। मैं मूल रूप से इफ स्टेटमेंट्स की गति के बारे में कल्पना को गलत बताता हूं।
शुक्राणु

3

DoubleTapBot

इस बॉट में 3 थ्रेड्स हैं: एक फॉर मूविंग (ए), दो अन्य फ्लैगिंग के लिए (बी और डी)। बी ध्वज 1/2 मोड़, डी ध्वज 1/3 बारी। तो कुछ मोड़, वह प्रतिद्वंद्वी को झंडा दिखाएगा :)।

मुझे लगता है कि यदि यह 23 से अधिक है तो C 0 पर वापस आ जाएगा।

यह बहुत ही सुरक्षित है अगर इसमें खुद को तैयार करने के लिए कुछ मोड़ हैं (8 बारी), क्योंकि वह हमेशा सामान्य रूप से कम से कम 2 धागे (ए एंड बी) रखेगा।

मैं इसे फिलहाल नहीं आज़मा सकता, इसलिए जब मैं घर वापस आऊंगा तो मैं टेस्ट कराऊंगा :)

Lock D          //Thread D locks itself
Copy 6 A        //Thread A will start line 6
Start A     
Copy 13 B       //Thread B will start line 13
Start B        
Copy 20 D       //Moving Thread D to an other part of the program
Lock A          //Thread A locks itself and the line it will be using
Lock #10
Lock #11
Lock #12
Move C          //Move in a pseudo random direction
Turn 1      //always turn to the right
If 1=1 #10 #10  //return to Move C
Lock B          //Thread B locks itself and the line it will be using
Lock #13
Lock #14
Copy #18 *#C    //Copy a flag to the Cth line of the opponent
If 1=1 #16 #16  //jump back to the copy
Flag   
Flag   
Copy C+1 C      //Increment C
Copy #19 *#C+1  //Copy a flag to the Cth+1 line of the opponent
If 1=1 #20 #20  //jump back to the increment
Flag 

लॉक नंबर एक मान्य कमांड नहीं है। मैं प्रत्येक संख्या के पहले # संकेत डालता हूं। इसके अलावा, कमांड "रोटेट" है, न कि "टर्न"
नाथन मेरिल

@NathanMerrill कैसे, यह एक टाइपो है, # को भूल जाओ, इसे इंगित करने के लिए धन्यवाद। और बदले के लिए, अपनी पोस्ट को संशोधित करें, तो आपने लिखा है वी V टर्न बी बॉट V * 90 डिग्री क्लॉकवाइज। :)
काटेंकियो

ओह, मैंने किया। टर्न वास्तव में सही है, फिर, मैं वापस जाऊंगा और कोड को अपडेट करूंगा
नाथन मेरिल

जब आप 10,11,12 को लॉक करना चाहते हैं तो आप 11,12,13 को लॉक कर रहे हैं?
स्पर्म

वाह, यह इंगित करने के लिए धन्यवाद!
काटेन्को

2

बंद स्टेशनरी डबल टैप

@ कटेंको के DoubleTapBot से प्रेरित होकर, यह एक जोड़े को अपने स्वयं के धागों को पूरी तरह से बंद करने के बदले में झंडे और आंदोलन की कोई भी उम्मीद देता है ताकि इसे कभी भी दोबारा न जोड़ा जा सके। हालांकि, यह अभी भी गैर-लूपिंग कोड क्षेत्रों के लिए लिखे गए दुश्मन के झंडे के लिए सुगम है।

Lock $flag              // lock the only flag line, super important!
Lock D                  // lock thread D
Copy 10 A
Start A                 // start thread A at $Astart
Copy 17 B
Start B                 // start thread B at $Bstart
Lock $D1                // lock thread D lines
Lock $D2                // thread D should be safe on turn 8
$D1 Turn C              // Spin in place, once every 2 turns
$D2 If 0=0 $D1 $D1      // thread D loop
$Astart Lock A          // thread A starts here, locks itself
Lock $A1                // lock thread A lines
Lock $A2
Lock $A3                // thread A should be safe on turn 7
$A1 Copy $flag *#C      // ATTACK! once every 3 turns
$A2 Copy C+1 C          // increment C, used for attacks and turning
$A3 If 0=0 $A1 $A1      // thread A loop
$Bstart Lock B          // thread B starts here, locks itself
Lock $B1                // lock thread B lines
Lock $B2                // thread B should be safe on turn 8
$B1 Copy $flag *#C+12   // ATTACK! once every 2 turns
$B2 If 0=0 $B1 $B1      // thread B loop
$flag Flag

Haha, झंडे को बंद करना एक बहुत अच्छा विचार है, मुझे इसके बारे में सोचना चाहिए था! वैसे भी, मुझे खुशी है कि मेरे बॉट ने किसी को कुछ प्रेरणा दी!
कटेन्को

@Katenkyo यह एक अच्छा विचार है अगर यह काम करता है, लेकिन मुझे नहीं लगता कि यह काम करना चाहिए। नियम-जैसा-लिखित सुझाव है कि यदि D फ्लैग लाइन को लॉक करता है तो A / B इससे कॉपी नहीं कर पाएंगे। हालाँकि, ऐसा नहीं लगता है। प्रश्न के लिए टिप्पणियों में बग रिपोर्ट।
स्पर्म

1

रैंडम मूवर

एक चालित आयामी दिशा में चलती है

Copy 5 C
Copy 8 B
Start C
Move A // If you can't catch me, you can't modify me
If 1=1 #3 #3 //Continue to execute the above line
Start B
Copy 4 A
If 1=1 #6 #6 //Continue to execute the above line
Flag
Copy 5 A
If 1=1 #9 #9 //Continue to execute the above line

1

गाढ़ा गोला

जितना हो सके उसका सामान बंद कर देता है

Copy 5 B //Designating that the B thread will start on line 5
Start B //Starting the B thread
Lock C //Preventing C from being used
Copy A+1 A //The two threads are offset, meaning that the two threads shouldn't access this at the same time
Lock #A
Copy 2 B

1

हमलावर बोट

विभिन्न स्थानों में झंडे की प्रतियां

Copy A+1 A // Increment A
Move A //Move in the Ath direction
Turn A //Rotate A times
Copy #8 *#A //Copy my flag over
Copy 23 D //Loop back to the beginning.  (I use 23 here as threads auto-increment)

0

ट्रिपल थ्रेड

यह साधारण बॉट एक ही कोड के साथ तीन धागे चलाता है। प्रत्येक थ्रेड 1/3 बदल जाता है, 1/6 चलता है, 1/6 बदलता है, और 1/3 बहीखाता करता है।

Move 0
Start A
Start B
$loop Copy #A+9 *#C
Move C
Copy #A+9 *#C
Turn C
Copy C+1 C
If 0=0 $loop $loop

0

केले का बॉट

दुश्मन के पहिये में केला फेंकने की कोशिश की जाती है उससे पहले दुश्मन कुछ भी कर सकता है। कटा हुआ होने का खतरा।

$d     If !*D $d1 $d0
$d0    Copy 24 *D
$d1    If !D $d2 $start
$d2    If !*B $d5 $d3
$d3    Copy 24 *B
$d4    Copy $d D

$start Lock D             //Banana's like to split.
       Copy $a A
       Start A
       Copy $b B
       Start B
       Lock $flag

$d5    Copy $start *C     //It's okay if enemy messes up our start.
       Copy $d d

$a     Lock A
$a1    Move C
       Turn 1
       Copy $a1 A

$b     Lock B
$b0    Copy C+1 C
       If !*#C $b0 $b1    //Banana's are good at slipping.
$b1    Copy $flag *#C
$b2    Copy $b0 B

$flag  Flag

0

थ्रेड कटर बॉट

   Lock D
   Lock $f
   Copy 16 C
$S If ?*D $1 $2
   Move 1
   Copy $S D
$f Flag
$1 Stop *D
$2 If ?*A $3 $4
$3 Stop *A
$4 If ?*B $5 $6
$5 Stop *B
$6 Copy $f *#C
   Copy C+1 C
   If *#C=#C $E $6
   Copy 2 D
$E Start *D

अपने कोड के साथ भरने से पहले सभी दुश्मन धागे बंद करो।


0

कॉपी और सेल्फ फ्लैग

यह बॉट तीन धागे चलाता है। डी धागा तब तक चलता है जब तक यह एक दुश्मन में नहीं चलता है, फिर उनमें एक ध्वज को कॉपी करने की कोशिश करता है, फिर एक यादृच्छिक दिशा में ले जाता है। बॉट के कोड की गैर-जरूरी लाइनों पर ए थ्रेड अपने स्वयं के झंडे को कॉपी करता है। बी धागा सिर्फ एक काउंटर है। प्रत्येक थ्रेड द्वारा उपयोग किए जाने वाले कोड के वेरिएबल, फ्लैग और लाइनों को पहले 15 घुमावों में पूरी तरह से बंद कर दिया जाता है, और बॉट लगभग सभी स्टार्टअप कोड को अपने स्वयं के झंडे के साथ अधिलेखित कर देता है। मुझे नहीं लगता कि इस बॉट को दूसरी टीम के बैनर में बदलना संभव है क्योंकि 15 के बाद एक समर्पित अटैक बोट के बिना कुछ भी नहीं कर रहा है लेकिन इसे झंडे लिख रहा है।

    Lock D              // Lock D thread
    Copy $AS A
    Start A             // Start A thread at $AS
    Start B             // B is just a counter
    Copy $DL D          // Jump to D thread startup code
$DC Start B             // Don't let B thread get stopped
$D0 If !*#B $D1 $D2
$D1 Copy $DF *#B
$D2 If !*#B+6 $D3 $DM
$D3 Copy $DF *#B
$DM Move B              // Move some direction after attacking
$DA Move 0              // Move north ...
    If ?*D $DC $DA      // until we hit a live target
$DF Flag                // Flag to copy
$DL Lock #B+3           // Lock the D thread's lines
    If B<12 $DL $DA     // jump to `Move 0` when D thread is safe
$AS Lock A
$AL Lock #B+20
    If B<4 $AL $AD
    Copy 23 B           // reset B so A doesn't overwrite its own code
$AF Flag
    Flag
$AD Copy $AF #B+1       // Copy a safe flag over every unused line of code
    If B<18 $AD $AF

Move 0उत्तर की ओर अग्रसर है, आगे नहीं।
मेगाटॉम

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