ন্যানো কোর যুদ্ধ


21

এটি কোর ওয়ারের একটি রূপান্তর, যা 20 ম শতাব্দীর শেষের একটি প্রোগ্রামিং KOTH। আরও নির্দিষ্ট করে বলার জন্য, এটি অবিশ্বাস্যরূপে সরল নির্দেশাবলী সেটটি মূলত মূল প্রস্তাবের ভিত্তিতে ব্যবহার করছে ।

পটভূমি

কোর ওয়ারে কম্পিউটারে নিয়ন্ত্রণের জন্য লড়াই করা দুটি প্রোগ্রাম রয়েছে। প্রতিটি প্রোগ্রামের লক্ষ্য হ'ল বিপরীত প্রোগ্রামটি সনাক্ত করে এবং শেষ করে জিতে।

যুদ্ধ কম্পিউটারের মূল স্মৃতিতে সংঘটিত হয়। এই স্মৃতিটিকে কোর বলা হয় এবং এতে 8192 ঠিকানা রয়েছে। যুদ্ধ শুরু হলে, প্রতিটি প্রতিযোগীর কোড (যোদ্ধাকে বলা হয়) একটি এলোমেলো স্মৃতিতে রেখে দেওয়া হয়। প্রোগ্রামের সম্পাদন যোদ্ধাদের মধ্যে বিকল্প হয়, প্রতিটির একটি করে নির্দেশনা সম্পাদন করে। প্রতিটি নির্দেশ কোরের একটি অংশকে সংশোধন করতে সক্ষম, যার ফলে স্ব-পরিবর্তনকারী প্রোগ্রামের সম্ভাবনা তৈরি হয়।

লক্ষ্যটি হচ্ছে বিরোধী প্রোগ্রামটি সমাপ্ত করা। কোনও প্রোগ্রাম যখন অবৈধ নির্দেশ কার্যকর করার চেষ্টা করে তখন এটি বন্ধ হয়, যা কোনও DATনির্দেশ is

নির্দেশ সেট

প্রতিটি প্রোগ্রামে নিম্ন-স্তরের নির্দেশাবলীর একটি সিরিজ থাকে, যার প্রতিটিতে দুটি এবং দুটি ক্ষেত্র লাগে যা এ এবং বি ক্ষেত্র নামে পরিচিত।

এই নির্দেশিকা সেটটি মূল অনুমান থেকে খুব বেশি আঁকবে। প্রধান পরিবর্তনগুলি হ'ল) ​​কমান্ড যুক্ত / বিয়োগ সম্পর্কে স্পষ্টতা এবং 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- (শূন্য হলে লাফ দিন) - উভয় লাইনের ক্ষেত্র যদি B0 হয় তবে প্রোগ্রামটি লোকেশনে লাফিয়ে যায় A

    JMZ 2 1
    SUB 0 @0
    DAT 23 45
    

    যেহেতু নির্দেশের দুটি ক্ষেত্র 0 হ'ল, ড্যাট কমান্ডটি পরবর্তী সময়ে কার্যকর করা হবে, যার ফলে আসন্ন মৃত্যুর দিকে পরিচালিত হবে।

  • CMP A B- (তুলনা এবং যদি সমান নয় লাফালাফি) - নির্দেশাবলী ক্ষেত্র তাহলে Aএবং Bসমান নয়, পরবর্তী নির্দেশ কর।

    CMP #1 2
    ADD 2 #3
    SUB @2 3
    

    নির্দেশাবলী 1 এবং 2 এর দুটি ক্ষেত্রের মান সমান হওয়ায়, ADD কমান্ডটি এড়ানো যায় না এবং পরবর্তী পালা কার্যকর করা হয়।

দুটি নির্দেশ যুক্ত করা / বিয়োগ করা হলে দুটি ক্ষেত্র (A এবং B) জোড় / বিয়োগযুক্ত যোগ করা হবে। ঠিকানা মোড এবং অপকোড পরিবর্তন করা হয় না।

সম্বোধন মোড

তিন ধরণের অ্যাড্রেসিং মোড রয়েছে। কোনও নির্দেশনার দুটি ক্ষেত্রের প্রত্যেকটিতে এই তিনটি ঠিকানা মোডের একটি থাকে।

  • তাত্ক্ষণিক#X - Xগণনাতে সরাসরি ব্যবহৃত লাইন utation উদাহরণস্বরূপ, #0প্রোগ্রামটির প্রথম লাইন। Gণাত্মক রেখাগুলি প্রোগ্রাম শুরুর আগে মূল লাইনে উল্লেখ করে।

    ... //just a space-filler
    ...
    ADD #3 #4
    DAT 0 1
    DAT 2 4
    

    এটি দুটি ডিএটি লাইনের প্রথমটিকে দ্বিতীয়টিতে যুক্ত করবে, যেহেতু যথাক্রমে 3 এবং 4 লাইনে রয়েছে are তবে আপনি এই কোডটি ব্যবহার করতে চাইবেন না কারণ DAT পরবর্তী চক্রটিতে আপনার বটকে হত্যা করবে।

  • আপেক্ষিকX - সংখ্যা Xএকটি টার্গেট মেমরি অ্যাড্রেস অবস্থান, বর্তমান ঠিকানা আপেক্ষিক প্রতিনিধিত্ব করে। এই অবস্থানের নম্বর গণনায় ব্যবহৃত হয়। যদি লাইনটি #35কার্যকর করা হয় এবং এতে থাকে -5তবে লাইনটি #30ব্যবহৃত হয়।

    ... //just a space-filler
    ...
    ADD 2 1
    DAT 0 1
    DAT 2 4
    

    এটি প্রথমটিতে দ্বিতীয় ডিএটি লাইন যুক্ত করবে।

  • পরোক্ষ@X - নম্বরটি Xকোনও আপেক্ষিক ঠিকানার প্রতিনিধিত্ব করে। এই অবস্থানের বিষয়বস্তুগুলিকে অস্থায়ীভাবে এক্স সংখ্যাটিতে একটি নতুন আপেক্ষিক ঠিকানা তৈরি করতে যুক্ত করা হয়, যার থেকে নম্বরটি পুনরুদ্ধার করা হয়। যদি লাইনটি #35কার্যকর করা হয় এবং এর দ্বিতীয় ক্ষেত্রটি হয় @4এবং লাইনের দ্বিতীয় ক্ষেত্রটিতে #39সংখ্যা থাকে -7তবে লাইনটি #32ব্যবহৃত হয়।

    ... //just a space-filler
    ...
    ADD @1 @1
    DAT 0 1
    DAT 2 4
    

    এটি দ্বিতীয়টিতে প্রথম ডিএটি যুক্ত করবে তবে আরও সংশ্লেষিত উপায়ে। প্রথম ক্ষেত্রটি @ 1, যা সেই আপেক্ষিক ঠিকানা থেকে ডেটা পায় যা প্রথম DAT এর প্রথম ক্ষেত্র, একটি 0 মূল নির্দেশ থেকে অফসেট। দ্বিতীয় ক্ষেত্রের জন্য, @ 1 সেই আপেক্ষিক ঠিকানায় (প্রথম DAT এর দ্বিতীয় ক্ষেত্রের 1) থেকে মানটি পেয়ে যায় এবং এটি একইভাবে নিজেকে যুক্ত করে। মোট অফসেটটি তখন 1 + 1 = 2। সুতরাং, এই নির্দেশটি একইভাবে কার্যকর করা হয় ADD 1 2

প্রতিটি প্রোগ্রামে 64৪ টি নির্দেশ থাকতে পারে।

যখন একটি রাউন্ড শুরু হয়, দুটি প্রোগ্রাম 8192 অবস্থানের সাথে মেমরি ব্যাংকে এলোমেলোভাবে স্থাপন করা হয়। প্রতিটি প্রোগ্রামের নির্দেশিকা নির্দেশকটি প্রোগ্রামের শুরুতে শুরু হয় এবং প্রতিটি সম্পাদন চক্রের পরে বাড়ানো হয়। প্রোগ্রামের নির্দেশ নির্দেশক কোনও DATনির্দেশ কার্যকর করার চেষ্টা করার পরে এটি মারা যায় ।

কোর পরামিতি

মূল আকার 8192, 8192 * 8 = 65536 টিকের সময়সীমা সহ। মূলটি চক্রযুক্ত, সুতরাং 8195 ঠিকানায় লিখতে লেখা 3 ঠিকানার লিখনের সমান All সমস্ত অব্যবহৃত ঠিকানা সূচনা করা হয়েছে 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

এখানে, এ, বি এবং সি লেবেলগুলি 0, 1 এবং 2 লাইনগুলিতে রয়েছে উদাহরণস্বরূপ লেবেলের লাইন নম্বরটির #labelসাথে প্রতিস্থাপন করা হবে। উদাহরণগুলির labelবা @labelলেবেলের আপেক্ষিক অবস্থানের পরিবর্তে প্রতিস্থাপন করা হয়। ঠিকানা মোড সংরক্ষণ করা হয়।

ADD 1 @2
ADD #2 1
SUB -2 @-1

স্কোরিং

প্রতিযোগী প্রতিটি জোড়ের জন্য, প্রতিটি সম্ভাব্য যুদ্ধ করা হয়। যেহেতু যুদ্ধের ফলাফল দুটি প্রোগ্রামের আপেক্ষিক অফসেটের উপর নির্ভর করে, তাই প্রতিটি সম্ভাব্য অফসেট (এর মধ্যে প্রায় 8000) চেষ্টা করা হয়। তদ্ব্যতীত, প্রতিটি প্রোগ্রামের প্রতিটি অফসেটে প্রথমে সরানোর সুযোগ রয়েছে। এই অফসেটগুলির সিংহভাগে যে প্রোগ্রামটি জয়লাভ করে তা হ'ল এই জুটির বিজয়ী।

যোদ্ধা যে জয়ী হয় প্রতিটি জুটির জন্য এটি 2 পয়েন্ট দেওয়া হয়। প্রতিটি টাইয়ের জন্য, একজন যোদ্ধাকে 1 পয়েন্ট দেওয়া হয়।

আপনাকে একাধিক যোদ্ধা জমা দেওয়ার অনুমতি দেওয়া হয়েছে। একাধিক সাবমিশনের জন্য সাধারণ নিয়মগুলি প্রয়োগ হয়, যেমন কোনও ট্যাগ-দলবদ্ধকরণ, কোনও সহযোগিতা, কোনও রাজা-তৈরি ইত্যাদি etc.

নিয়ামক

দুটি সহজ উদাহরণ বট সহ কন্ট্রোলারের জন্য কোডটি এখানে অবস্থিত । যেহেতু এই প্রতিযোগিতাটি (অফিসিয়াল সেটিংস ব্যবহার করে চালানো হয়) সম্পূর্ণ নিরোধক, তাই আপনার তৈরি লিডারবোর্ডটি অফিশিয়াল লিডারবোর্ডের মতোই হবে।

উদাহরণ বট

ভাষাটির কয়েকটি বৈশিষ্ট্য প্রদর্শন করে এমন একটি বট এখানে দেওয়া হয়েছে।

main mov bomb #-1
     add @main main
     jmp #main 0
bomb dat 0 -1

এই বটটি "বোমা" দিয়ে প্রতিস্থাপন করে কোরটিতে সমস্ত অন্যান্য স্মৃতি ধীরে ধীরে মুছে ফেলে কাজ করে ope বোমা যেহেতু একটি DATনির্দেশনা তাই বোমাতে পৌঁছানো যে কোনও প্রোগ্রাম ধ্বংস হয়ে যাবে।

দুটি লাইন লেবেল রয়েছে, "প্রধান" এবং "বোমা" যা সংখ্যাগুলি প্রতিস্থাপন করে। প্রিপ্রোসেসিংয়ের পরে, প্রোগ্রামটি এরকম দেখাচ্ছে:

MOV 3 #-1
ADD @-1 -1
JMP #0 0
DAT 0 -1

প্রথম লাইনে বোমাটি কপিরাইটের সাথে সাথে প্রোগ্রামের উপরে aboveুকিয়ে দেয়। পরবর্তী লাইনটি বোমাটির মান ( 0 -1) মুভ কমান্ডে যুক্ত করে এবং এটি @অ্যাড্রেসিং মোডের ব্যবহারও প্রদর্শন করে। এই সংযোজনের ফলে মুভ কমান্ডটি একটি নতুন টার্গেটকে নির্দেশ করে। পরের কমান্ডটি শর্তহীনভাবে প্রোগ্রামটির শুরুতে ফিরে আসে।


বর্তমান লিডারবোর্ড

24 - টার্বো
22 - দ্বারভেনজিনিয়ার
20 - হ্যানশটফার্স্ট
18 - বামন
14 - স্ক্যানবম্বার
10 - প্যারানয়েড
10 - ফার্স্টটাইমার
10 - জানিটর
10 - বিবর্তিত
6 - ইস্টারবুনি
6 - কপিরপাস্ট
4 - ইমপ
2 - স্লাগ

পেয়ারওয়াইস ফলাফল:

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 মিনিট সময় নিয়েছে। আমি তার উন্নয়নের জন্য Ilmari Karonen ধন্যবাদ জানাতে চাই নিয়ামক । আপনার কাছে যদি কন্ট্রোলারের স্থানীয় কপি থাকে তবে আপনার ফাইলগুলি আপডেট করা উচিত।


দুটি প্রতিযোগী বট যদি একই লেবেলটি ব্যবহার করার চেষ্টা করে তবে কী হবে?
mbomb007

1
@ mbomb007 লেবেলগুলি প্রাক প্রসেসিংয়ের জিনিস এবং বটের উত্স ফাইলটি বিশ্লেষণ করার কারণে গণনা করা হয়। আপনার লেবেলগুলি কোনও প্রতিযোগী লেবেলের সাথে ইন্টারঅ্যাক্ট করবে না।
ফিনোটপিআই

1
@ mbomb007 যাতে প্রোগ্রামগুলি ওভারল্যাপ না হয়। এছাড়াও, আমি এই সংস্করণে আর কোনও বৈশিষ্ট্য যুক্ত করার পরিকল্পনা করি না, মাইক্রো কোর ওয়ারের জন্য সেগুলি সংরক্ষণ করি।
ফিনোটপিআই

1
@ mbomb007 পরোক্ষ সম্বোধন একই ক্ষেত্রটি উল্লেখ করে যা রেফারেন্স করছে (প্রথম বা দ্বিতীয়)। কোনও নির্দেশিকা পরিবর্তনকারী নেই। আমি এই চ্যালেঞ্জটিকে '94 স্ট্যান্ডার্ড ছাড়াই বেস করছি না।
PhiNotPi

2
@ থ্রাক্স আমি না বলতে চাই, আপনি কেবল একটি জমা দেওয়ার মধ্যে সীমাবদ্ধ নন। মূল মাল্টি-সাবমিশন নিয়মগুলি প্রয়োগ হয় (কোনও ট্যাগ-দলবদ্ধকরণ ইত্যাদি নয়) যদিও মূল যুদ্ধগুলিতে কোনওভাবে সহযোগিতার জন্য খুব বেশি জায়গা নেই।
PhiNotPi

উত্তর:


9

দ্বারভেন ইঞ্জিনিয়ার

একটি নতুন এবং উন্নত বামন। এখনও পর্যন্ত জমা দেওয়া সমস্ত কিছুর বিরুদ্ধে জয় অভিনব কোরস্টেপ- অনুকূলিত ধাপের আকারটি সম্ভবত এখানে ওভারকিল।

        MOV bomb    @aim
aim     MOV bomb    @-6326
        SUB step    aim
step    JMZ #0      6328
        MOV 0       1
bomb    DAT 0       3164

উল্লেখযোগ্য বৈশিষ্ট্যগুলির মধ্যে রয়েছে দ্রুত বোমা ফাটানো লুপ যা চারটি চক্রের দুটি বোমা নিক্ষেপ করে, পুরানো কোর ওয়ার জার্গনে গড়ে বোমা ফাটার গতিবেগের জন্য, এবং JMZবোমাবর্ষণ চালানো কখন শেষ হবে তা সনাক্ত করার জন্য এবং এটি বিয়ের পরিকল্পনায় স্যুইচ করার সময় এসেছে ( এখানে, একটি ছাপ)


আমি ৯০ এর দশকে কোর ওয়ার ফিরে খেলি (আপনারা কেউ কেউ বেসিক গাইডবুকটি '97-এ লিখেছিলেন), তাই আমি ভেবেছিলাম যে রেডকোড'৮৮ /'৯৯ ওয়ার্ল্ডের কোন পুরানো কৌশলগুলি দেখতে পারা আকর্ষণীয় হবে? এই বৈকল্পিক কার্যকর হতে হবে।

আমার প্রথম চিন্তাগুলি ছিল:

  • নেই SPL, এইভাবে কোনও প্রতিলিপি নেই (এবং কোনও ইমপ রিং / সর্পিল নেই)। এটি বোম্বারদের শক্তিশালী করে তুলতে হবে। (এছাড়াও, অনুলিপিকারকেরা নিয়ে কারবার বারবেল? পুরোটাই অপ্রয়োজনীয় এবং এখানে বেহুদা। সাথে শুধু বোমা IMP করার জন্য ডিজাইন করা সমস্ত অভিনব বোমা হামলার কৌশল DATগুলি।)

  • তারপরে, CMPবোমা ফেলার চেয়ে স্ক্যানিং এখনও সম্ভাব্য দ্রুত, তাই দ্রুত স্ক্যানারের সুযোগ থাকতে পারে।

  • / হ্রাসের অনুপস্থিতি কোর ক্লিয়ারগুলি খুব ধীর করে তোলে। প্রকৃতপক্ষে, এই বৈকল্পিকটির একটি পরিষ্কার স্পষ্টতই একটি বোমারু বিমান sub 1 এর (সাবপটিমাল) ধাপের আকারের। আবার এটি স্ক্যানারকেও ব্যথা দেয়; যদিও একটি শট স্ক্যানার → বোমার কৌশল কার্যকর হতে পারে

  • কুইকস্ক্যানার / কুইকবম্বার্স (কোর-যুদ্ধের ঝাঁকুনির মতো ফ্যামিলার নয় এমনদের জন্য একটি অনিয়ন্ত্রিত স্ক্যানিং / বোম্বিং লুপ ব্যবহার করে একটি প্রাথমিক খেলা কৌশল) এখনও সম্ভাব্য কার্যকর তবে কেবল দীর্ঘ প্রোগ্রামের বিরুদ্ধে (যা তারা নিজেরাই, তাই এক ধরণের প্রতিক্রিয়া রয়েছে) প্রভাব এখানে)। এটি সত্যিই ঝামেলার পক্ষে মূল্যবান কিনা তা বলা শক্ত।

  • স্কোরিং সিস্টেমটি আকর্ষণীয়। খেলাগুলি একটি জয় হিসাবে অর্ধেক পয়েন্ট স্কোর করে (1/তিহ্যবাহী মূল যুদ্ধের মতো 1/3 নয়), তাদের আরও আকর্ষণীয় করে তোলে। তারপরে আবার, এই নিয়মের অধীনে প্রচুর সম্পর্ক স্থাপনের সম্ভাব্য একমাত্র প্রোগ্রামটি একটি প্রতিবন্ধকতা। (এছাড়াও, ডি অভাবে / বাড়তি বিচ্ছু গেটস কঠিন, তাই এমনকি সহজ imps আসলে তোলে না টাই রান যদি তারা তাদের প্রতিপক্ষের জীবিত পৌঁছানোর একটি সুযোগ আছে।)

  • এছাড়াও, কারণ চূড়ান্ত স্থান শুধুমাত্র যা প্রোগ্রাম আপনাকে আঘাত, এবং কিভাবে উপর নির্ভর করে অনেক আপনি তাদের দ্বারা বীট, এটা সাধারণ এন্ট্রি পক্ষপাতী থাকে। এর মধ্যে অর্ধেক পুরোপুরি ধ্বংস না করে কেবলমাত্র আপনার সমস্ত প্রতিপক্ষকে পরাভূত করা আরও ভাল rest

  • কোডটি সর্বজনীন হওয়ায় সর্বদা এমন কোনও প্রোগ্রাম খুঁজে পাওয়া সম্ভব যা পূর্বের যে কোনও জমা দিতে পারে - সম্ভবত তাদের মধ্যে বেশ কয়েকটিও - তারা সাধারণভাবে কতটা ভাল তা বিবেচনা করে না। এ জাতীয় কৌশলগুলি (আপনার ধাক্কা দেওয়ার আগে আপনার প্রতিপক্ষকে আঘাত করার জন্য আপনার ধাপের আকারটি সুর করার মতো) সহজেই সস্তা বলে মনে হতে পারে। এবং অবশ্যই, লক্ষ্য প্লেয়ার সর্বদা বিভিন্ন ধ্রুবক সহ একটি নতুন সংস্করণ জমা দিতে পারে।

যাই হোক, এই সব ফল আমি সিদ্ধান্ত নিয়েছি যে আমি হয় একটি ফাস্ট বোমারু বিমান বা লিখতে চেষ্টা করা উচিত নয় খুব দ্রুত স্ক্যানার, এবং হয়ত এটা সম্মুখের ট্যাক একটি quickscanner / বোমারু বিমান। এই বিকল্পগুলির মধ্যে একটি দ্রুত বোমারু বিমানটি সবচেয়ে সহজ এবং কাজ করার সম্ভাবনা সবচেয়ে বেশি মনে হয়েছিল।

এই মুহুর্তে, আমি ফিল্নটপি'র দোভাষী কোডটি টুইট এবং অপ্টিমাইজ করার জন্য অনেক বেশি সময় ব্যয় করেছি, কারণ আমি বুঝতে পেরেছিলাম যে আমি সম্ভবত ধ্রুবকদের অনুকূল করতে অনেকগুলি নিষ্ঠুর শক্তি বিচার চালাচ্ছি। যেমনটি ঘটেছিল, আমাকে কখনই এটি করতে হয়নি - উপরের কোডটি আসলে প্রথম সংস্করণ যা আসলে কাজ করেছিল (বেশ কিছু ব্যর্থ চেষ্টার পরে যা নিরীহ বাগের কারণে আত্মহত্যা করেছে)।


যে কৌশলটি আমার বোমারুটিকে দ্রুত করে তোলে সেগুলি পরোক্ষ ঠিকানা ব্যবহার করে প্রতিটিটির জন্য দুটি বোমা নিক্ষেপ করে ADD। এটি কীভাবে কাজ করে তা এখানে:

  1. প্রথম চক্রটিতে, আমরা কার্যকর করি MOV bomb @aim। এটি bombমূল বি-ফিল্ডের aimবিন্দুগুলিতে যে কোনও জায়গায় নির্দেশের অনুলিপি করে (প্রাথমিকভাবে, ঠিক আগে 63৩২26 নির্দেশাবলীর আগে aim, বা 28৩২২ নির্দেশাবলীর আগে step; আপনি কেন এই সংখ্যাগুলি পরে গুরুত্বপূর্ণ তা দেখতে পাবেন)।

  2. পরবর্তী পদক্ষেপে, আমরা aimনিজেই নির্দেশটি কার্যকর করি ! প্রথম পাস উপর, এটা ভালো দেখায়: MOV bomb @-6326। সুতরাং, bombনির্দেশের বি-ফিল্ডটি .৩২26 লাইনে নিজেই নির্দেশ করার আগে এটি অনুলিপি করে।

    তো, এর আগে 63৩২26 লাইনে কী আছে aim? কেন, এটি আমাদের অনুলিপিটি bombএখানে কেবল একটি চক্র আগে রেখেছিল! এবং আমরা কেবল জিনিসগুলি সাজানোর জন্যই হয়েছি যাতে বি-ফিল্ডটির bombএকটি শূন্য-মান না থাকে, তাই নতুন বোমাটি পুরানোটির উপরে অনুলিপি করা হবে না, তবে কিছুটা দূরে রয়েছে (আসলে, এখানে দূরত্বটি 3164, যা আমাদের নামমাত্র ধাপের 63৩৮২ এর অর্ধেক; তবে অন্যান্য অফসেটগুলি আরও ভাল কাজ করতে পারে)।

  3. পরবর্তী চক্রটিতে, আমরা আমাদের লক্ষ্যটি সমন্বিত করি SUB step aim, যা stepনির্দেশের মানগুলি বিয়োগ করে (যা পরবর্তী অবস্থাতে লাফিয়ে লাফিয়ে লাফিয়ে উঠতে পারে , যদিও এটি DATকোথাও সহজ হতে পারে ) aim

    (এখানে লক্ষ করার জন্য একটি বিশদটি হ'ল আমরা এক ধরণের এ-মানটি stepশূন্য হতে চাই, যাতে আমরা পরবর্তী বারে একই বোমা নিক্ষেপ করব on এমনকি এটি কঠোরভাবে প্রয়োজনীয় নয়, কেবল বোমা নিক্ষেপ করা দ্বারা প্রথম 3164 তাদের বি-ক্ষেত্র সমান আছে নির্দেশনার প্রয়োজন, বাকি কিছু হতে পারে।)

  4. এরপরে, JMZপরীক্ষাটি দেখুন যে এটি থেকে 6328 পদক্ষেপ দূরে এখনও শূন্য, এবং যদি থাকে তবে কোডের শীর্ষে ফিরে যায়। এখন, 28৩২৮ হ'ল আমাদের বোমার ধাপের আকার এবং এটি 8 দ্বারা বিভাজ্য (তবে 16 নয়); এইভাবে, যদি আমরা প্রতি 28৩২২ পদক্ষেপে কেবল বোমা নিক্ষেপ করতে থাকি তবে আমরা শেষ পর্যন্ত যেখানে ফিরে এসেছি সেখানে ফিরে আসব এবং প্রতিটি অষ্টম নির্দেশকে বোমা মেরে ফেলেছিলাম (এবং অতিরিক্ত বোমাগুলি 3163 = 6328/2 by 4 (আধুনিক 8) দ্বারা অফসেট করা হয়েছে) , আমরা প্রতি চতুর্থ নির্দেশ হিট করব )।

    কিন্তু আমরা 6328 নির্দেশাবলী আমাদের বোমাবর্ষণ রান শুরু করার আগেJMZ , এবং, প্রতি পুনরাবৃত্তির এ -6328 দ্বারা পিছন ধাপ ধাপ তাই আমরা অবস্থান 6328 পদক্ষেপ বোমা যাচ্ছেন পরJMZ মাত্র এক পুনরাবৃত্তির আগে আমরা আঘাত করবে JMZনিজেই। সুতরাং এর পরে যখন JMZbomb৩২৮ নির্দেশাবলীতে বোমাটি সনাক্ত করা যায়, তখন এটি একটি চিহ্ন যে আমরা নিজের উপর আঘাত না করে যতটা সম্ভব মূল অংশটি coveredেকে রেখেছি এবং নিজেরকে মেরে ফেলার আগে ব্যাকআপ স্ট্র্যাটেজে যাওয়া উচিত।

  5. ব্যাকআপ কৌশল হিসাবে, এটি কেবল একটি সাধারণ পুরানো MOV 0 1ছাপ, কারণ আমি আপাতত আরও ভাল কিছু ভাবতে পারি না। আমি এটি যেভাবে দেখছি, যদি আমরা কোরটির প্রতিটি চতুর্থ স্থানে বোমা ফাটিয়ে ফেলেছি এবং এখনও জিততে পারি না, তবে আমরা সম্ভবত খুব ছোট বা খুব প্রতিরক্ষামূলক কিছু লড়াই করছি, এবং পাশাপাশি বাঁচতে এবং টাইয়ের জন্য নিষ্পত্তি করার চেষ্টাও করতে পারি। এটি ঠিক আছে, কারণ এই জাতীয় ছোট বা প্রতিরক্ষামূলক প্রোগ্রামগুলি অন্য কিছু হত্যার পক্ষে খুব ভাল হয় না, এবং তাই আমরা যদি কেবলমাত্র সুযোগের সাথে কয়েকটি মারামারিও জিতি তবে আমরা সম্ভবত এগিয়ে আসব।


গীত। মামলা অন্য কেউ এটা ব্যবহার করতে চান, এখানে আমার নেই PhiNotPi এর টুর্নামেন্ট কোডের অবস্থার কিছুটা উন্নতি ঘটে কাঁটাচামচ । এটি প্রায় দ্বিগুণ দ্রুত, যুদ্ধের পুরানো ফলাফলগুলি সংরক্ষণ করে যাতে আপনার এগুলি পুনরায় চালানোর দরকার হয় না এবং যুদ্ধ ফলাফলের গণনার গণনাতে আমি যেটিকে একটি ছোটখাটো বাগ বলে বিশ্বাস করি তা স্থির করে পরিবর্তনগুলি ফিলনটপি দ্বারা মূললাইন সংস্করণে একীভূত করা হয়েছে । ধন্যবাদ!


1
ঠিক তাই আপনি জানেন, স্কোরিং প্রোগ্রামের শুরুতে অবস্থিত সমস্ত সম্ভাব্য সংমিশ্রণের পরীক্ষা করে এবং প্রোগ্রামটি সবচেয়ে বেশি পয়েন্ট স্কোর করে। এটি সম্পর্কগুলি অসম্ভব বা সম্পূর্ণ প্রতিকূল করে তোলে যতক্ষণ না কোনও প্রোগ্রাম কখনও নিজেকে হত্যা করে না এবং কমপক্ষে একটি ঠিকানা একবার বোমা দেয়, এটি একটি প্রভাবকে পরাজিত করবে, একটি জয়ের সাথে থাকবে এবং বাকী সম্পর্কগুলি।
mbomb007

9

গ্রাফ ভিউ

এটি একটি ডিবাগিং সরঞ্জাম হিসাবে ব্যবহার করা যেতে পারে। এটি কোরটি প্রদর্শন করে এবং প্লেয়ারের অবস্থান প্রদর্শন করে। এটি ব্যবহার করতে আপনাকে কোড থেকে কল করতে হবে। আমি এমন একটি Game.javaসংশোধনও সরবরাহ করেছি যা গ্রাফ ভিউটি স্বয়ংক্রিয়ভাবে প্রদর্শিত হয়।

ফিলনটপি এবং ইলমারি করোনেন সম্প্রতি কন্ট্রোলার পরিবর্তন করেছেন। ইলমারি করোনেন এই স্থানে আপডেট গেম ভিউ সরবরাহ করার জন্য যথেষ্ট সদয় হয়েছেন ।

import javax.swing.*;
import java.awt.*;

public class GameView extends JComponent{

    final static Color[] commandColors = new Color[]{
            Color.black, //DAT
            Color.blue,  //MOV
            Color.blue,  //ADD
            Color.blue,  //SUB
            Color.blue,  //JMP
            Color.blue,  //JMZ
            Color.blue,  //CMP
    };

    final static Color[] specialColors = new Color[]{
            new Color(0,0,0),
            new Color(190, 255, 152),
            Color.yellow,
            new Color(0, 93, 14),
            new Color(96, 92, 4),
            new Color(0, 93, 14),
            new Color(96, 92, 4),
            new Color(0, 93, 14),
            new Color(96, 92, 4)
    };

    final static Color playerOneColor = Color.green;
    final static Color playerTwoColor = Color.white;

    final Game game;

    int playerOneLocation;
    int playerTwoLocation;

    final static int width = 128;
    final static int height = 64;

    public GameView(Game game) {
        this.game = game;
    }

    @Override
    public void paint(Graphics g) {
        int pixelWidth = getSize().width;
        int pixelHeight = getSize().height;
        if (width > pixelWidth){
            pixelWidth = width;
            setSize(width, pixelHeight);
        }
        if (height > pixelHeight){
            pixelHeight = height;
            setSize(pixelWidth, height);
        }
        int squareWidth = Math.min(pixelWidth / width, pixelHeight / height);
        for (int x = 0; x < squareWidth * width; x += squareWidth){
            for (int y = 0; y < squareWidth * height; y += squareWidth){
                int index = (y / squareWidth) * width + (x / squareWidth);
                Color color = commandColors[game.core[index][0]];
                if (game.coreData[index] != 0){
                    color = specialColors[game.coreData[index]];
                }
                if (index == playerOneLocation){
                    color = playerOneColor;
                }
                if (index == playerTwoLocation){
                    color = playerTwoColor;
                }
                g.setColor(color);
                g.fillRect(x, y, squareWidth, squareWidth);
            }
        }
    }

    public void setLocations(int p1loc, int p2loc){
        this.playerOneLocation = p1loc;
        this.playerTwoLocation = p2loc;
    }
}

পরিবর্তিত গেম.জাভা:

import javax.swing.*;
import java.util.Random;
import java.util.ArrayList;
import java.util.Arrays;
/**
 * This runs a game of Core Wars between two players.  It can be called mutiple times.
 * 
 * @author PhiNotPi 
 * @version 3/10/15
 */
public class Game
{
    final Player p1;
    final Player p2;
    final int coreSize;
    final int coreSizeM1;
    final int maxTime;
    final int debug;
    public int[][] core;
    public int[] coreData; //Used in debugging.
    int offset1;
    int offset2;
    Random rand;
    ArrayList<int[]> p1code;
    ArrayList<int[]> p2code;
    int p1size;
    int p2size;
    GameView gameView;
    int time = 1000000; //Time in nanoseconds between frames
    public Game(Player A, Player B, int coreSize, int maxTime, int debug)
    {
        p1 = A;
        p2 = B;

        coreSize--;
        coreSize |= coreSize >> 1;
        coreSize |= coreSize >> 2;
        coreSize |= coreSize >> 4;
        coreSize |= coreSize >> 8;
        coreSize |= coreSize >> 16;
        coreSize++;

        this.coreSize = coreSize;
        this.coreSizeM1 = coreSize - 1;
        this.maxTime = maxTime / 2;
        this.debug = debug;
        core = new int[coreSize][5];
        rand = new Random();
        p1code =  p1.getCode();
        p1size = p1code.size();
        p2code =  p2.getCode();
        p2size = p2code.size();
        if (debug == 1){
            gameView = new GameView(this);
            JFrame frame = new JFrame("Game");
            frame.add(gameView);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            frame.setSize(128, 64);
            coreData = new int[coreSize];
        }
    }

    public int runAll()
    {
        int sum = 0;
        for(int i = 0; i < coreSize - p1size - p2size; i++)
        {
            sum += run(i) - 1;
        }
        if(sum > 0)
        {
            return 1;
        }
        if(sum < 0)
        {
            return -1;
        }
        return 0;
    }

    public int run()
    {
        return run(rand.nextInt(coreSize - p1size - p2size + 1));
    }

    public int run(int deltaOffset)
    {
        core = new int[coreSize][5];
        //offset1 = rand.nextInt(coreSize);
        offset1 = 0;
        for(int i = 0; i != p1size; i++)
        {
            //System.arraycopy(p1.getCode().get(i), 0, core[(offset1 + i) % coreSize], 0, 5 );
            int[] line = p1code.get(i);
            int loc = (offset1 + i) & coreSizeM1;
            core[loc][0] = line[0];
            core[loc][1] = line[1];
            core[loc][2] = line[2];
            core[loc][3] = line[3];
            core[loc][4] = line[4];
            if (debug != 0){
                coreData[loc] = 1;
            }
        }
        offset2 = offset1 + p1size + deltaOffset;
        for(int i = 0; i != p2size; i++)
        {
            //System.arraycopy(p2.getCode().get(i), 0, core[(offset2 + i) % coreSize], 0, 5 );
            int[] line = p2code.get(i);
            int loc = (offset2 + i) & coreSizeM1;
            core[loc][0] = line[0];
            core[loc][1] = line[1];
            core[loc][2] = line[2];
            core[loc][3] = line[3];
            core[loc][4] = line[4];
            if (debug != 0){
                coreData[loc] = 2;
            }
        }

        int p1loc = offset1 & coreSizeM1;
        int p2loc = offset2 & coreSizeM1;
        for(int time = 0; time != maxTime; time++)
        {
            if(debug != 0)
            {
                //printCore(p1loc,p2loc);
                //System.out.println("p1loc " + p1loc);
                //System.out.println("offset " + offset1);
                gameView.setLocations(p1loc, p2loc);
                gameView.repaint();
                try {
                    Thread.sleep(time / 1000000, time % 1000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            if(core[p1loc][0] == 0)
            {
                return 0;
            }
            p1loc = execute(p1loc, offset1, 1);

            if(debug != 0)
            {
                //printCore(p1loc,p2loc);
                //System.out.println("p2loc " + p2loc);
                //System.out.println("offset " + offset2);
                gameView.setLocations(p1loc, p2loc);
                gameView.repaint();
                /*try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/
            }
            if(core[p2loc][0] == 0)
            {
                return 2;
            }
            p2loc = execute(p2loc, offset2, 2);

        }
        return 1;
    }
    public int execute(int ploc, int offset, int player)
    {
        int line1 = offset + core[ploc][3];
        if(core[ploc][1] != 0)
        {
            line1 += ploc - offset;
        }
        if(core[ploc][1] == 2)
        {
            line1 += core[line1 & coreSizeM1][3];
        }
        int line2 = offset + core[ploc][4];
        if(core[ploc][2] != 0)
        {
            line2 += ploc - offset;
        }
        if(core[ploc][2] == 2)
        {
            line2 += core[line2 & coreSizeM1][4];
        }
        line1 = line1 & coreSizeM1;
        line2 = line2 & coreSizeM1;
        int opcode = core[ploc][0];
        ploc = (ploc + 1) & coreSizeM1;
        //String opDescription = "";
        if(opcode == 1)
        {
            core[line2][0] = core[line1][0];
            core[line2][1] = core[line1][1];
            core[line2][2] = core[line1][2];
            core[line2][3] = core[line1][3];
            core[line2][4] = core[line1][4];
            if (debug != 0) {
                coreData[line2] = player + 2;
            }
            return ploc;
            //opDescription = "Moved from " + line1 + " to " + line2;
        }
        if(opcode == 2)
        {
            core[line2][3] += core[line1][3];
            core[line2][4] += core[line1][4];
            if (debug != 0) {
                coreData[line2] = player + 4;
            }
            return ploc;
            //opDescription = "Added " + line1 + " to " + line2;
        }
        if(opcode == 3)
        {
            core[line2][3] -= core[line1][3];
            core[line2][4] -= core[line1][4];
            if (debug != 0) {
                coreData[line2] = player + 6;
            }
            return ploc;
                //opDescription = "Subtracted " + line1 + " to " + line2;
        }
        if(opcode == 4)
        {
            ploc = line1;
            return ploc;
                //opDescription = "Jumped to " + line1;
        }
        if(opcode == 5)
        {
                if(core[line2][3] == 0 && core[line2][4] == 0)
                {
                    ploc = line1;
                    //opDescription = "Jumped to " + line1;
                }
                else
                {
                    //opDescription = "Did not jump to " + line1;
                }
                return ploc;
        }
        if(opcode == 6)
        {
            if(core[line1][3] == core[line2][3] && core[line1][4] == core[line2][4])
            {
                //opDescription = "Did not skip because " + line1 + " and " + line2 + " were equal.";
            }
            else
            {
                ploc = (ploc + 1) & coreSizeM1;
                //opDescription = "Skipped because " + line1 + " and " + line2 + " were not equal.";
            }
            return ploc;
        }
        if(debug != 0)
        {
            //System.out.println(opDescription);
        }
        return ploc;
    }
    /*public void printCore(int p1loc, int p2loc)
    {
        int dupCount = 0;
        int[] dupLine = new int[]{0,0,0,0,0};
        for(int i = 0; i < core.length; i++)
        {
            int[] line = core[i];
            if(Arrays.equals(line, dupLine) && i != p1loc && i != p2loc)
            {
                if(dupCount == 0)
                {
                    System.out.println(Player.toString(line));
                }
                dupCount++;
            }
            else
            {
                if(dupCount == 2)
                {
                    System.out.println(Player.toString(dupLine));
                }
                else if(dupCount > 2)
                {
                    System.out.println("    " + (dupCount - 1) + " lines skipped.");
                }
                System.out.println(Player.toString(line));
                if(i == p1loc)
                {
                    System.out.print(" <- 1");
                }
                if(i == p2loc)
                {
                    System.out.print(" <- 2");
                }
                dupLine = line;
                dupCount = 1;
            }
        }
        if(dupCount == 2)
        {
            System.out.println(Player.toString(dupLine));
        }
        else if(dupCount > 2)
        {
            System.out.println("    " + (dupCount - 1) + " lines skipped.");
        }
    }*/
}

দেখে মনে হচ্ছে আপনি প্লেয়ারেও একটি পরিবর্তন করেছেন। আমি পেয়েছি./Game.java:275: error: method toString in class Object cannot be applied to given types; System.out.println(Player.toString(line)); ^ required: no arguments found: int[]
এশেলি

এই সম্পর্কে @ শ্যাশলি দুঃখিত আমার printCore()পদ্ধতিটি সম্পর্কে মন্তব্য করা উচিত ।
TheNumberOne

9

টার্বো

main   add three target
test   jmz -1 @target
bomb   mov three @target
       sub j1 target 
       mov jump @target
       sub j1 target 
       mov copy @target
       sub j1 target
two    mov decr @target
j1     jmp @target 1
target dat -8 -8   
decr   sub #two 3
copy   mov 2 @2
jump   jmp -2 0
three dat -9 -9

আমার দ্বিতীয়বারের কোরওয়ার প্রচেষ্টা। বামনকে মারার জন্য নকশাকৃত। ডেটার জন্য 3 এর স্ক্যান করে, তারপর প্রতি 2 টি বোমা ফেলে Each প্রতিটি স্তরের মাত্র 3 নির্দেশাবলীতে চালানো হয়, এই আশায় যে বামনের বোমা এটি মিস করে।

নতুন টার্বো ++ : এখন উন্নত। এটি ডেটা না পাওয়া পর্যন্ত পিছনে স্ক্যান করে, সেখানে নিজেকে সেখানে নিয়ে যায় এবং তারপরে বোমা ফাটিয়ে দেয়। আশা করা যায় যে পদক্ষেপটি হয় প্রতিপক্ষকে ক্লোবার করে, অথবা এমন কোনও জায়গায় ইতিমধ্যে বোমা ফেলা হয়েছে এবং তাই নিরাপদ (ইশ) h

... এবং এটিকে আরও কম স্ক্যান করার জন্য একটি সম্পাদনা এটিকে সবাইকে পরাজিত করে!


দেখে মনে হচ্ছে কেবল বামন ছাড়াও আরও অনেক কিছু বীট হয়েছে। অভিনন্দন! আমি মনে করি আপনি কেবল ইম্পকেও মারতে পারলে আপনি তৃতীয় স্থানে পৌঁছে যেতে পারেন।
ইলমারি করোনেন

আমি এটিকে আপডেট করেছি, তবে এটি আগেরটির থেকে মোটামুটি বড় বিবর্তন। পরিবর্তে আমার নতুন প্রবেশ করা উচিত ছিল?
এশেলি

আমি ফিলনটপি-র পক্ষে কথা বলার কথা মনে করি না, তবে আমি অনুমান করি এটি আপনার উপর নির্ভর করে। ইন-প্লেস আপডেট করার অর্থ মূলত আপনার পুরানো এন্ট্রি প্রত্যাহার করা। যাইহোক, তৃতীয় স্থানে যাওয়ার পথে সফলভাবে বোমা ফেলার জন্য আরও অভিনন্দন! আমি মনে করি দ্বারভেনজিনিয়ার পেয়ারওয়াইজকে হারিয়ে এখন পর্যন্ত আপনার একমাত্র প্রবেশ।
ইলমারি করোনেন

সাবাশ ;). আপনি এখনই মারবেন!
আঘাত করুন

8

বামন

একটি সাধারণ এবং সাধারণ প্রোগ্রাম যা পাথর নিক্ষেপকারী বামনকে উপস্থাপন করে। এটি DATপ্রতি চারটি ঠিকানায় একটি নির্দেশ দেয়।

add 2 3
mov 2 @2
jmp -2 #4
dat #0 #4

সম্পাদনা: ঠিক করা ঠিকানা। দৃশ্যত অ্যাড্রেসিং মোডগুলি ওপিতে লিঙ্কিত বৈশিষ্ট থেকে আলাদা।


আমি মনে করি এটি প্রথম লাইনের জন্য "3 # যুক্ত করুন", তাই না?
আঘাত করুন

@ হিট না আমি প্রতি 4 র্থ ঠিকানা হিট করতে চাই। আমি ব্যবহার করতে পারি add 3 3, তবে তারপরে এটি যুক্ত করার পরিবর্তে প্রতিটি লুপ দ্বিগুণ করবে এবং এটি কার্যকর হবে না। #4এটি একটি তাত্ক্ষণিক, সুতরাং এটি বর্তমান ঠিকানার পরে থাকা 4ঠিকানায় দ্বিতীয় সংখ্যাটিতে সংখ্যাটি যুক্ত করে 3
mbomb007

আমি মনে করি আপনি #চ্যালেঞ্জের মধ্যে ঠিকানা মোডের ভুল ব্যাখ্যা করছেন । যেমনটি অনুমান অনুসারে বলা হয়েছে, আমি #ঠিকানা মোডে পরিবর্তন করেছি ।
PhiNotPi

আপনার মতো হওয়া উচিত: "2 3 মুভি 2 @ 2 জম্পি -2 4 ড্যাট 0 4 যোগ করুন"
আঘাত করুন

সঠিক আচরণের সাথে এমনকি এটি বিকশিত হয়
আঘাত করুন

7

প্রসূত

আমি কীভাবে এটি কাজ করে তা সত্যই পাই না। মনে হচ্ছে কিছু করার আগে এর উত্স কোডটি তৈরি করা হয়েছে। এটি কীভাবে কাজ করে তার জন্য যদি কেউ আমাকে ব্যাখ্যা দেয় তবে আমি এটি পছন্দ করব।

এটি অধ্যয়ন করার পরে, আমি দেখতে পেলাম যে এটি কেবল একটি ইমপ গার্ড সহ একটি পরিবর্তিত বামন। DATনির্দেশাবলী দিয়ে শত্রুদের বোমা ফেলার পরিবর্তে এটি শত্রুদের কোডটি বদলে দেয় । এটি প্রতি চারটি নিবন্ধের পরিবর্তে প্রতি দুটি নিবন্ধকে বোমা দেয়। যথেষ্ট সময় দেওয়া, নিঃসন্দেহে এটি নিজেকে ধ্বংস করবে।

MOV -2 #-1
MOV #4 -9
SUB -5 #6
MOV #1 1
MOV #-6 #4
SUB @8 @7
JMP -3 @4
DAT #-4 8
JMP -1 9
JMP 5 #-10
CMP @-1 #0
SUB 3 #-10
JMP @10 #-9
JMZ #1 10
MOV #3 2
ADD @9 @-3
CMP #-3 @7
DAT @0 @-2
JMP @-7 #6
DAT @-8 -6
MOV @0 #9
MOV #2 1
DAT @6882 #-10
JMP @3 4
CMP @8 2
ADD -7 @11
ADD @1 #-9
JMZ @-5 7
CMP 11 5526
MOV @8 6
SUB -6 @0
JMP 1 11
ADD @-3 #-8
JMZ @-14 @-5
ADD 0 @-8
SUB #3 @9
JMP #-1 5
JMP #9 @1
CMP -9 @0
SUB #4 #-2
JMP #-8 5
DAT -1 @-10
MOV 6 #2
CMP @-11 #-14
ADD @4 @-3
MOV @5 #-6
SUB -3 -2
DAT @-10 #-1
MOV #-13 #-6
MOV #1 5
ADD 5 #-5
MOV -8 @-1
DAT 0 10
DAT #5 #7
JMZ 6 -5
JMZ -12 -11
JMP 5 @-7
MOV #7 -3
SUB #-7 @-3
JMP -4 @-11
CMP @-5 #-2
JMZ @-1 #0
ADD #3 #2
MOV #5 @-6

1
তাহলে কোথায় পেলেন?
পাইরুলেজ

4
@ পাইরুলিজ এটি জেনেটিক অ্যালগরিদমের মাধ্যমে তৈরি কম্পিউটার।
TheNumberOne

1
দেখে মনে হচ্ছে ফাঁসির কাজটি আসলে # 6 লাইনের চেয়ে বেশি অগ্রসর হয় না, কারণ এটি প্রোগ্রামটিতে ফিরে আসে। আমি বিশ্বাস করি যে এটি সফল হওয়ার কারণ হ'ল এর প্রতিযোগীদের তুলনায় আরও চাল / লুপ রয়েছে।
PhiNotPi

6

প্রথম টাইমার

যদি এটি কাজ করে তবে এটির মূলটির শুরুতে অবস্থান নেওয়ার চেষ্টা করা উচিত এবং একটি ডিফেন্স তৈরি করা উচিত

main MOV 5 #0
     ADD #data #main
     CMP #main #max
     JMP #0 0
     JMP #main 0
     MOV #data #100
     ADD #data -1
     JMP -2 0
data DAT 1 1
max  DAT 8 3

এটি আপনি যেভাবে অনুমান করেছিলেন তা পুরোপুরি কার্যকর হয় না: এটি আপনার প্রোগ্রামের#0 সূচনা বোঝায় (অর্থাত্ সমান ), মূলটির সূচনা নয় (যা সত্যিই কোনও অর্থবহ ধারণা নয়) - মূলটি হ'ল বিজ্ঞপ্তি, আপনার কোডটি এটি শুরু হয় বা শেষ হয় তা বলতে পারে না)। যা ঘটে তা হ'ল আপনার প্রথম নির্দেশটি ( ) নিজেই এটিকে ওভাররাইট করে , এর পরে আপনার কোড কার্যকরভাবে 0.25c (চারটি চক্রের প্রতি এক নির্দেশ) ফরোয়ার্ড কোর পরিষ্কারে রূপান্তরিত করে। #mainmainMOV #data #100
ইলমারি করোনেন

@ ইলমারি কারোনেন ওহ, ব্যাখ্যাটির জন্য ধন্যবাদ। আমি #0কোরটি শুরু করার জন্য ভুল করেছি । 5 টি প্রথম নির্দেশাবলী সম্পূর্ণরূপে অকেজো।
থ্রাক্স

6

CopyPasta

কোনও কোর ওয়ারে অংশ নেননি, এই সাধারণ প্রোগ্রামটি কেবল নিজেকে অনুলিপি করার চেষ্টা করছে এবং তারপরে অনুলিপিটি কার্যকর করে। এটির সঠিক আচরণ নাও হতে পারে, দয়া করে বলুন যদি এটি হয় তবে।

এটি খুব প্রশান্তবাদী এবং বাস্তবে জিততে পারে না।

MOV 6 0
MOV @-1 @-1
CMP @-2 3
JMP 4242 0
SUB -3 -4
JMP -4 0
DAT 0 4244

এই বর্তমান সম্পাদনাটি সম্ভবত পরবর্তী লিডারবোর্ড আপডেটে হবে না (আমি এখনই টুর্নামেন্টটি চালাচ্ছি)। পুরানো সংস্করণ, তবে (ছোট কোর আকার) প্রাথমিক ফলাফল জিতেছে।
PhiNotPi

ঠিক আছে :) পুরানো সংস্করণটি লুপ 1 এর বাইরে চলে না, এটি সত্যই পছন্দসই আচরণ নয়, আমি এটি সংশোধন করার চেষ্টা করছি।
আঘাত করুন

বর্তমান সংস্করণটি ভাঙ্গা মনে হচ্ছে। আমি জানি না কেন, এখনও।
PhiNotPi

1
আমি ডিবাগিং সরঞ্জামগুলি নতুনভাবে তৈরি করেছি, তাই এখন আমি সমস্যাটি সনাক্ত করতে পারি। যা ঘটছে তা হ'ল প্রোগ্রামটি কেবল নিজের দ্বিতীয়ার্ধটি অনুলিপি করে (শুরু করে JMP loop 0)। তারপরে, যখন এটি অনুলিপিটি শুরু করে যেখানে অনুলিপিটি শুরু করা উচিত, এটি কেবল খালি জায়গা এবং এটি হেরে যায়।
PhiNotPi

2
আমার আগের (এখন মুছে ফেলা) মন্তব্য উপেক্ষা করুন; আমি আপনার কোডের একটি ভুল সংস্করণ পরীক্ষা করেছি (কৌতুকপূর্ণভাবে, একটি অনুলিপি হিসাবে, একটি অনুলিপি কারণ) এটি আমার জন্য এত খারাপ কাজ করে।
ইলমারি করোনেন

6

তত্ত্বাবধায়ক

নিম্নলিখিত ঠিকানাগুলি খালি কিনা এবং এটি তাদের পরিষ্কার করে না কিনা তা পরীক্ষা করা উচিত (সুতরাং, আশা করা যায়, প্রতিপক্ষের বট মুছে ফেলছেন)।

সম্পাদনা করুন: এই নতুন সংস্করণটি দ্রুত হওয়া উচিত (এখন আমি JMZআদেশটি এবং @রেফারেন্সটি সঠিকভাবে বুঝতে পেরেছি )।

JMZ 2 6
MOV 4 @-1
ADD 2 -2
JMP -3 0
DAT 0 1
DAT 0 0

জেটার কি প্রথম জেএমজেড দিয়ে আত্মহত্যা করছে না? এটি কমপক্ষে জেএমজেড 2 হওয়া উচিত 8 8. @ ব্যবহার করার মাধ্যমে আপনি দুটি মাত্র একটিতে যোগ করতে পারেন। এর মতো কিছু: "জেএমজেড 2 @ 5 এমওভি 5 @ 4 যোগ করুন 2 3 জেএমপি -3 0 ড্যাট 0 1 ড্যাট 0 2 ড্যাট 0 0" (অনির্ধারিত)
আঘাত করুন

@ হিট এটি লাফায় না, কারণ সেখান থেকে ঠিকানা 2 ADD 3 -2, তবে আপনি ঠিক বলেছেন যে তিনি এটি পরিবর্তন করবেন, আমার ধারণা।
mbomb007

হ্যাঁ আমি নির্দেশটি ভুলভাবে লিখেছি JMZএবং ভেবেছিলাম 0 টি JMZ A Bপরীক্ষা করে Aলাফ দিয়ে যাচ্ছিল Bযখন আপাতদৃষ্টিতে এটি বিপরীত। দেখার জন্য ধন্যবাদ কারণ আমি না :)
প্লেনাপাস

5

ScanBomber

সংকলনের আগে আমার মন্তব্যগুলি সরান। কিছুক্ষণের জন্য স্ক্যান করে, তারপরে কোনও প্রোগ্রাম খুঁজে পেলে বোমা ফাটিয়ে দেয়। যদিও এটি এখনও আমার বামনের কাছে হারাবে।

scan add #eight #range  ; scan
jmz #scan @range
sub #six #range
fire mov #zero @range   ; bombs away! (-6)
add #two #range
mov #zero @range
add #two #range
mov #zero @range
add #two #range
mov #zero @range        ; (+0)
add #two #range
mov #zero @range
add #two #range
mov #zero @range
add #two #range
mov #zero @range
add #two #range
mov #zero @range        ; (+8)
range jmp #scan 6
two dat 0 2
six dat 0 6
zero dat 0 0
eight dat 0 8

ওপিকে অনুমানের #তুলনায় সম্পূর্ণ আলাদাভাবে সংজ্ঞায়িত করা হয়েছে (তিনি যে লিঙ্কটি করেছেন তার সাথে লিঙ্কটি পড়ুন), আমি এখনও এইটির জন্য এই প্রোগ্রামটি ঠিক করতে পারিনি।
mbomb007

@ বেস্টওন আমার মনে হয় আমি এটি ঠিক করেছি। এটি কি এখন বোঝার মতো মনে হচ্ছে? বা আমি #প্রতিটি রেফারেন্স আগে রাখা প্রয়োজন zero? হ্যাঁ, আমার মনে হয় আমার দরকার ...
mbomb007

এটি এখন ভাল কাজ করে। এটি বামন এবং ইম্প বাদে প্রতিটি বটকে পরাজিত করে।
TheNumberOne

@ দ্য বেস্টন বামনটি খুব ছোট এবং সম্ভাব্য প্রোগ্রাম প্লেসমেন্টের 50% মধ্যেই এটি সনাক্ত করা সম্ভব। এটি সম্ভবত ইম্পের কাছে হেরে যায় কারণ এটি মেমরির পুরোপুরি ঘুরে দেখার পরে নিজেকে বোমা দেয়।
mbomb007

5

হান শট প্রথম (v2)

আমি প্রতিযোগিতাটি আরও কিছু বৈচিত্র্য ব্যবহার করতে পারে বুঝতে পেরেছিলাম, সুতরাং এখানে আমার দ্বিতীয় প্রবেশ: একটি শট CMPস্ক্যানার।

এটি সংস্করণ 2 , উন্নত অ্যান্টি-ইম্প প্রতিরক্ষা সহ - এটি এখন ইমপকে পরাস্ত করতে পারে, কেবলমাত্র এক পয়েন্ট দ্বারা। এটি এখনও দ্বারভেন ইঞ্জিনিয়ারের কাছে হেরে গেছে, তবে এটিকে এখনও প্রথম স্থানে রেখে, এ পর্যন্ত সমস্ত কিছুকে পরাজিত করে।

scan    ADD bomb    aim
aim     CMP 17      12
        JMZ scan    #-3
loop    MOV bomb    @aim
        ADD step    aim
step    JMP loop    #2
bomb    DAT 10      10

এটি পার্শ্ববর্তী মূল অবস্থানগুলির সাথে 10-পদক্ষেপের বিরতিতে 5 টি ধাপের ব্যবধানে তুলনা করে কাজ করে, যতক্ষণ না এটি কোনও পার্থক্য খুঁজে পায়। এটি যখন ঘটে তখন এটি 2-পদক্ষেপের বিরতিতে বোমা নিক্ষেপ করা শুরু করে যতক্ষণ না এটি তার প্রতিপক্ষকে হত্যা করে বা নিজের কাছে পৌঁছানোর জন্য কোরটির চারপাশে সমস্ত লুপ করে।

যদি স্ক্যানটি অন্য কোনও কিছু না খুঁজে পায়, তবে শেষ পর্যন্ত এটি লুপ হয়ে যায় এবং তার নিজস্ব কোডটি খুঁজে এটি আক্রমণ করে। এটি আত্মঘাতী হবে, তবে ভাগ্যবান কাকতালীয় কারণে যে প্রথম বোমাটি aimলাইনটির উপর বর্গাকারে অবতরণ করে, পরবর্তী বোমাটি মূল অবস্থানের নীচে 12 টি অবস্থান (স্বাভাবিক 2 এর চেয়ে বেশি) ছুঁড়ে ফেলা হয়, সুবিধামত কোডটি এড়িয়ে যায়। (স্ক্যানটি যদি কিছু খুঁজে পায় তবে এটি 50% সম্ভাব্যতার সাথেও ঘটে, তবে প্রতিপক্ষকে হত্যা করতে ব্যর্থ হয় Since) যেহেতু মূল আকারটি দুটির একাধিক, বোমা ফাটা চালানো যদি চারপাশে লুপ হয় তবে এটির প্রয়োজনীয়তা দূর করে আরও ব্যাকআপ কৌশল।

(এই আত্ম-বোমা চালানোর কৌশলটি মূলত একটি খাঁটি কাকতালীয় বিষয় ছিল - আমি স্ক্যানিং থেকে বোমা ফাটার দিকে সন্ধানের জন্য সম্পূর্ণরূপে ভিন্ন উপায়ের পরিকল্পনা করেছিলাম যদি কিছু না পাওয়া যায় তবে আমি যখন কোডটি প্রথম পরীক্ষা করেছিলাম তখন কনস্ট্যান্টগুলি ঠিক এটি সঠিকভাবে তৈরি হয়েছিল) এইভাবে কাজ করুন, এবং আমি এটি বদ্ধ করার সিদ্ধান্ত নিয়েছি))



4

স্লাগ্

     mov    ones    @-1024
     mov    from    -3
     mov    here    -3
loop mov    @-5 @-4
     add    ones  -5
     jmz    -17 -6
     add    ones  -8    
     jmp    loop    42
ones dat    1   1
from dat    2   2
here dat    -11 -11

স্মৃতি স্থান পিছনে পিছনে ক্রল। মাঝেমধ্যে অনেক দূরে একটি বোমা ছুড়ে দেয়।


3

ইস্টার বানি

তিনি পিছনে হ্যাপিং উপভোগ করেন :)

loop mov 0 -10
     add data loop
     cmp -7 data
     jmp -13 0
     jmp loop 0
data dat 1 1

3

ভীতু

কোনও অনুলিপি-পাস্তার মতো তবে এটি বোমা ফাটিয়ে কোডটি সংশোধিত করা হয়েছে কিনা তা যাচাই করবে। যদি তা হয় তবে এটি কোনও বামনকে কপি করে তা কার্যকর করে। আমি যদি আবার গেমভিউ তৈরি করতে পরিচালনা করি তবে আমি কয়েকটি ধ্রুবক পরিবর্তন করার চেষ্টা করব।

copy    MOV data copy
loop    MOV @-1 @-1
    CMP @copy end
out JMP check 0
    SUB loop copy
    JMP loop 0
data    DAT 0 4109
check   MOV data copy
loop2   CMP @copy @copy
    JMP ok 0
    MOV aah 2
ok  CMP @copy end
    JMP 4098 0
    SUB loop copy
    JMP loop2 0
panic   MOV end copy
    MOV jump out
    JMP loop 0
jump    JMP 4124 0
dwarf   ADD 2 bomb
    MOV bomb @bomb
    JMP dwarf 4
bomb    DAT 0 4
aah JMP 3 0
end DAT 19 4127

ঠিক আছে, বাস্তবে এটি কাজ করছে এবং আমি কেবল চারপাশে মেসেজ করেছিলাম, নতুন রানের জন্য ধন্যবাদ;)
আঘাত করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.