Ini adalah adaptasi dari Perang Inti , sebuah pemrograman KOTH yang berasal dari abad ke-20. Untuk lebih spesifik, itu menggunakan set instruksi yang sangat disederhanakan terutama didasarkan pada proposal asli .
Latar Belakang
Dalam Core War, ada dua program yang berjuang untuk mengendalikan komputer. Tujuan dari setiap program adalah untuk menang dengan mencari dan mengakhiri program yang berlawanan.
Pertempuran terjadi di dalam memori utama komputer. Memori ini disebut Core, dan berisi 8192 alamat. Ketika pertempuran dimulai, kode untuk setiap pesaing (disebut prajurit) ditempatkan dalam memori acak. Eksekusi program bergantian antara prajurit, melakukan satu instruksi masing-masing. Setiap instruksi mampu memodifikasi bagian dari Core, yang mengarah ke kemungkinan program modifikasi diri.
Tujuannya adalah untuk menghentikan program lawan. Suatu program berakhir ketika mencoba untuk menjalankan instruksi yang tidak valid, yang merupakan DATinstruksi apa pun .
Set Instruksi
Setiap program terdiri dari serangkaian instruksi tingkat rendah, yang masing-masingnya mengambil dua bidang, yang disebut bidang A dan B.
Set instruksi ini sangat menarik dari spesifikasi asli. Perubahan utama adalah 1) klarifikasi tentang penambahan / pengurangan perintah, dan 2) perubahan #mode pengalamatan untuk memungkinkannya digunakan di mana saja. Kebanyakan versi lengkap dari Core Wars memiliki lebih dari 20 opcode, 8 mode pengalamatan, dan satu set "pengubah instruksi."
Opcode
Setiap instruksi harus memiliki satu dari tujuh opcode yang berbeda.
DAT A B- (data) - Ini hanya menampung angkaAdanB. Yang penting, suatu proses mati ketika mencoba untuk menjalankan instruksi DAT.MOV A B- (pindah) - Ini memindahkan isi lokasiAmemori ke lokasi memoriB. Berikut ini adalah demonstrasi sebelum dan sesudah:MOV 2 1 ADD @4 #5 JMP #1 -1MOV 2 1 JMP #1 -1 JMP #1 -1ADD A B- (tambah) - Ini menambahkan isi lokasiAmemori ke lokasi memoriB. Dua bidang pertama keduanya ditambahkan, dan bidang kedua ditambahkan.ADD 2 1 MOV @4 #5 JMP #1 -1ADD 2 1 MOV @5 #4 JMP #1 -1SUB A B- (kurangi) - Ini mengurangi isi lokasi memoriAdari (dan menyimpan hasilnya ke) lokasi memoriB.SUB 2 1 MOV @4 #5 JMP #1 -1SUB 2 1 MOV @3 #6 JMP #1 -1JMP A B- (lompat) - Lompat ke lokasiA, yang akan dieksekusi siklus berikutnya.Bharus berupa angka tetapi tidak melakukan apa-apa (Anda dapat menggunakannya untuk menyimpan informasi).JMP 2 1337 ADD 1 2 ADD 2 3Lompatan berarti bahwa
ADD 2 3akan dieksekusi siklus berikutnya.JMZ A B- (lompat jika nol) - Jika kedua bidang barisBadalah 0, maka program melompat ke lokasiA.JMZ 2 1 SUB 0 @0 DAT 23 45Karena dua bidang instruksi 1 adalah 0, perintah DAT akan dieksekusi giliran berikutnya, yang mengarah ke kematian segera.
CMP A B- (bandingkan dan lompati jika tidak sama) - Jika bidang dalam instruksiAdanBtidak sama, lewati instruksi berikutnya.CMP #1 2 ADD 2 #3 SUB @2 3Karena kedua bidang instruksi 1 dan 2 nilainya sama, perintah ADD tidak dilewati dan dieksekusi giliran berikutnya.
Ketika dua instruksi ditambahkan / dikurangi, dua bidang (A dan B) ditambahkan / dikurangi pasangan-bijaksana. Mode pengalamatan dan opcode tidak diubah.
Mengatasi Mode
Ada tiga jenis mode pengalamatan. Masing-masing dari dua bidang instruksi memiliki salah satu dari tiga mode pengalamatan ini.
Immediate
#X-Xadalah garis yang akan digunakan secara langsung dalam perhitungan. Misalnya,#0adalah baris pertama dari program. Garis negatif merujuk pada garis dalam inti sebelum dimulainya program.... //just a space-filler ... ADD #3 #4 DAT 0 1 DAT 2 4Ini akan menambahkan yang pertama dari dua garis DAT ke yang kedua, karena mereka berada di baris 3 dan 4, masing-masing. Anda tidak ingin menggunakan kode ini, karena DAT akan membunuh bot Anda pada siklus berikutnya.
Relatif
X- Angka tersebutXmenunjukkan lokasi alamat memori target, relatif terhadap alamat saat ini. Nomor di lokasi ini digunakan dalam perhitungan. Jika baris#35dieksekusi dan berisi-5, maka baris#30digunakan.... //just a space-filler ... ADD 2 1 DAT 0 1 DAT 2 4Ini akan menambahkan baris DAT kedua ke yang pertama.
Tidak Langsung
@X- Nomor tersebutXmewakili alamat relatif. Konten di lokasi itu sementara ditambahkan ke nomor X untuk membentuk alamat relatif baru, dari mana nomor tersebut diambil. Jika baris#35dieksekusi, dan bidang kedua adalah@4, dan bidang baris kedua#39berisi nomor-7, maka baris#32digunakan.... //just a space-filler ... ADD @1 @1 DAT 0 1 DAT 2 4Ini akan menambahkan DAT pertama ke yang kedua, tetapi dengan cara yang lebih berbelit-belit. Bidang pertama adalah @ 1, yang mendapatkan data dari alamat relatif itu, yang merupakan bidang pertama dari DAT pertama, angka 0. Ini ditafsirkan sebagai alamat relatif kedua dari lokasi itu, sehingga 1 + 0 = 1 memberikan total diimbangi dari instruksi asli. Untuk bidang kedua, @ 1 mendapatkan nilai dari alamat relatif itu (1 di bidang kedua DAT pertama) dan menambahkannya ke dirinya sendiri dengan cara yang sama. Total offset adalah 1 + 1 = 2. Jadi, instruksi ini dijalankan mirip dengan
ADD 1 2.
Setiap program dapat berisi hingga 64 instruksi.
Ketika putaran dimulai, kedua program ditempatkan secara acak di bank memori dengan 8192 lokasi. Pointer instruksi untuk setiap program dimulai pada awal program dan bertambah setelah setiap siklus eksekusi. Program mati setelah penunjuk instruksinya mencoba mengeksekusi DATinstruksi.
Parameter Inti
Ukuran inti adalah 8192, dengan batas waktu 8192 * 8 = 65536 kutu. Inti adalah siklik, jadi penulisan ke alamat 8195 sama dengan penulisan ke alamat 3. Semua alamat yang tidak digunakan diinisialisasi ke DAT #0 #0.
Setiap pesaing tidak boleh lebih dari 64 baris. Integer akan disimpan sebagai integer bertanda 32-bit.
Parsing
Untuk membuat pemrograman lebih mudah bagi pesaing, saya akan menambahkan fitur label-baris ke parser. Kata-kata apa pun yang muncul pada baris sebelum opcode akan ditafsirkan sebagai label baris. Misalnya, tree mov 4 6memiliki label garis tree. Jika, di mana pun dalam program ini, ada bidang yang berisi tree #treeatau @tree, nomor akan diganti. Selain itu, kapitalisasi diabaikan.
Berikut adalah contoh bagaimana label garis diganti:
labelA add labelB @labelC
labelB add #labelC labelC
labelC sub labelA @labelB
Di sini, label A, B, dan C ada di baris 0, 1, dan 2. Contoh #labelakan diganti dengan nomor baris label. Contoh labelatau @labeldiganti dengan lokasi relatif label. Mode pengalamatan dipertahankan.
ADD 1 @2
ADD #2 1
SUB -2 @-1
Mencetak gol
Untuk setiap pasangan kontestan, setiap pertempuran yang mungkin dilakukan. Karena hasil pertempuran tergantung pada offset relatif dari kedua program, setiap kemungkinan offset (sekitar 8000 dari mereka) dicoba. Selanjutnya, setiap program memiliki kesempatan untuk bergerak terlebih dahulu di setiap offset. Program yang memenangkan sebagian besar penyeimbangan ini adalah pemenang pasangan.
Untuk setiap pasangan yang dimenangkan seorang pejuang, diberikan 2 poin. Untuk setiap seri, seorang prajurit diberikan 1 poin.
Anda diizinkan mengirimkan lebih dari satu prajurit. Aturan umum untuk banyak pengiriman berlaku, seperti tidak ada tag-teaming, tidak ada kerjasama, tidak ada raja, dll. Sebenarnya tidak ada ruang untuk ini dalam Perang Inti, jadi itu seharusnya tidak menjadi masalah besar.
Pengendali
Kode untuk pengontrol, bersama dengan dua bot contoh mudah, terletak di sini . Karena kompetisi ini (saat dijalankan menggunakan pengaturan resmi) sepenuhnya deterministik, leaderboard yang Anda buat akan sama persis dengan leaderboard resmi.
Bot Contoh
Berikut adalah contoh bot yang menunjukkan beberapa fitur bahasa.
main mov bomb #-1
add @main main
jmp #main 0
bomb dat 0 -1
Bot ini beroperasi dengan perlahan menghapus semua memori lain di inti dengan menggantinya dengan "bom." Karena bom adalah DATinstruksi, program apa pun yang mencapai bom akan dihancurkan.
Ada dua label garis, "utama" dan "bom" yang berfungsi untuk menggantikan angka. Setelah preprocessing, programnya terlihat seperti ini:
MOV 3 #-1
ADD @-1 -1
JMP #0 0
DAT 0 -1
Baris pertama menyalin bom ke garis tepat di atas program. Baris berikutnya menambahkan nilai bomb ( 0 -1) ke perintah move, dan itu juga menunjukkan penggunaan @mode pengalamatan. Tambahan ini menyebabkan perintah pindah ke target baru. Perintah selanjutnya tanpa syarat melompat kembali ke awal program.
Papan Peringkat Saat Ini
24 - Turbo
22 - DwarvenEngineer
20 - HanShotFirst
18 - Dwarf
14 - ScanBomber
10 - Paranoid
10 - FirstTimer
10 - Janitor
10 - Evolved
6 - EasterBunny
6 - CopyPasta
4 - Imp
2 - Slug
Hasil Berpasangan:
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
Pembaruan terbaru (versi baru Turbo dan Paranoid) membutuhkan waktu sekitar 5 menit untuk berjalan di laptop lama. Saya ingin mengucapkan terima kasih kepada Ilmari Karonen untuk perbaikannya pada controller . Jika Anda memiliki salinan controller lokal, Anda harus memperbarui file Anda.