comparison interps/fukyorbrane/README @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
comparison
equal deleted inserted replaced
995:6883f5911eb7 996:859f9b4339e6
1 FukYorBrane is a cross between Brainfuck and Corewar. Basically, you have two FYB programs
2 running simultaneusly. The data buffer for each of them is the opponent's program buffer. The
3 objective is to cause the opponent's program to quit with a "bomb." The changes you make to the
4 opponent's program buffer must be committed (see !) before they will have an effect.
5 Comments can be put into the program either the same way as BF (anything that isn't a command is a
6 comment) and/or by surrounding comments in (). The advantage of () is that the comments can
7 contain '.', ',', ':', ';', etc.
8 The program buffers will always be of the same length - if one is shorter, it will be padded at the
9 end with nops (see %). When a program pointer reaches the end of a program, it simply goes back to
10 the beginning.
11 There are 17 commands in FukYorBrane:
12
13 COMMAND | VALUE | EFFECT
14 --------+-------+--------
15 % | 0 | nop, does nothing
16 | |
17 + | 1 | increments the current value in the opponent's program buffer, looping if
18 | | necessary
19 | |
20 < | 2 | moves the data pointer to the left (NOT looping, if it goes below 0, it stays at
21 | | 0)
22 | |
23 > | 3 | moves the data pointer to the right (looping if necessary)
24 | |
25 , | 4 | reserved but has no effect
26 | |
27 . | 5 | reserved but has no effect
28 | |
29 ! | 6 | commit the current value to the opponent's active program buffer
30 | |
31 ? | 7 | uncommit the current value (replace the current value with the value in the
32 | | original program)
33 | |
34 [ | 8 | start a brainfuck-style loop (loop while the value at the current location in the
35 | | opponent's program buffer is not nop)
36 | |
37 ] | 9 | end of a [ loop
38 | |
39 { | 10 | loop while the opponent does not have a program pointer at the current location
40 | |
41 } | 11 | end of a } loop
42 | |
43 : | 12 | start a thread. The parent thread will skip over the matching ;, the child will
44 | | loop between this and the matching ;
45 | | NOTE: any given : will only fork once, then it's spent
46 | |
47 ; | 13 | end of a ; loop
48 | |
49 N/A | 14 | BOMB! This is an important one. If ANY program pointer (even if you have
50 | | several from threading) hits this, you lose!
51 | | NOTE: You cannot write a bomb in your own program, so it doesn't have a character.
52 | |
53 * | 15 | exit - end the current thread. If you're not in the topmost thread, you can only
54 | | exit at the very end of a thread: :......*;
55 | | NOTE: If the current thread is the only thread, you lose!
56 | |
57 @ | 16 | defect: instead of editing the opponent's program buffer, this thread will edit
58 | | your own. You can later defect back.
59 | | NOTE: If you commit a defect, YOU DEFECT
60 | | (this is to try to prevent pure manglers from being effective)
61
62
63 ---------------
64 SIMPLE STRATEGY
65 ---------------
66 One of the most simple FukYorBrane programs is:
67 {>}[+]+++++++++++++!
68 This very simply:
69 {>} | tries to find the opponent's program pointer
70 [+] | blanks the value where you found it (as in BrainFuck, but looping values)
71 +++++++++++++! | sets the value there to 14 (bomb)
72
73 This simple program isn't very effective, as it has tight loops. Tight loops are generally best
74 avoided, because of how bombs are usually placed. If the enemy finds you and places a bomb, and
75 you're in a tight loop, you'll hit the bomb long before you can do something about the enemy.
76
77
78 A slightly more complex FukYorBrane program:
79 :{>}[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+]]]]]]]]]]]]]]]+++++++++++++!>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;
81 :@[>+++]!;*
82
83 Let's break this down:
84 >} | This is the same as before (and still a tight
85 | loop, which is bad).
86 [+[+[+[+[+[+[+[+[+[+[+[+[+[+[+]]]]]]]]]]]]]]] | This is one way to zero a value without a tight
87 | loop
88 +++++++++++++! | set the bomb
89 > | since we already have a bomb here, go on
90 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%... | by setting a lot of nops, we make the :; loop
91 | less tight
92 :@[>+++]!; | this is a simple bomb finding algorithm:
93 | it defects,
94 | then loops,
95 | nop'ing any bombs
96 | and committing if they were a bomb
97
98 Because you can defect, you can have a self-replicating program. But that's up to future hackers
99 to produce ;)
100
101 --------------
102 PROGRAM STYLES
103 --------------
104 Gregor has only written two major styles of programs:
105 Manglers
106 and
107 Seekers.
108
109 Of Manglers, there are several subtypes:
110 Pure mangler: All this does is destroy code with no attempt at any logic. Very quick. It's also
111 the shortest code: +!>
112 Logic mangler: Usually look for loops, disable loop beginnings or ends. That way, program
113 pointers fly through the entire program, so you can bomb anywhere.
114
115 Seekers basically seek out program pointers ({>}), then try to bomb where the program pointer was,
116 since the pointer is likely to come back to the same point. Easily catchable with a false
117 thread.
118
119 -------
120 LOOPING
121 -------
122 It is worth mentioning how many ticks different loop styles take.
123
124 If you have a loop of the style [A]B
125 (where A and B are sections of code)
126 It will run like so (where every character that isn't A or B is a tick):
127 [A][A][A][B...
128
129 If you have a loop of the style {A}B
130 It will run like so
131 {A}{A}{A}{B...
132
133 However, if you have a loop of the style A:B;C
134 It will run like so
135 A:B;B;B;B;B;B...
136 C...
137
138 Important to note is that while [ and { will take a tick every loop, : will take a tick only on the
139 first loop.
140
141 Where loops are unmatched, any applicable jump will be skipped. That is, in a situation like:
142 [A[B]
143 , where the [ before A doesn't have a match, if it hit that [ and decided to jump, it would not.
144 It would run like this:
145 [A[B][B][B].....
146 in either situation.
147 The situation is similar for ending brackets. This:
148 [A]B]C
149 would run like this:
150 [A][A][A]...B]C
151
152 If you produce a : somewhere where one has already existed, it's "spent" status will be maintained.
153 That is, if one program did this:
154 :A;B
155 , and later, the second program turned that into this:
156 %A;B
157 , then yet later, the second program turned it back into:
158 :A;B
159 , the : before the A would still be spent, and would not fork again. If a : is produced somewhere
160 where there was not one before, it defaults to unspent.