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.
sumber
Jawaban:
Insinyur Kerdil
Kurcaci baru dan lebih baik. Menang melawan semua yang disampaikan sejauh ini. Ukuran langkah mewah yang dioptimalkan untuk corestep mungkin berlebihan di sini.
Fitur-fitur penting termasuk loop pemboman cepat yang melemparkan dua bom dalam empat siklus, untuk kecepatan pemboman rata-rata 0,5c dalam jargon Perang Inti yang lama, dan penggunaan
JMZ
untuk mendeteksi kapan proses pemboman selesai dan saatnya untuk beralih ke rencana B ( di sini, seorang Imp).Saya dulu bermain Core War di tahun 90-an (beberapa dari Anda mungkin telah melihat buku panduan dasar yang saya tulis di tahun '97), jadi saya pikir akan menarik untuk melihat strategi lama dari dunia RedCode '88 / '94 yang mungkin berguna dalam varian ini.
Pikiran pertama saya adalah:
Tidak ada
SPL
, jadi tidak ada replikator (dan tidak ada cincin / spiral). Ini harus membuat pembom kuat. (Juga, semua strategi pengeboman mewah yang dirancang untuk menangani replikator dan spiral? Benar-benar tidak berguna dan tidak berguna di sini. Hanya bom denganDAT
s.)Kemudian lagi,
CMP
pemindaian masih berpotensi lebih cepat daripada pengeboman, sehingga pemindai cepat dapat memiliki kesempatan.Tidak adanya in / decrements membuat core membersihkan sangat lambat. Bahkan, inti yang jelas dalam varian ini cukup banyak hanya pembom dengan ukuran langkah (suboptimal) ± 1. Sekali lagi, ini juga menyakitkan pemindai; pemindai sekali pakai → strategi bomber mungkin berhasil.
Quickscanners / quickbombers (strategi gim awal menggunakan loop pemindaian / pemboman yang tidak dikontrol, bagi mereka yang tidak begitu terbiasa dengan jargon Perang Inti) masih berpotensi berguna, tetapi hanya terhadap program-program panjang (seperti itu sendiri, sehingga ada semacam umpan balik efek di sini). Sulit dikatakan apakah itu benar-benar sepadan dengan masalahnya.
Sistem penilaiannya menarik. Ikatan mencetak setengah poin sebanyak kemenangan (daripada 1/3, seperti dalam Perang Inti tradisional), membuat mereka lebih menarik. Kemudian lagi, tentang satu-satunya program yang cenderung mencetak banyak ikatan di bawah aturan ini adalah imp. (Juga, tidak adanya penambahan / peningkatan membuat gerbang imp sulit, bahkan imp sederhana pun benar - benar memiliki kesempatan untuk mencetak dasi jika mereka mencapai lawan mereka hidup-hidup.)
Juga, karena peringkat akhir hanya bergantung pada program mana yang Anda kalahkan, dan bukan seberapa banyak Anda mengalahkannya, ia cenderung lebih menyukai entri umum. Lebih baik untuk hanya mengalahkan semua lawan Anda, daripada benar-benar menghancurkan setengah dari mereka dan hanya kalah dari sisanya.
Karena kodenya bersifat publik, selalu memungkinkan untuk menemukan program yang dapat mengalahkan setiap pengajuan yang diberikan sebelumnya - bahkan mungkin beberapa di antaranya - tidak peduli seberapa bagusnya mereka secara umum. Trik seperti itu (seperti menyetel ukuran langkah Anda untuk mengenai lawan tepat sebelum mereka mengenai Anda) dapat dengan mudah tampak murah. Dan, tentu saja, pemain target selalu bisa hanya mengirimkan versi baru dengan konstanta yang berbeda.
Bagaimanapun, hasil dari semua ini adalah bahwa saya memutuskan bahwa saya harus mencoba untuk menulis pembom cepat atau pemindai yang sangat cepat, dan mungkin memasang quickscanner / bomber ke dalamnya. Dari opsi-opsi itu, seorang pembom cepat sepertinya yang paling sederhana dan paling mungkin bekerja.
Pada saat itu, saya menghabiskan terlalu banyak waktu mengutak-atik dan mengoptimalkan kode juru bahasa PhiNotPi, karena saya pikir saya mungkin akan menjalankan banyak uji coba brute force untuk mengoptimalkan konstanta. Seperti yang terjadi, saya tidak pernah melakukan itu - kode di atas adalah versi pertama yang benar-benar berfungsi (setelah beberapa upaya gagal yang baru saja melakukan bunuh diri karena bug konyol).
Trik yang membuat pembom saya cepat adalah menggunakan pengalamatan tidak langsung untuk melemparkan dua bom untuk masing-masing
ADD
. Begini cara kerjanya:Pada siklus pertama, kami mengeksekusi
MOV bomb @aim
. Ini menyalinbomb
instruksi ke mana saja di inti B-bidangaim
poin ke (awalnya, tepatnya 6326 instruksi sebelumnyaaim
, atau 6328 instruksi sebelumnyastep
; Anda akan melihat mengapa angka-angka itu penting nanti).Pada langkah selanjutnya, kami menjalankan
aim
instruksi itu sendiri! Pada lulus pertama, terlihat seperti ini:MOV bomb @-6326
. Dengan demikian, itu menyalinbomb
ke lokasi yang B-bidang instruksi di 6326 baris sebelum itu sendiri menunjuk ke.Jadi, apa yang ada di 6326 baris sebelumnya
aim
? Mengapa, itu salinanbomb
kami baru saja menempatkan di sana satu siklus sebelumnya! Dan kita kebetulan mengatur hal-hal sehingga B-fieldbomb
memiliki nilai bukan nol, sehingga bom baru tidak akan disalin di atas yang lama, tapi agak jauh (sebenarnya, di sini jaraknya 3164, yang merupakan setengah dari ukuran langkah nominal kami 6328; tetapi offset lainnya dapat bekerja, mungkin lebih baik).Pada siklus berikutnya, kita menyesuaikan tujuan kita
SUB step aim
, yang mengurangi nilai-nilaistep
instruksi (yang juga merupakan lompatan yang akan kita laksanakan selanjutnya, walaupun itu bisa saja hanya suatuDAT
tempat sederhana ) dariaim
.(Satu detail untuk catatan di sini adalah bahwa kita semacam ingin A-nilai
step
menjadi nol, sehingga kita masih akan melemparkan bom yang sama pada iterasi berikutnya Bahkan yang tidak benar-benar diperlukan, meskipun;. Hanya bom dilemparkan dengan instruksi pertama harus memiliki B-field mereka sama dengan 3164, sisanya bisa apa saja.)Selanjutnya,
JMZ
periksa apakah instruksi 6328 menjauh darinya masih nol, dan jika demikian, lompat kembali ke atas kode. Sekarang, 6328 adalah ukuran langkah pembom kita, dan dapat dibagi dengan 8 (tetapi bukan 16); jadi, jika kita terus melempar bom setiap 6328 langkah, kita akhirnya akan kembali ke tempat kita mulai, setelah membom setiap instruksi kedelapan di inti (dan dengan bom tambahan diimbangi oleh 3163 = 6328/2 ≡ 4 (mod 8) , kami akan menekan setiap instruksi keempat ).Tapi kami mulai pengeboman kami dijalankan pada 6328 petunjuk sebelum itu
JMZ
, dan melangkah mundur oleh -6328 di setiap iterasi, jadi kita akan mengebom lokasi 6328 langkah setelah ituJMZ
hanya satu iterasi sebelum kita akan memukulJMZ
itu sendiri. Jadi ketikaJMZ
mendeteksi bom di 6328 instruksi setelahnya, itu pertanda bahwa kita telah membahas inti sebanyak yang kita bisa tanpa mengenai diri kita sendiri, dan harus beralih ke strategi cadangan sebelum kita bunuh diri.Adapun strategi cadangan, itu hanya
MOV 0 1
imp tua , karena saya tidak bisa memikirkan yang lebih baik untuk saat ini. Cara saya melihatnya, jika kita telah mengebom setiap lokasi inti keempat dan masih belum menang, kita mungkin bertarung dengan sesuatu yang sangat kecil atau sangat defensif, dan mungkin juga mencoba bertahan dan puas dengan dasi. Tidak apa-apa, karena program kecil atau defensif seperti itu pada umumnya tidak pandai membunuh hal lain, dan bahkan jika kita hanya memenangkan beberapa perkelahian secara kebetulan, kita mungkin masih akan unggul.Ps.
Jika ada orang lain yang menginginkannya, inilah garpu saya yang lebih baik dari kode turnamen PhiNotPi . Ini sekitar dua kali lebih cepat, menyimpan hasil pertempuran lama sehingga Anda tidak perlu menjalankannya kembali, dan memperbaiki apa yang saya yakini sebagai bug minor dalam perhitungan hasil pertempuran.Perubahan telah digabungkan ke dalam versi arus utama oleh PhiNotPi. Terima kasih!sumber
Tampilan Grafik
Ini dapat digunakan sebagai alat debugging. Ini menampilkan inti dan menunjukkan lokasi pemain. Untuk menggunakannya, Anda harus memanggilnya dari kode. Saya juga menyediakan modifed
Game.java
yang secara otomatis menampilkan GraphView.PhiNotPi dan Ilmari Karonen baru-baru ini mengganti Controller. Ilmari Karonen telah berbaik hati untuk menyediakan GameView yang diperbarui di lokasi ini .
Game.java yang Dimodifikasi:
sumber
./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()
metode ini.Turbo
Upaya CoreWar ke-2 saya. Dirancang untuk mengalahkan Dwarf. Memindai dengan 3 untuk data, lalu menempatkan bom setiap 2. Setiap tahap berjalan hanya dalam 3 instruksi, dengan harapan bahwa bom Dwarf melewatkannya.
Turbo BARU ++ : Sekarang ditingkatkan. Memindai mundur hingga menemukan data, lalu bergerak sendiri ke sana, lalu mengebom ke belakang. Harapannya adalah bahwa gerakan itu akan mengacaukan lawan, atau ke suatu tempat yang sudah dibom dan karenanya aman (ish).
... Dan hasil edit untuk membuatnya memindai lebih jarang membuatnya mengalahkan semua orang!
sumber
Kerdil
Program umum dan sederhana yang mewakili pelemparan batu kerdil. Itu menempatkan
DAT
instruksi setiap empat alamat.EDIT: Memperbaiki pengalamatan. Rupanya mode pengalamatan berbeda dari spesifikasi OP yang ditautkan.
sumber
add 3 3
, tetapi kemudian akan menggandakan setiap loop alih-alih menambahkan, dan itu tidak akan berguna.#4
langsung, jadi itu menambah angka4
ke nilai 2 di alamat yang3
setelah alamat saat ini.#
mode pengalamatan dalam tantangan. Seperti yang dinyatakan dalam spesifikasi, saya membuat perubahan ke#
mode pengalamatan.Berkembang
Sejujurnya saya tidak mengerti cara kerjanya. Tampaknya untuk membangun kode sumbernya sebelum melakukan apa pun. Saya akan senang jika seseorang memberi saya penjelasan tentang cara kerjanya.Setelah mempelajarinya, saya menemukan bahwa itu hanyalah katai dimodifikasi dengan penjaga imp. Alih-alih membom musuh dengan
DAT
instruksi, itu mengocok kode musuh. Itu juga mengebom setiap dua register, bukan setiap empat register. Diberi cukup waktu, itu pasti akan menghancurkan dirinya sendiri.sumber
FirstTimer
Jika berhasil, ia harus mencoba untuk mengambil posisi di awal inti dan membuat pertahanan
sumber
#0
mengacu pada awal program Anda (yaitu sama dengan#main
), bukan ke awal inti (yang sebenarnya bukan konsep yang bermakna - intinya adalah melingkar, kode Anda tidak dapat mengetahui di mana ia mulai atau berakhir). Apa yang terjadi adalah bahwa instruksi pertama Anda (main
) menimpa dirinya sendiri denganMOV #data #100
, setelah itu kode Anda secara efektif berubah menjadi 0,25c (= satu instruksi per empat siklus) forward core clear.#0
untuk memulai inti. 5 instruksi pertama sama sekali tidak berguna.CopyPasta
Tidak pernah berpartisipasi dalam CoreWar, program sederhana ini hanya mencoba menyalin-menempel dirinya sendiri dan kemudian menjalankan salinannya. Mungkin tidak memiliki perilaku yang benar, tolong beri tahu saya jika itu masalahnya.
Itu terlalu pasifis dan tidak bisa menang sebenarnya.
sumber
JMP loop 0
). Kemudian, ketika melompat ke tempat awal salinan seharusnya, itu hanya ruang kosong dan hilang.Pesuruh
Ini harus memeriksa apakah alamat berikut kosong dan jika tidak membersihkannya (dengan demikian, semoga, menghapus bot lawan).
Sunting: Versi baru ini harus lebih cepat (sekarang saya mengerti
JMZ
perintah dan@
referensi dengan benar).sumber
ADD 3 -2
, tetapi Anda benar bahwa dia harus mengubahnya, saya pikir.JMZ
dan berpikirJMZ A B
sedang memeriksaA
dan melompat keB
0 jika ternyata sebaliknya. Terima kasih telah memperhatikan karena saya tidak :)ScanBomber
Hapus komentar saya sebelum kompilasi. Memindai sebentar, lalu mengebom ketika menemukan program. Mungkin masih akan kalah oleh Kurcaci saya.
sumber
#
sepenuhnya berbeda dari spec (baca tautan yang dia tautkan), saya belum memperbaiki program ini untuk itu.#
sebelum setiap referensizero
? Ya, saya pikir saya perlu ...Han Shot First (v2)
Saya pikir kompetisi dapat menggunakan lebih banyak keanekaragaman, jadi inilah entri kedua saya:
CMP
pemindai satu-shot .Ini adalah versi 2 , dengan peningkatan pertahanan anti-Imp - sekarang dapat mengalahkan Imp, jika hanya dengan satu poin. Itu masih kalah dari Dwarven Engineer, tetapi mengalahkan segalanya sejauh ini, menempatkannya saat ini di urutan pertama.
Ia bekerja dengan membandingkan lokasi inti yang berdekatan, terpisah 5 langkah, pada interval 10 langkah, hingga ia menemukan perbedaan. Ketika itu terjadi, ia mulai melempar bom pada interval 2 langkah sampai membunuh lawannya atau loop sepanjang jalan di sekitar inti untuk mencapai dirinya sendiri.
Jika pemindaian dilakukan tidak menemukan hal lain, pada akhirnya akan berputar dan menemukan kode sendiri dan menyerang Ini akan menjadi bunuh diri, tetapi untuk kebetulan yang beruntung bahwa bom pertama mendarat tepat di
aim
garis, menyebabkan bom berikutnya dilemparkan 12 posisi (daripada 2 yang biasa) ke bawah, dengan mudah melewatkan kode. (Ini juga terjadi dengan kemungkinan 50% jika pemindaian menemukan sesuatu, tetapi gagal membunuh lawan.) Karena ukuran inti adalah kelipatan dari dua, ini juga akan terus terjadi jika pengeboman berjalan berputar-putar, menghilangkan kebutuhan untuk strategi cadangan lebih lanjut.(Trik pemboman diri ini pada awalnya adalah kebetulan murni - saya telah merencanakan cara yang sama sekali berbeda untuk beralih dari pemindaian ke mode pemboman jika tidak ada yang ditemukan, tetapi ketika saya pertama kali menguji kode, konstanta kebetulan benar untuk membuatnya bekerja dengan cara ini, dan saya memutuskan untuk tetap menggunakannya.)
sumber
Imp
Cukup beberapa inci melalui program.
sumber
Siput
Merayap melalui ruang memori mundur. Sesekali melempar bom jauh-jauh.
sumber
kelinci Paskah
Dia menikmati melompat mundur :)
sumber
Paranoid
Jenis salin-pasta tetapi akan memeriksa apakah kode telah dimodifikasi oleh pemboman. Jika demikian, salin melewati kurcaci dan jalankan. Jika saya berhasil membuat GameView lagi saya akan mencoba mengubah beberapa konstanta.
sumber