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 DAT
instruksi 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 angkaA
danB
. Yang penting, suatu proses mati ketika mencoba untuk menjalankan instruksi DAT.MOV A B
- (pindah) - Ini memindahkan isi lokasiA
memori ke lokasi memoriB
. Berikut ini adalah demonstrasi sebelum dan sesudah:MOV 2 1 ADD @4 #5 JMP #1 -1
MOV 2 1 JMP #1 -1 JMP #1 -1
ADD A B
- (tambah) - Ini menambahkan isi lokasiA
memori ke lokasi memoriB
. Dua bidang pertama keduanya ditambahkan, dan bidang kedua ditambahkan.ADD 2 1 MOV @4 #5 JMP #1 -1
ADD 2 1 MOV @5 #4 JMP #1 -1
SUB A B
- (kurangi) - Ini mengurangi isi lokasi memoriA
dari (dan menyimpan hasilnya ke) lokasi memoriB
.SUB 2 1 MOV @4 #5 JMP #1 -1
SUB 2 1 MOV @3 #6 JMP #1 -1
JMP A B
- (lompat) - Lompat ke lokasiA
, yang akan dieksekusi siklus berikutnya.B
harus berupa angka tetapi tidak melakukan apa-apa (Anda dapat menggunakannya untuk menyimpan informasi).JMP 2 1337 ADD 1 2 ADD 2 3
Lompatan berarti bahwa
ADD 2 3
akan dieksekusi siklus berikutnya.JMZ A B
- (lompat jika nol) - Jika kedua bidang barisB
adalah 0, maka program melompat ke lokasiA
.JMZ 2 1 SUB 0 @0 DAT 23 45
Karena 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 instruksiA
danB
tidak sama, lewati instruksi berikutnya.CMP #1 2 ADD 2 #3 SUB @2 3
Karena 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
-X
adalah garis yang akan digunakan secara langsung dalam perhitungan. Misalnya,#0
adalah 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 4
Ini 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 tersebutX
menunjukkan lokasi alamat memori target, relatif terhadap alamat saat ini. Nomor di lokasi ini digunakan dalam perhitungan. Jika baris#35
dieksekusi dan berisi-5
, maka baris#30
digunakan.... //just a space-filler ... ADD 2 1 DAT 0 1 DAT 2 4
Ini akan menambahkan baris DAT kedua ke yang pertama.
Tidak Langsung
@X
- Nomor tersebutX
mewakili alamat relatif. Konten di lokasi itu sementara ditambahkan ke nomor X untuk membentuk alamat relatif baru, dari mana nomor tersebut diambil. Jika baris#35
dieksekusi, dan bidang kedua adalah@4
, dan bidang baris kedua#39
berisi nomor-7
, maka baris#32
digunakan.... //just a space-filler ... ADD @1 @1 DAT 0 1 DAT 2 4
Ini 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 DAT
instruksi.
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 6
memiliki label garis tree
. Jika, di mana pun dalam program ini, ada bidang yang berisi tree
#tree
atau @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 #label
akan diganti dengan nomor baris label. Contoh label
atau @label
diganti 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 DAT
instruksi, 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.