Sections
Home
Hills
Infinite Hills
Tournaments
Software
Evolving
Optimizer
Community
Newsletter
Discussion
History
Sections
 
For Beginners
First Steps
FAQ
Guides
Lexicon
Benchmarks
For Beginners
> Home > The Corewar Newsletters > Core Warrior > Issue #1

Issue 92                                                           16 May, 2007
_______________________________________________________________________________
Core Warrior is a newsletter promoting the game of Corewar, a game of skill
played between two or more computer programs on behalf of the players who
create them.

Emphasis is placed on the most active hills - currently the '94 no-pspace,
'94 draft and the beginner hill.  Coverage will follow wherever the action is.
If you haven't a clue what I'm talking about then check out the following
websites for more information:

FAQs are available from:
  http://www.koth.org/corewar-faq.html
  http://bio.freelogy.org/wiki/REC.GAMES.COREWAR.FAQ

Web pages are at:
  http://www.koth.org/                            - KOTH
  http://sal.math.ualberta.ca/                    - SAL Hills
  http://www.corewar.co.uk/                       - J.Metcalf
  http://www.corewar.info/                        - Fizmo
  http://www.ociw.edu/~birk/COREWAR/corewar.html  - C.Birk
  http://para.inria.fr/~doligez/corewar           - Planar

Newbies should check the above pages for the FAQs, language specification,
guides, and tutorials. Post questions to news://rec.games.corewar or come to
#corewars at irc://irc.koth.org. All new players are infinitely welcome!
_______________________________________________________________________________
Greetings!

Two years have passed since the last issue and a lot of interesting things
have happened. This issue will try to renew interest in vampires by finally
publishing vamps are back 0.2, tell the story of Bvowkium Fizmoxid and
revisit our old friend the q^4.5.

I hope to release the next issue before christmas 2007. Please send in your
texts and ideas in order to keep the Core Warrior alife!

Now enjoy this issue!

-- Jens 'Fluffy' Gutzeit
_______________________________________________________________________________
Current Status of the KOTH.ORG '94 No Pspace Hill 

 #  %W/ %L/ %T                      Name               Author   Score     Age
 1  39/ 29/ 32                Hullab3loo         Roy van Rijn     149     338
 2  33/ 18/ 49                 Red Birds             inversed     149      26
 3  38/ 28/ 34       Monster_Human_Grunt             inversed     149     423
 4  37/ 27/ 36       PWS without a cause          Sascha Zapf     146       1
 5  33/ 20/ 47                     4by2k              P.Kline     146     120
 6  44/ 43/ 13                    Camper             inversed     146       8
 7  35/ 27/ 38       Monster_Alien_Grunt             inversed     144     424
 8  43/ 43/ 15                  One bite             inversed     143      11
 9  34/ 26/ 39                     Amber             inversed     143      29
10  34/ 25/ 42                 Shrubbery       inversed/Mizcu     142      58
11  44/ 46/ 10            overloaded SPL          S.Fernandes     142     101
12  45/ 48/  7                      test           C. De Rosa     141       9
13  41/ 42/ 17                   fragile         John Metcalf     141      24
14  35/ 28/ 37                  Fidelity                  hwm     141      71
15  41/ 42/ 16                        VT             inversed     141      16
16  34/ 27/ 40                  Ragnarok        Nenad Tomasev     141      19
17  44/ 49/  7                Genki Desu    Christian Schmidt     140     126
18  28/ 17/ 54                D3vilstick         Roy van Rijn     139     337
19  42/ 46/ 13               Silverblade             inversed     138     104
20  40/ 44/ 16               scan-o-test               sascha     137       6

893 successful challenges have passed since the last issue. No warriors have
survived, which have been on the the hill in January 2005 (Roy, you shouldn't
have killed Hullabaloo. Now it might be have been the oldest warrior!). 48
warriors left the hill with a three digit age. Arrow has gained the highest
age (650) since Son of Vain has left the hill. Together with Last Judgement
(576) and Borgir (451) Fizmo has created the three oldest warriors since! Also
pushed from the hill were Maelstrom (473), HullabaTwo (413), Black Knight
(410), Gods of Destiny (369), HazyLazy C 11 (360), Rust [v0.2] (350),
Eccentric (314), Shot to Nothing (314), Hullabaloo (284, killed), KryneLamiya
(271), MoonOfChaos (268), paper(paper(paper(clear))) (261), Battery (243),
Thingamabob (235), Gargantuan (230), Beat this (225), Harmless Fluffy Bunny    
(222), New-T (217), Bluebell (211), Starfall (209), vamps are back 0.2 (202),
Hallucination Scanner (201), Elven King (192), Song of the blue sea (188),
The Humanizer (179), ChimeraQueen (172), Twilight (166), Mascafe (163),
DanceOfFallenAngels (159), Mandragora (153), CrashAndBurn (146),
()()() (139; Thanks, Nenad for using such a nice name!), Grendel (133),
gihegruoerg (131), anything for a rich girl (127), Paperanha (121), Gabble
(121), Sharky (119), false illusion (119), DifferentialOperatorWS (118),
speed of light (112), Halcyon (111), S.D.N. (108), Thistledown (107) and
N e i t h (104).

Several of these fine warriors have been published, but still a lot of them
haven't been send to Koenigstuhl. Maybe the authors might want to search
through their archives and reconsider their decisions not to publish them.

Hullab3loo, Monster_Human_Grunt and 4by2k currently dominate the hill. 
Monster_Alien_Grunt, Monster_Human_Grunt, Hullab3loo and D3vilstick are the
oldest warriors and so far they show no sign of weakness.
_______________________________________________________________________________
The '94 No Pspace Hall of Fame

You have to get a warrior which is older than 350 to enter the TOP-50 of the
'94 No Pspace Hall of Fame. A * indicates warriors which are still active.

Pos Name                   Author             Age    Strategy
 1  Son of Vain            Oversby/Pihlaja   2573    Q^4 -> Stone/imp
 2  Blacken                Ian Oversby       1363    Q^2 -> Stone/imp
 3  Reepicheep             Grabun/Metcalf    1347    Q^4 -> Paper/stone
 4  nPaper II              Paul-V Khuong     1270    MiniQ^3 -> Paper
 5  Uninvited              John Metcalf      1130    MiniQ^3 -> Stone/imp
 6  Hazy Test 63           Steve Gunnell     1119    Scanner
 7  Behemot                Michal Janeczek   1078    MiniQ^3 -> Bomber
 8  Olivia                 Ben Ford           886    Q^4 -> Stone/imp
 9  Recon 2                David Moore        826    Scanner
10  Keyser Soze            Anton Marsden      823    Qscan -> Bomber/paper/imp
11  Quicksilver            Michal Janeczek    789    Q^4 -> Stone/imp
12  Eraser II              Ken Espiritu       781    Scanner
13  Inky                   Ian Oversby        736    Q^4 -> Paper/stone
14  Toxic Spirit           Philip Thorne      685    Oneshot
15  Jinx                   Christian Schmidt  662    Q^3 -> Scanner
16  Arrow                  Christian Schmidt  650    Scanner
17  Blade                  Fizmo              643    Qscan -> Scanner
18  Return of Vanquisher   Lukasz Grabun      640    Q^4 -> Bomber
19  Revenge of the Papers  Fizmo/Roy          605    Q^4 -> Paper
20  Jade                   Ben Ford           600    Q^4 -> Stone/imp
21  Firestorm              John Metcalf       589    MiniQ^3 -> Paper/imp
22  Last Judgement         Christian Schmidt  576    Q^4 -> Stone/imp
23  Claw                   Fizmo              525    Qscan -> Scanner
24  G3-b                   David Moore        503    Twoshot
25  Thunderstrike          Lukasz Grabun      484    Q^4 -> Stone/imp
26  Maelstrom              Roy van Rijn       473    Qscan -> Paper/imp
27  Vanquisher             Lukasz Grabun      469    Q^4 -> Bomber
28  Revival Fire           P.Kline            468    Bomber
29  The Phantom Menace     Anton Marsden      465    Qscan -> Paper/imp
30  The Stormkeeper        Christian Schmidt  460    Q^3 -> Stone/imp
31  Borgir                 Christian Schmidt  451    Q^4 -> Paper/stone
32  Positive Knife         Ken Espiritu       449    Q^4 -> Stone/imp
33  Boys are Back in Town  Philip Kendall     441    Scanner
 =  Zooom...               John Metcalf       441    Scanner
35  slime test 1.00        David Houston      428    Q^4.5 -> Paper
36  Monster_Alien_Grunt    inversed           424 *
37  Monster_Human_Grunt    inversed           423 *
38  G2-b                   David Moore        413    Twoshot
 =  HullabaTwo             Roy                413    Q^4.5 -> Paper/stone
40  Black Knight           Christian Schmidt  410    Q^4.5 -> Stone/imp
41  Ironic Imps            Roy van Rijn       403    Q^4 -> Stone/imp
42  Qtest                  Christian Schmidt  394    Q^3 -> Paper
43  Stalker                P.Kline            393    Scanner
44  Decoy Signal           Ben Ford           378    Q^4 -> Paper/imp
45  Gods Of Destiny        Nenad Tomasev      369    Q^4 -> Paper/stone
46  HazyLazy C 11          CS SG              360    Q^4 -> Scanner
47  unheard-of             Christian Schmidt  355    Q^4 -> Paper/imp
48  Hazy Lazy ... again    Steve Gunnell      350    Scanner
 =  Dawn                   Roy van Rijn       350    Q^4 -> Paper/imp
 =  Rust [v0.2]            inversed           350    Q^4 -> Paper/imp

Monster_Alien_Grunt and Monster_Human_Grunt show no weakness and promise to
become very old warriors. Hullab3loo and D3vilstick are just a few challenges
away from entering the Hall of Fame.

Thank you, John for maintaining such a wonderful archive about the history of
corewar at http://corewar.co.uk :-)
_______________________________________________________________________________
Current Status of the KOTH.ORG '94 Draft Hill

 #  %W/ %L/ %T                      Name               Author   Score     Age
 1  37/ 25/ 38                  Red Wine            Hugh Jass     150      13
 2  42/ 38/ 19                       Sha    Christian Schmidt     146       5
 3  30/ 17/ 53          Froth and Fizzle              P.Kline     143      51
 4  36/ 29/ 35       Monster_Human_Grunt             inversed     142     105
 5  40/ 39/ 20                     utest        Nenad Tomasev     141       1
 6  40/ 38/ 22          Testing this out            Hugh Jass     141      10
 7  30/ 19/ 51                 Red Birds             inversed     141      20
 8  41/ 41/ 18                     SCDS2             inversed     140      24
 9  35/ 31/ 34            Jailcell Vodka            Hugh Jass     140       9
10  39/ 38/ 23            Evening Breeze         Roy van Rijn     140     209
11  31/ 24/ 45                 Shrubbery       inversed/Mizcu     139      23
12  29/ 19/ 52             Burning Metal             inversed     138      71
13  29/ 19/ 52               Raging Gale             inversed     138      73
14  27/ 17/ 56                     TestP              P.Kline     138      29
15  32/ 27/ 41                 N e i t h             inversed     137      82
16  41/ 45/ 14                    Mutant          Sascha Zapf     137      95
17  40/ 42/ 18                 Bulldozed    Christian Schmidt     137     223
18  32/ 28/ 40              Hurray Beer!            Hugh Jass     136      16
19  30/ 24/ 46                     Amber             inversed     135       7
20  32/ 28/ 40       Monster_Alien_Grunt             inversed     135     106

After 222 successful challenges Bulldozed is the only warrior that remains
on the hill from the last issue. Maelstrom (248) left the hill in July 2006.
Warriors that didn't manage to stay on the hill include Spiritual Black
Dimension (222), Black Knight (189), unheard-of II (185), Arrow (168),
Cyberpunk (160), Yggdrasil (144), Chainlock v02a (133), Dandelion 3 (126),
Cooperative Black Dimension (126), Sunrise 06 (115), Aardvark (107),
CrashAndBurn (97), Hullab3loo (88), ArtaBmoC (81), Hullabaloo (79), elf (76),
Bvowkium Fizmoxid (72), Greater Forrest Gods (71), fallen leaves (60),
sparkle (53), The Humanizer (51) and Paperanha (51).

Bulldozed is now the oldest warrior with an age of 223, closely followed by
Evening Breeze (209).
_______________________________________________________________________________
The '94 Draft Hall of Fame

You have to get a warrior which is older than 143 to enter the TOP-25 of the
'94 Draft Hall of Fame. A * indicates warriors which are still active.

Pos Name                   Author             Age    Strategy
 1  Reepicheep             Grabun/Metcalf     543    Q^4 -> Paper/stone
 2  Son of Vain            Oversby/Pihlaja    441    Q^4 -> Stone/imp
 3  Return of Vanquisher   Lukasz Grabun      283    Q^4 -> Bomber
 4  Bitter Sweet           Lukasz Grabun      262    Q^4 -> Stone/imp
 5  CrazyShot 2            Christian Schmidt  249    Q^4 -> Oneshot
 6  Maelstrom              Roy van Rijn       248    Qscan -> Paper/imp
 7  Herbal Avenger         Michal Janeczek    237    Scanner
 8  Bulldozed              Christian Schmidt  223 *  P-warrior
 9  Spiritual Black Dimens Christian Schmidt  222    Qscan -> Paper/stone
10  Bustling Spirit        Christian Schmidt  216    P-warrior
11  Evening Breeze         Roy van Rijn       209 *  P-warrior
12  Revenge of the Papers  Fizmo/Roy          204    Q^4 -> Paper
13  Uninvited              John Metcalf       194    MiniQ^3 -> Stone/imp
14  Blowrag                Metcalf/Schmidt    192    Q^4 -> Paper/imp
15  Black Knight           Christian Schmidt  189    Q^4 -> Stone/imp
16  unheard-of II          Christian Schmidt  185
17  Incredible!            John Metcalf       180    Paper/imp
18  Wallpaper              Christian Schmidt  175    Q^4 -> Paper/stone
19  Mantrap Arcade         Dave Hillis        170    P-warrior
20  Arrow                  Christian Schmidt  168    Scanner
21  Numb                   Roy van Rijn       167    Q^4 -> Paper/stone
22  PolyPap                Jakub Kozisek      160    Qscan -> Paper
 =  Cyberpunk              Christian Schmidt  160    P-warrior
24  Recon 2                David Moore        156    Scanner
25  Joyful Maw             Dave Hillis        143    P-warrior

Bulldozed and Evening Breeze continue to rise through the ranks.
_______________________________________________________________________________
SAL Beginner's Hill

 #   %W/   %L/	  %T                      Name             Author Score  Age
 1  57.3/ 26.6/ 16.1                    Cancer        The Phoenix 188.0   12
 2  55.6/ 30.1/ 14.3            KoolAndTheGang      gareththegeek 181.2   37
 3  45.3/ 14.5/ 40.2                   Sponger               doug 176.2   34
 4  41.3/ 14.1/ 44.6                Papes_v1.0      gareththegeek 168.5   41
 5  41.5/ 22.0/ 36.5              MyFirstPaper     Johannes Klein 161.1    8
 6  47.3/ 39.4/ 13.3                 salsascan         C. De Rosa 155.1   23
 7  43.2/ 32.1/ 24.7                    Switch              BCook 154.3   44
 8  37.7/ 22.3/ 40.0            hosenscheisser           Johannes 153.1    5
 9  46.0/ 39.0/ 15.1                salsascan6         C. De Rosa 153.0   19
10  38.9/ 25.2/ 35.8            Natriumchlorid           Thurasiz 152.6   11
11  45.0/ 40.0/ 14.9                  easyscan         C. De Rosa 150.1   25
12  16.0/  2.9/ 81.1                  ImpPaper              BCook 129.2   38
13  37.0/ 46.5/ 16.5            Forced Suicide             fr33ke 127.5   36
14  29.9/ 34.0/ 36.2             my_first_bomb             Leniad 125.8    1
15  34.5/ 45.4/ 20.2                    Scaper          Jan Gampe 123.6    7
16  32.7/ 47.0/ 20.4                    Vlad 2              BCook 118.4   50
17  32.1/ 47.1/ 20.8                      easy         C. De Rosa 117.0   32
18  34.4/ 53.1/ 12.6 Bastard Scanner from Hell          Jan Gampe 115.6    3
19  26.4/ 48.2/ 25.5                    Ikarus           Thurasiz 104.6   16
20  29.5/ 56.9/ 13.6               dung-bettle       Jon Philpott 102.2   10
21  24.5/ 57.3/ 18.3                 fruit-fly       Jon Philpott  91.6    9
22  10.2/ 63.0/ 26.8          Thunderpig_V0.15   Steffen Hoffmann  57.4    2

There were 713 challenges since the last issue and the hill is now completely
changed. A couple of months ago an age limit of 50 has been instantiated on
the beginner's hill in oder to prevent the hill from becoming too difficult
to enter.

Congratulations to everybody who managed to enter the hill. We hope to see
you soon on other hills, too!
_____________________________________________________________________________
Blacken - A glimpse of history

In November 2000 Blacken by Ian Oversby became the first warrior which
breached the age limit of 1000 on the '94 No Pspace Hill. On June 15, 2002
it was pushed off the hill at an remarkable age of 1363 and only one warrior
has managed to become older since. Unfortunately it wasn't published and later
declared to be lost. In October 2005 its compiled code found a way into the
hands of Roy van Rijn, who then recreated it. Now it happily lives on
Koenigstuhl. (Update: John has managed to find the original strategy lines
of Blacken.)

;redcode-94nop
;name Blacken
;author Ian Oversby
;strategy The stone from Defender
;strategy Added a QScan
;assert 1

;; Reverse Engineered from the compiled code
;; After everybody thought it was gone forever
;; 17 Oct 2005, Roy van Rijn

        sStep   EQU     1370
        sStep2  EQU     3044
        sBoot   EQU     1800
        cBomb   EQU     (cGo-9)

        iAway   EQU     950
        iStep   EQU     2667

;; Vector launch for the imps

iPmp    spl     1,                      < -2200
        spl     1,                      < -2208
        spl     < 0,                    # iTab+1
        djn.a   @ iTab,                 # 0
iImp    mov.i   # iStep,                * 0

        jmp     iImp+iAway+(iStep*7),   iImp+iAway+(iStep*6)
        jmp     iImp+iAway+(iStep*5),   iImp+iAway+(iStep*4)
        jmp     iImp+iAway+(iStep*3),   iImp+iAway+(iStep*2)
iTab    jmp     iImp+iAway+iStep,       iImp+iAway

FOR 21
        dat     0,                      0
ROF

;; Taken the Q^2 from Newt
;; Removed the lower 4 scans
;; Changed the constants
;; A perfect match (code is 100% the same)

        QB      EQU     (start-550)
        QS      EQU     (QD*2)
        QD      EQU     -100

        GAP     EQU     12
        REP     EQU     8
        REP2    EQU     2

        datz    EQU     (table-3)

        dat     10*QS,                  2*QS
table   dat     4*QS,                   1*QS
        dat     23*QS,                  3*QS

;; can get 21 values from this table
;; and can also use the initial value
;; of fnd

qinc    spl     # GAP,                  -GAP
tab     add.a   table,                  table
slow    add.a   @ tab,                  fnd
fast    add.ba  * tab,                  @ slow
which   sne.i   datz,                   * fnd
        add.a   # QD,                   fnd
        mov.i   datone,                 * fnd
        add.ab  fnd,                    fnd

fnd     mov.i   QB,                     GAP/2
        add.f   qinc,                   fnd
        mov.i   datone,                 * fnd
        djn.b   fnd,                    # REP
        jmp     boot,                   } QS*13

start   seq.i   QB+QS*0,                QB+QS*0+QD
        jmp     which,                  } QB+QS*0+QD/2

        seq.i   QB+QS*1,                QB+QS*1+QD
        jmp     fast,                   } QB+QS*1+QD/2

        seq.i   QB+QS*13,               QB+QS*13+QD
        jmp     fast,                   { fast

        seq.i   QB+QS*2,                QB+QS*2+QD
        jmp     fast,                   { tab

        seq.i   QB+QS*3,                QB+QS*3+QD
        jmp     fast,                   } tab

        seq.i   QB+QS*4,                QB+QS*4+QD
        jmp     > fast,                 } QB+QS*4+QD/2

        seq.i   QB+QS*5,                QB+QS*5+QD
        jmp     slow,                   } QB+QS*5+QD/2

        seq.i   QB+QS*6,                QB+QS*6+QD
        jmp     slow,                   { tab

        seq.i   QB+QS*7,                QB+QS*7+QD
        jmp     slow,                   } tab

        seq.i   QB+QS*10,               QB+QS*10+QD
        jmp     > fast,                 < tab

        seq.i   QB+QS*11,               QB+QS*11+QD
        jmp     slow,                   < tab

        seq.i   QB+QS*12,               QB+QS*12+QD
        djn.f   slow,                   tab

        seq.i   QB+QS*23,               QB+QS*23+QD
        jmp     > fast,                 > tab

        seq.i   QB+QS*24,               QB+QS*24+QD
        jmp     slow,                   > tab

        seq.i   QB+QS*17,               QB+QS*17+QD
        jmp     slow,                   { fast

        seq.i   QB+QS*8,                QB+QS*8+QD
        jmp     < fast,                 } QB+QS*8+QD/2

;; Boot the stone away
;; And the pointer

boot    mov     cGate,                  < bPtr

FOR 7
        mov     < bEnd+1,               { bPtr
ROF

        spl     * bPtr,                 < -1000
        spl     * bPtr,                 < -1108
        mov     iImp,                   iImp+iAway
        spl     iPmp,                   < -1217
bPtr    div.f   # sBoot,                # sBoot-10

;; Bomb for the qscan

datone  dat     } 300,                  > 200

cGate   dat     1,                      # 18

sStart  spl     # sStep2,               < sStep
sAtt    mov     { -sStep2+1,            * -sStep+3
        mov.i   sStart,                 @ sAtt
        sub.f   sStart,                 sAtt
        djn.f   sAtt,                   < sStep-4

cGo     mov.i   cBomb,                  > cGate-4
bEnd    djn.f   cGo,                    { cGate-4

        END     start

Performance of Blacken against the fsh94nop-0.3-benchmark:

clr: 141.238303 (W 40.364483, L 39.490664, T 20.144853)
scn: 167.544759 (W 51.765265, L 35.985771, T 12.248964)
cds: 142.636628 (W 42.116395, L 41.596163, T 16.287442)
pap: 114.209717 (W 20.525680, L 26.841644, T 52.632675)
pws: 117.891296 (W 22.990642, L 28.089988, T 48.919369)
pwi: 107.116075 (W 13.284622, L 19.453168, T 67.262210)
sai: 122.650942 (W 23.468786, L 24.286630, T 52.244584)
sbi: 124.259069 (W 25.444174, L 26.629278, T 47.926548)
stn: 146.480686 (W 42.286779, L 38.092873, T 19.620348)
-------------------------------------------------------
AVG: 131.558608 (W 31.360759, L 31.162909, T 37.476333)
_______________________________________________________________________________
Vamps are back!                                  by Johannes "el kauka" Kersten

A strategy from the old days has returned! Well, ok, it's not the first time
that vampires have been on the '94nop hill, but this time they are doing quite
fine. 

Here are some of the "recent" vamps I found with Jens' Time Machine:

Year    Name            Author          Best place      Age
2003    Dracula 2003    Roy van Rijn    5               64
1999    myVamp 3.7      paulsson        6               66

(I'm not yet sure if these are all vampires on '94nop after 1999.)

In comparison (while I'm writing this article):

Year    Name            Author          Best place      Age
2005    vamps are back  el kauka        1               85+ (still on the hill)

(Editor's note: vamps are back died at an age of 202 on January 1, 2006.)

Therefore you might ask, what's the magic behind it? I will tell you, but
first let us have a little journey through the different vampires of the past.

The very essence of the vampire is the vamp loop, the fang bomb and the trap.
Mainly it looks like this:

...
        ;; the main loop

loop    add.f   inc,                          fang
        mov.i   fang,                         @ fang
        jmp     loop

fang    jmp     trap,                         0
inc     dat     step,                         -step

trap    spl     0
        jmp     -1
...

The fang bomb is a well calculated jump instruction. Each dropped bomb in
the core points to the trap. An enemy process which executes this bomb is
going to jump to the trap, creating more and more useless processes. The 
beauty of all this is the corecolouring effect which gives us the chance to
beat scanners plus the ability to stun papers. In theory vampires should rule
the hill ... but they don't; simply because there are two problems:

  - The main loop shown above isn't very efficient (only 0.33c)
  - Silk-style papers appeared after the rule change in 94. These kind of
    papers spend 50% of their time creating new proccesses. Therefore they
    are much harder to stun.

The easiest way to solve problem #1 is to change the end of the loop from 
"jmp loop" to "jmz.f loop, *fang". This makes the vampire work like a jmz-
scanner and increases its effeciency (0.33c bombing + 0.33c scanning = 
0.66c activity). Several authors have used this idea before. The magic behind
"how to solve the second problem" is what the vamp is doing with a scanned
location after it has found something.

Some examples:

Stepping Stone by Kurt Franke
(vamps using the same after-scan-attack: myvamp v.3.7 / v.5.4 by paulsson)

After it has found something Stepping Stone drops the jump bomb to the
scanned postion. This bomb is not pointing to the trap! It points somewhere
else into the core, mostly dat, which would kill the process. This works
very well, but is still no solution for our second problem.

vamp 0.2b by bjoern guenzel
(vamps using the same after-scan-attack: dracula 2003 by roy van rien)

It drops the following bomb to the scanned loaction

...
        mov.i   1,                      } 1
        spl     # 1,                    1
...

The more processes execute the mov instruction the longer the spl carpet
behind it becomes. Quite a good solution for the second problem, but this
increases the length of the vampire a lot (2 lines to drop the bombs, 2 lines
for the bombs themselves). And that leads us to a third problem. Vampires used
to get quite "big". Let's say around 10 instruction for the main loop with
after-scan-attack (pointers/fang etc.), around 5 for a good trap and another
5 for the endgame strategy. That are 20(!) instructions you have to boot if
you want to use the vamp together with a quickscanner. 

The way I solved the problems was to combine the main vamp loop with the
main loop of blur-style scanners and some extra snippets. 

...
gate    dat     trap,                   0       ; gate/pointer for the clear
fang    jmp     gate+trap,              0

loop    mov.i   inc,                    } gate
        add.f   inc,                    fang    ; \
        mov.i   fang,                   @ fang	;  basic vamp loop
        jmz.f   loop,                   * fang	; /

ptr     mov.a   fang,                   gate    ; guide the clear to the found

        djn.b   loop,                   # vTIME ; after a fixed number of stuns
                                                ; switch to endgame

inc     spl     # vSTEP,                # -vSTEP; endgame: d-clear
clear   mov     bomb,                   > loop
        djn.f   -1,                     > loop

bomb    dat     < 2667,                 13
...

#1: The efficiency is even more increased:
    0.25c clear + 0.25c bomb + 0.25c scan = 0.75c activity

#2: The permanent spl-clear gives us the extra stun power we need. If the
    scan part finds something, it guides the clear to the scanned postion.  

#3: The whole vamp is 12 instructions long and can be booted as a whole. But 
    where does the trap went? The blur-scan-like part of this warrior is
    not using the zooom trick which is quite common in blurstyle scanners. 
    Therefore we know where the first spl carpet is. Let's assume the scan
    part is not going to find anything during the first 10 scans. This leads
    to a spl carpet of length 10. Even a seperate trap couldn't stun the enemy
    better.

Thanks to: Jens Gutzeit, Christian Schmidt and John Metcalf for hanging around
in the irc channel and helping me to find other vampires.

Extra thanks go to Christian Schmidt who has added the q-scan and bootcode to
"vamps are back 0.2" and also re-optimaxed it.

;redcode-94nop
;name vamps are back 0.2
;author elkauka
;strategy hybrid vampire/scanner
;assert 1

;; Qscan Constants

        zero    EQU     qbomb
        qtab3   EQU     qbomb
        qz      EQU     2108
        qy      EQU     243

        qc2     EQU     ((1 + (qtab3-qptr)*qy) % CORESIZE)
        qb1     EQU     ((1 + (qtab2-1-qptr)*qy) % CORESIZE)
        qb2     EQU     ((1 + (qtab2-qptr)*qy) % CORESIZE)
        qb3     EQU     ((1 + (qtab2+1-qptr)*qy) % CORESIZE)
        qa1     EQU     ((1 + (qtab1-1-qptr)*qy) % CORESIZE)
        qa2     EQU     ((1 + (qtab1-qptr)*qy) % CORESIZE)

        qoff    EQU     -88
        qstep   EQU     -7
        qtime   EQU     20

;; Constants for optimization

        trap    EQU     6941
        vSTEP   EQU     4691
        vTIME   EQU     73
        pBoot   EQU     5235

        dat     0,                      0
qbomb   dat     > qoff,                 > qc2

;; 45 instructions

pGo     spl     1,                      zero+pBoot+1

FOR 6 
        mov.i   { bomb+1,               < pGo 
ROF 
        djn     zero+pBoot-8,           # 1 
        mov.i   1,                      -1 

gate    dat     trap,                   0
fang    jmp     gate+trap,              0
loop    mov.i   inc,                    } gate
        add.f   inc,                    fang
        mov.i   fang,                   @ fang
        jmz.f   loop,                   * fang
ptr     mov.a   fang,                   gate
        djn.b   loop,                   # vTIME
inc     spl     # vSTEP,                # -vSTEP
clear   mov     bomb,                   > loop
        djn.f   -1,                     > loop
bomb    dat     < 2667,                 13

FOR 24
        dat     0,                      0 
ROF

;;

        dat     0,                      < qb1
qtab2   dat     0,                      < qb2
        dat     0,                      < qb3

FOR 4
        dat     0,                      0
ROF

        dat     zero-1,                 qa1
qtab1   dat     zero-1,                 qa2

FOR 5
        dat     0,                      0
ROF

qgo     sne     qptr+qz*qc2,            qptr+qz*qc2+qb2
        seq     <qtab3,                 qptr+qz*(qc2-1)+qb2
        jmp     q0,                     } q0

        sne     qptr+qz*qa2,            qptr + qz*qa2 + qb2
        seq     < qtab1,                qptr+qz*(qa2-1)+qb2
        jmp     q0,                     { q0

        sne     qptr+qz*qa1,            qptr+qz*qa1+qb2
        seq     < (qtab1-1),            qptr+qz*(qa1-1)+qb2
        djn.a   q0,                     { q0

        sne     qptr+qz*qb3,            qptr+qz*qb3+qb3
        seq     < (qtab2+1),            qptr+qz*(qb3-1)+(qb3-1)
        jmp     q0,                     } q1

        sne     qptr+qz*qb1,            qptr+qz*qb1+qb1
        seq     < (qtab2-1),            qptr+qz*(qb1-1)+(qb1-1)
        jmp     q0,                     { q1

        sne     qptr+qz*qb2,            qptr+qz*qb2+qb2
        seq     < qtab2,                qptr+qz*(qb2-1)+(qb2-1)
        jmp     q0,                     } 4443 ; extra attack

        seq     > qptr,                 qptr+qz+(qb2-1)
        jmp     q2,                     < qptr

        seq     qptr+(qz+1)*(qc2-1),    qptr+(qz+1)*(qc2-1)+(qb2-1)
        jmp     q0,                     } q0

        seq     qptr+(qz+1)*(qa2-1),    qptr+(qz+1)*(qa2-1)+(qb2-1)
        jmp     q0,                     { q0

        seq     qptr+(qz+1)*(qa1-1),    qptr+(qz+1)*(qa1-1)+(qb2-1)
        djn.a   q0,                     { q0

        jmz.f   pGo,                    qptr+(qz+1)*(qb2-1)+(qb2-1)

q0      mul.b   * 2,                    qptr
q2      sne     { qtab1,                @ qptr
q1      add.b   qtab2,                  qptr
        mov     qtab3,                  @ qptr
qptr    mov     qbomb,                  } qz
        sub     # qstep,                qptr
        djn     -3,                     # qtime

        jmp     pGo,                    } 3256 ; extra attack

FOR 4
        dat     0,              0
ROF

        END     qgo

Performance of vamps are back 0.2 against the fsh94nop-0.3-benchmark:

clr: 171.889288 (W 54.455091, L 37.020895, T  8.524014)
scn: 158.370188 (W 49.908131, L 41.446075, T  8.645793)
cds: 146.457719 (W 45.103192, L 43.748665, T 11.148143)
pap: 139.397727 (W 40.696171, L 41.994616, T 17.309212)
pws: 111.031919 (W 32.832329, L 54.632739, T 12.534931)
pwi: 114.346985 (W 25.482844, L 36.618703, T 37.898453)
sai: 120.774260 (W 34.563517, L 48.352775, T 17.083707)
sbi: 124.891681 (W 37.170235, L 49.448789, T 13.380977)
stn: 150.216853 (W 45.869653, L 41.522454, T 12.607892)
-------------------------------------------------------
AVG: 137.486291 (W 40.675685, L 43.865079, T 15.459236)
_______________________________________________________________________________
Bvowkium Fizmoxid                        by bvowk and Christian 'Fizmo' Schmidt

In a discussion on the corewar IRC channel bvowk showed us one of his evolved 
uncommon looking clears. The most interesting aspect of it was the very 
impressive score against b-imps.

        spl     # 0,                    0
        mov.i   # 1,                    < 1
        djn.b   -1,                     # value

One of the reasons why it works so well is the djn.b. It decrements the pointer 
for the clear so that every second location will be cleared by the anti-imp 
mov-bomb. This seems to be an advantage, because the clear runs now much
faster through the core without loosing its offensive power against b-imps.

The redcoders immediately adapted this snippet into their coreclear papers 
like in the case of van Rijn's Maelstrom or Zapf's paper(paper(paper(clear))), 
because it gave much better scores against stone/b-imps than with the so far 
common used djn.f -2, < value. 

pap     spl     @ 0,                    } tstep1
        mov.i   } -1,                   > -1
nothA   spl     cstep1,                 0
        mov.i   > -1,                   } -1
nothB   spl     @ 0,                    } nstep1
        mov.i   } -1,                   > -1
        mov.i   # 1138,                 < 1
        djn.b   -2,                     # 1618

However, the clear in such papers run quite slowly compared to the 
self-replication. An idea to improve the speed of the clear is the addition
of a spl #0, similar to what is found in several paper-dwarfs or paper-imps.
Having just two silk-pairs and the 3-line coreclear the paper contains just
7 instructions.

pap     spl     @ 0,                    < pStep1
        mov     } -1,                   > -1
        spl     pStep2,                 0
        mov     > -1,                   } -1
        spl     # 0,                    0
        mov.i   # 1,                    < 1
pBack   djn.b   -1,                     # bStep1

To increase the defensive power a second paper was added to the warrior
containing a-imps. After implementing a Q^4.5 quickscan a subsequent 
optimization of the paper constants and the boot locations were done leading
to a surprisingly good scoring warrior, which appeared on both the 94nop hill
and the 94draft hill for a quite lenghty term.

;redcode-94nop
;name Bvowkium Fizmoxid
;author bvowk/fizmo
;strategy - Q^4.5 scanner
;strategy - paper with embedded evolved anti-imp clear
;strategy - paper with imps
;assert 1

        pAway1  EQU     2024    ; optimizable
        pAway2  EQU     2614    ; optimizable
        pStep1  EQU     478     ; optimizable
        pStep2  EQU     1851    ; optimizable
        bStep1  EQU     276     ; optimizable
        sStep1  EQU     2978    ; optimizable
        sStep2  EQU     3257    ; optimizable

        iStep   EQU     2667    ; imp-step

        zero    EQU     qbomb
        qtab3   EQU     qbomb

qbomb   dat     > qoff,                 > qc2
        dat     0,                      0

pGo     spl     1,                      < qb1
qtab2   spl     1,                      < qb2
        mov.i   -1,                     # qb3

        mov.i   < 1,                    { 1
        spl     qbomb+pAway1,           pBack+1
        mov.i   < imp+1,                { 1
        djn.f   qbomb+pAway2,           < 3072

        dat     0,                      0

pap     spl     @ 0,                    < pStep1
        mov     } -1,                   > -1
        spl     pStep2,                 0
        mov     > -1,                   } -1
        spl     # 0,                    0
        mov.i   # 1,                    < 1
pBack   djn.b   -1,                     # bStep1

FOR 4
        dat     0,                      0
ROF

        dat     zero - 1,               qa1
qtab1   dat     zero - 1,               qa2


FOR 17
        dat     0,                      0
ROF

pap1    spl     @ 0,                    > sStep1
        mov     } -1,                   > -1
        spl     sStep2,                 0
        mov     > -1,                   } -1
        spl     @ 0,                    < iStep+1
        mov     } -1,                   > -1
imp     mov.i   # iStep,                * 0

FOR 18
        dat     0,                      0
ROF

        qc2     EQU     ((1 + (qtab3-qptr)*qy) % CORESIZE)
        qb1     EQU     ((1 + (qtab2-1-qptr)*qy) % CORESIZE)
        qb2     EQU     ((1 + (qtab2-qptr)*qy) % CORESIZE)
        qb3     EQU     ((1 + (qtab2+1-qptr)*qy) % CORESIZE)
        qa1     EQU     ((1 + (qtab1-1-qptr)*qy) % CORESIZE)
        qa2     EQU     ((1 + (qtab1-qptr)*qy) % CORESIZE)
        qz      EQU     2108
        qy      EQU     243

qgo     sne     qptr + qz*qc2,          qptr + qz*qc2 + qb2
        seq     < qtab3,                qptr + qz*(qc2-1) + qb2
        jmp     q0,                     } q0

        sne     qptr + qz*qa2,          qptr + qz*qa2 + qb2
        seq     <qtab1,                 qptr + qz*(qa2-1) + qb2
        jmp     q0,                     { q0

        sne     qptr + qz*qa1,          qptr + qz*qa1 + qb2
        seq     < (qtab1-1),            qptr + qz*(qa1-1) + qb2
        djn.a   q0,                     { q0

        sne     qptr + qz*qb3,          qptr + qz*qb3 + qb3
        seq     < (qtab2+1),            qptr + qz*(qb3-1) + (qb3-1)
        jmp     q0,                     } q1

        sne     qptr + qz*qb1,          qptr + qz*qb1 + qb1
        seq     < (qtab2-1),            qptr + qz*(qb1-1) + (qb1-1)
        jmp     q0,                     { q1

        sne     qptr + qz*qb2,          qptr + qz*qb2 + qb2
        seq     < qtab2,                qptr + qz*(qb2-1) + (qb2-1)
        jmp     q0

        seq     > qptr,                 qptr + qz + (qb2-1)
        jmp     q2,                     < qptr

        seq     qptr+(qz+1)*(qc2-1),    qptr+(qz+1)*(qc2-1)+(qb2-1)
        jmp     q0,                     } q0

        seq     qptr+(qz+1)*(qa2-1),    qptr+(qz+1)*(qa2-1)+(qb2-1)
        jmp     q0,                     { q0

        seq     qptr+(qz+1)*(qa1-1),    qptr+(qz+1)*(qa1-1)+(qb2-1)
        djn.a   q0,                     { q0

        jmz.f   pGo,                    qptr + (qz+1)*(qb2-1) + (qb2-1)

        qoff    EQU     -87
        qstep   EQU      -7
        qtime   EQU      14

q0      mul.b   *2,                     qptr
q2      sne     { qtab1,                @ qptr
q1      add.b   qtab2,                  qptr
        mov     qtab3,                  @ qptr
qptr    mov     qbomb,                  } qz
        sub     # qstep,                qptr
        djn     -3,                     # qtime

        jmp     pGo

        END     qgo

Performance of Bvowkium Fizmoxid against the fsh94nop-0.3-benchmark:

clr: 154.943811 (W 39.097017, L 23.250224, T 37.652758)
scn: 122.013203 (W 32.462718, L 42.912233, T 24.625048)
cds: 153.889459 (W 40.225612, L 26.561766, T 33.212622)
pap: 115.460091 (W 13.133466, L 10.806841, T 76.059693)
pws: 125.306371 (W 18.334829, L 11.363287, T 70.301884)
pwi: 114.120519 (W 11.576507, L  9.032496, T 79.390997)
sai: 121.583130 (W 16.258172, L 10.933214, T 72.808614)
sbi: 162.785540 (W 36.729265, L 10.672991, T 52.597744)
stn: 154.730697 (W 40.869226, L 27.007755, T 32.123018)
-------------------------------------------------------
AVG: 136.092536 (W 27.631868, L 19.171201, T 53.196931)
_______________________________________________________________________________
How to use a q^4.5-scanner                             by Jens 'Fluffy' Gutzeit

Quickscanners have been around for quite a while and you can find them in a
good part of all warriors on Koenigstuhl. They became more sophisticated with
every major step towards the current q^4.5-scanners, which now almost everybody
uses. Normally you just copy a q^4.5 from some warrior, paste it into your new
warrior, adjust it to your needs and enjoy the increased performance.
Unfortunately there is a problem here! You can loose a lot of the power of a
q^4.5 by "adjusting it to your needs". This article will try to cover some
important properties of a q^4.5 to give you its full power.

A naked q^4.5 looks like this:

        ORG     qGo

        ...     ...,                    qb1
qTab2   ...     ...,                    qb2
        ...     ...,                    qb3
...

qBomb   dat.f   > qOffset,              > qc2   ; qTab3
...

empty   dat.f   0,                      0
        dat.f   empty + 1,              qa1
qTab1   dat.f   empty + 1,              qa2
....

;; q^4.5-scanner

        qTab3   EQU     qBomb

        qm      EQU     160
        qM      EQU     6239

        qa1     EQU     ((qTab1 - 1 - found) * qM + 1)
        qa2     EQU     ((qTab1     - found) * qM + 1)

        qb1     EQU     ((qTab2 - 1 - found) * qM + 1)
        qb2     EQU     ((qTab2     - found) * qM + 1)
        qb3     EQU     ((qTab2 + 1 - found) * qM + 1)

        qc2     EQU     ((qTab3     - found) * qM + 1)

qGo     sne.i   found+qm*qc2,           found+qm*qc2+qb2
        seq.i   < qTab3,                found+qm*(qc2-1)+qb2
        jmp     q0,                     } q0

        sne.i   found+qm*qa1,           found+qm*qa1+qb2
        seq.i   < (qTab1-1),            found+qm*(qa1-1)+qb2
        djn.a   q0,                     { q0

        sne.i   found+qm*qa2,           found+qm*qa2+qb2
        seq.i   < qTab1,                found+qm*(qa2-1)+qb2
        jmp     q0,                     { q0

        sne.i   found+qm*qb1,           found+qm*qb1+qb1
        seq.i   < (qTab2-1),            found+qm*(qb1-1)+(qb1-1)
        jmp     q0,                     { q1

        sne.i   found+qm*qb3,           found+qm*qb3+qb3
        seq.i   < (qTab2+1),            found+qm*(qb3-1)+(qb3-1)
        jmp     q0,                     } q1

        sne.i   found+qm*qb2,           found+qm*qb2+qb2
        seq     < qTab2,                found+qm*(qb2-1)+(qb2-1)
        jmp     q0,                     < found+qm*qb2-1  ; free B-field!

        seq.i   > found,                found+qm+(qb2-1)
        jmp     qSelect,                < found

        seq.i   found+(qm+1)*(qc2-1),   found+(qm+1)*(qc2-1)+(qb2-1)
        jmp     q0,                     } q0

        seq.i   found+(qm+1)*(qa2-1),   found+(qm+1)*(qa2-1)+(qb2-1)
        jmp     q0,                     { q0

        seq.i   found+(qm+1)*(qa1-1),   found+(qm+1)*(qa1-1)+(qb2-1)
        djn.a   q0,                     { q0

        jmz.f   boot,                   found+(qm+1)*(qb2-1)+(qb2-1)

;; decoder

q0      mul.b   * q1,                   found
qSelect sne     { qTab1,                @ found
q1      add.b   qTab2,                  found

;; throw some bombs

        qOffset EQU     -88    ; offset of second bomb trail
        qTimes  EQU     20     ; number of bombs to throw
        qStep   EQU     -7     ; distance between bombs

throw   mov.i   qTab3,                  @ found
found   mov.i   qBomb,                  } qm
        sub     # qStep,                found
        djn     throw,                  # qTimes

;; start warrior

        jmp     boot

Looks like a pie! You just add your actual warrior somewhere, fill in some
DAT $ 0, $ 0 and you are done. Unfortunately it isn't that easy. The q^4.5
has some pecularities you have to deal with. Let's look at the scanned
locations (all values are relative to the start of the warrior):

        found+qm*qc2,                   found+qm*qc2+qb2,
        found+qm*(qc2-1),               found+qm*(qc2-1)*qb2,
        found+qm*qa1,                   found+qm*qa1+qb2,
        found+qm*(qa1-1),               found+qm*(qa1-1)+qb2,
        found+qm*qa2,                   found+qm*qa2+qb2,
        found+qm*(qa2-1),               found+qm*(qa2-1)+qb2,
        found+qm*qb1,                   found+qm*qb1+qb1,
        found+qm*(qb1-1),               found+qm*(qb1-1)+(qb1-1),
        found+qm*qb3,                   found+qm*qb3+qb3,
        found+qm*(qb3-1),               found+qm*(qb3-1)+(qb3-1),
        found+qm*qb2,                   found+qm*qb2+qb2,
        found+qm*(qb2-1),               found+qm*(qb2-1)+(qb2-1),
        found+qm,                       found+qm+(qb2-1),
        found+(qm+1)*(qc2-1),           found+(qm+1)*(qc2-1)+(qb2-1),
        found+(qm+1)*(qa2-1),           found+(qm+1)*(qa2-1)+(qb2-1),
        found+(qm+1)*(qa1-1),           found+(qm+1)*(qa1-1)+(qb2-1),
        found+(qm+1)*(qb2-1)+(qb2-1)

So we scan 33 different locations. Those locations have to be placed carefully
in order to have a maximal chance of finding something. Let's consider the
optimal opponent, which consists of 100 non-"DAT.F $ 0, $ 0"-instructions. If
there are scanned locations, which are less than 100 locations apart, our
q^4.5 will work suboptimally. Let's suppose we scan the locations 1000 and
1010. If the scan at 1000 finds something then the scan at 1010 would have
found something, too. On the other hand if we would scan the locations 1000
and 1100 there is no way that a scan at 1000 would influence the success-
probability for the next scan at 1100, because our opponents can only be 100
instructions long.

The first thing that you should keep in mind is to place the scanned locations
wide enough apart. Ideally the minimal distance between two scanned locations
would be greater than 99.

But how can you influence that placement? Obviously the scanned locations
depend of the values found, qm, qa1, qa2, qb1, qb2, qb3 and qb2, but a deeper
look reveals that we have to deal with qm, qM and found, qTab1, qTab2 and
qTab3. Now we could start to search through all possible values and wait
until we have found a good placement. Fortunately there is a condition for
qm and qM:

              qM * (qm - 1) = 1 mod 8000

If it isn't fullfilled our q^4.5 will not work! All you have to do now is to
write a little program to look for good values. Even on a slow computer that
wouldn't take very long. Unfortunately you won't find any placement where
the scanned locations have a minimal distance of 100 or greater. In order to
find out why let's look at the scanned locations found+qm*qb2 and
found+qm+(qb2-1):

found + qm * qb2        = found + qm * ((qTab2 - found) * qM + 1)
                        = found + qm + qm * qM * qTab2 - qm * qM * found

found + qm + (qb2-1)    = found + qm + ((qTab2 - found) * qM + 1) - 1
                        = found + qm + qM * qTab2 - qM * found

So the distance between these two scanned locations is

                          found + qm + qm * qM * qTab2 - qm * qM * found
                        -(found + qm +      qM * qTab2 -      qM * found)
                        ------------------------------------------------
                           (qm - 1) * qM * qTab2 - (qm - 1) * qM * found

Now we remember that (qm - 1) * qM = 1 and we see that the distance is
(qTab2 - found) or rather (found - qTab2). Unfortunately both labels are
located inside the warrior. That is why their distance can never be greater
than 100. It is even worse! To get a maximal distance you have to place qTab2
at the start of the warrior and found at the end of it. The first possible
instruction for qTab2 is the second one and found can maximally placed at
instruction 96. So the best possible minimal distance between your scans is
95. At least it is close enough to 100.

There are a lot of different ways to get that distance. One you get with the
following setup (counting starts with zero!):

 - qTab1 at instruction 35
 - qTab2 at instruction  1
 - qTab3 at instruction 31
 - found at instruction 96
 - qm EQU 160
 - qM EQU 6239

With this setup the following locations are scanned:

2656, 1952, 2496, 1792, 5376, 4672, 5216, 4512, 3616, 2912, 3456, 2752, 1216,
2273, 1056, 2112, 5696, 3231, 5536, 3070, 7456, 6752, 7296, 6591, 256, 7551,
4961, 4256, 6877, 6172, 2398, 1693, 5886

Of course you have to consider other restrictions:

 - You shouldn't scan your own warrior. (At least one person has written a
   q^4.5-scanner that scans its own code - me!)
 - To maximize your odds of finding something all scanned locations should
   lie between location 200 and 7900.

To prove my point, let's use the above setup together with a "jmp # 0", i.e.

        ORG     qGo

boot    jmp     # 0,                    qb1
qTab2   dat.f   0,                      qb2
        dat.f   0,                      qb3
...

It scores as follows against the fsh94nop 0.3:

clr:  24.599410 (W  7.730846, L 90.862283, T  1.406871)
scn:  25.145281 (W  8.300218, L 91.455155, T  0.244627)
cds:  32.002307 (W 10.076700, L 88.151092, T  1.772209)
pap:  35.426548 (W 11.155087, L 86.883626, T  1.961287)
pws:  33.164979 (W  9.252660, L 85.340341, T  5.406999)
pwi:  34.840085 (W  9.057599, L 83.275114, T  7.667286)
sai:  42.087553 (W 12.089476, L 82.091399, T  5.819126)
sbi:  33.963594 (W  9.978849, L 85.994103, T  4.027048)
stn:  52.669530 (W 15.737299, L 78.805068, T  5.457634)
-------------------------------------------------------
AVG:  34.877698 (W 10.375415, L 85.873131, T  3.751454)

The score isn't earth shaking but it is only meant for comparison. When I
adjust the position of qTab1 from 35 to 34 and qTab3 from 31 to 27 the score
changes to:

clr:  24.084519 (W  7.573281, L 91.062043, T  1.364675)
scn:  24.566295 (W  8.099923, L 91.633551, T  0.266526)
cds:  30.513182 (W  9.608277, L 88.703371, T  1.688352)
pap:  34.254690 (W 10.764111, L 87.273533, T  1.962355)
pws:  32.291373 (W  9.007179, L 85.722984, T  5.269837)
pwi:  34.049054 (W  8.825792, L 83.602530, T  7.571679)
sai:  40.376234 (W 11.608768, L 82.841302, T  5.549929)
sbi:  32.916293 (W  9.672478, L 86.428663, T  3.898859)
stn:  50.407533 (W 15.002884, L 79.598235, T  5.398880)
-------------------------------------------------------
AVG:  33.717686 (W 10.018077, L 86.318468, T  3.663455)

Now you might say that one point less isn't that bad, but on the '94 No Pspace
hill, where every warrior is highly optimized, that one point can make the
difference between bein pushed off or living a little bit longer. And using
a good q^4.5 comes at no extra cost!

So whenever you copy a q^4.5-scanner make sure that it uses an optimal setup.
Of course there are other things that you can improve, but that is not the
topic of this article ...
_______________________________________________________________________________
Core Warrior was established by our founding editors Beppe Bezzi and
Myer R Bremer. Later issues have been produced under the editorship of
Maurizio Vittuari, Anton Marsden, Christian Schmidt, Philip Kendall,
John Metcalf, German Labarga and Jens Gutzeit.

Questions? Concerns? Comments? Complaints? Post them to rec.games.corewar,
tell them in #corewars at irc.koth.org or (if you really have to ;-) mail
them to Jens 'Fluffy' Gutzeit <fluffy@65536.org>.
© 2002-2005 corewar.info. Logo © C. Schmidt