Difference between revisions of "Ocnirp/Source Code"
< Ocnirp
Jump to navigation
Jump to search
m (source code of 1.4) |
RednaxelaBot (talk | contribs) m (Using <syntaxhighlight>.) |
||
(2 intermediate revisions by one other user not shown) | |||
Line 6: | Line 6: | ||
}} | }} | ||
---- | ---- | ||
− | < | + | <syntaxhighlight> |
package nat.nano; | package nat.nano; | ||
Line 16: | Line 16: | ||
/** | /** | ||
* Ocnirp - a robot by Nat Pavasant | * Ocnirp - a robot by Nat Pavasant | ||
+ | * | ||
* "Battle for the one-on-one nano-bot crown!" | * "Battle for the one-on-one nano-bot crown!" | ||
* | * | ||
Line 22: | Line 23: | ||
*/ | */ | ||
public final class Ocnirp extends AdvancedRobot { | public final class Ocnirp extends AdvancedRobot { | ||
− | private static final int PATTERN_DEPTH = | + | package nat.nano; |
− | private static final double | + | |
− | private static final double | + | import robocode.AdvancedRobot; |
+ | import robocode.HitWallEvent; | ||
+ | import robocode.ScannedRobotEvent; | ||
+ | import robocode.util.Utils; | ||
+ | |||
+ | /** | ||
+ | * Ocnirp - a robot by Nat Pavasant | ||
+ | * | ||
+ | * "Battle for the one-on-one nano-bot crown!" | ||
+ | * | ||
+ | * @version 1.61 | ||
+ | * @author Nat Pavasant | ||
+ | */ | ||
+ | @SuppressWarnings("unused") | ||
+ | public final class Ocnirp extends AdvancedRobot { | ||
+ | /** | ||
+ | * Size of pattern to match. 45 is the maximum value or robot will skip a | ||
+ | * turn in unacceptable rate. 30 is a standard value. | ||
+ | */ | ||
+ | private static final int PATTERN_DEPTH = 30; | ||
+ | |||
+ | /** | ||
+ | * If Math.random() exceed this number, the robot will change the direction. | ||
+ | */ | ||
+ | private static final double CHANGE_INTERVAL = 0.92; | ||
+ | |||
+ | /** | ||
+ | * Preferred distance between this robot and enemy. | ||
+ | */ | ||
+ | private static final double PREFERRED_DISTANCE = 180d; | ||
+ | |||
+ | /** | ||
+ | * Fire power, it used to be 2.5, but my crazy part of my brain told me to | ||
+ | * reduce this a bit. | ||
+ | */ | ||
private static final double FIRE_POWER = 2.4433565d; | private static final double FIRE_POWER = 2.4433565d; | ||
+ | |||
+ | /** | ||
+ | * Bullet velocity. It should be {@code 20 - 3 * FIRE_POWER}, but my crazy | ||
+ | * part of my brain told me to leave this 12.5 | ||
+ | */ | ||
private static final double BULLET_VELOCITY = 12.5d; | private static final double BULLET_VELOCITY = 12.5d; | ||
+ | |||
+ | /** | ||
+ | * Distance offset to turn | ||
+ | */ | ||
private static final double DISTANCE_OFFSET = 0.38435d; | private static final double DISTANCE_OFFSET = 0.38435d; | ||
+ | |||
+ | /** | ||
+ | * Distance offset to turn | ||
+ | */ | ||
+ | private static final double DISTANCE_CONTROLLER = 237.5; | ||
+ | |||
+ | /** | ||
+ | * Velocity trick multiplier, make this higher will make more change that | ||
+ | * robot will move at max velocity | ||
+ | */ | ||
private static final double VELOCITY_MULTIPILER = 17.78456345d; | private static final double VELOCITY_MULTIPILER = 17.78456345d; | ||
− | |||
− | static int | + | /** |
− | static | + | * Hard-coded bullet fight time make a code much smaller since my distance |
+ | * controller control all the distance. | ||
+ | */ | ||
+ | private static final int BFT = (int) (PREFERRED_DISTANCE / BULLET_VELOCITY + 2); | ||
+ | |||
+ | /** | ||
+ | * A static variable to keep which direction it is moving. | ||
+ | */ | ||
+ | private static int dir = 100; | ||
+ | /** | ||
+ | * Main robot method. For nanobot, this contains only radar control. | ||
+ | */ | ||
public void run() { | public void run() { | ||
− | // setAdjustGunForRobotTurn(true); | + | /* |
+ | * Performance Enhancing Bug! Have this cost 10 bytes and make me lose | ||
+ | * score. | ||
+ | */ | ||
+ | setAdjustGunForRobotTurn(true); | ||
// setAdjustRadarForGunTurn(true); | // setAdjustRadarForGunTurn(true); | ||
− | + | turnRadarRightRadians(Double.POSITIVE_INFINITY); | |
} | } | ||
+ | /** | ||
+ | * What to do when you see another robot. | ||
+ | * | ||
+ | * Main robot operation method for almost all nano/micro/mini robots. | ||
+ | */ | ||
public void onScannedRobot(ScannedRobotEvent e) { | public void onScannedRobot(ScannedRobotEvent e) { | ||
− | int matchLen = PATTERN_DEPTH; | + | /* |
− | double angle; | + | * Variable order here is important. We can save ~3-4 bytes here. since |
− | double dist; | + | * all math operation must be done on registers. Java virtual machine |
− | int matchPos; | + | * has 4 register slot. First register will be taken by {@code this} |
+ | * object. Then each parameters will take the rest of registers. If | ||
+ | * there are any registers left, the variables defined in the method is | ||
+ | * filled the register until it full. Every type will take 1 registers | ||
+ | * except double, which take 2. If double is the fourth variable | ||
+ | * defined, it will overflow to the extra fifth register. | ||
+ | * | ||
+ | * So, the most | ||
+ | * used variable should define first, which will be enemy absolute | ||
+ | * bearing in most cases. In this case, we define most used int before | ||
+ | * and make double overflow its register. | ||
+ | */ | ||
+ | int matchLen = PATTERN_DEPTH; // PM Stuff | ||
+ | double angle; // enemy absolute bearing | ||
+ | double dist; // enemy distance | ||
+ | int matchPos; // PM Stuff | ||
− | + | // /////////////////////////////////////////////////////////////////////////////// | |
+ | // Radar | ||
+ | // | ||
+ | // Do infinity lock | ||
setTurnRadarLeftRadians(getRadarTurnRemaining()); | setTurnRadarLeftRadians(getRadarTurnRemaining()); | ||
− | + | // /////////////////////////////////////////////////////////////////////////////// | |
− | + | ||
− | + | // /////////////////////////////////////////////////////////////////////////////// | |
− | + | // Movement (Perpendicular and Random with distance control) | |
− | + | // | |
− | + | // Turn perpendicular to an enemy, and add/deduct the angle a bit to | |
− | + | // control the distance | |
+ | // | ||
+ | // setTurnRightRadians( | ||
+ | // Math.cos(angle = e.getBearingRadians()) | ||
+ | // - Math.signum( | ||
+ | // getVelocity() * ((dist = e.getDistance()) - PREFERRED_DISTANCE) | ||
+ | // ) * DISTANCE_OFFSET); | ||
+ | // setTurnRightRadians(Math.cos( | ||
+ | // (angle = e.getBearingRadians()) | ||
+ | // - ((dist = e.getDistance()) - PREFERRED_DISTANCE) | ||
+ | // * getVelocity() / DISTANCE_CONTROLLER | ||
+ | // )); | ||
+ | // No distance controller | ||
+ | setTurnRightRadians(Math.cos(angle = e.getBearingRadians())); | ||
+ | // | ||
+ | // Move ahead | ||
+ | // | ||
setAhead(dir); | setAhead(dir); | ||
− | + | // | |
− | + | // If random() exceed the change interval | |
− | if (Math.random() > | + | // |
+ | if (Math.random() > CHANGE_INTERVAL) { | ||
+ | // | ||
+ | // Reverse direction | ||
+ | // Optimize to | ||
+ | // | ||
onHitWall(null); | onHitWall(null); | ||
− | + | // | |
− | + | // Velocity trick | |
− | setMaxVelocity(Math.random() * VELOCITY_MULTIPILER + 1); | + | //setMaxVelocity(Math.random() * VELOCITY_MULTIPILER + 1); |
− | + | // | |
} | } | ||
− | + | // | |
− | + | // /////////////////////////////////////////////////////////////////////////////// | |
+ | |||
+ | // /////////////////////////////////////////////////////////////////////////////// | ||
+ | // Eric Simonton's Lateral Velocity Pattern Matching Gun | ||
+ | // | ||
+ | // Define counter | ||
+ | // | ||
int i; | int i; | ||
+ | // | ||
+ | // Append enemy log | ||
+ | // | ||
enemyHistory = String.valueOf( | enemyHistory = String.valueOf( | ||
− | (char) | + | (char) Math.round( 2 * (e.getVelocity() * Math.sin(e |
+ | .getHeadingRadians() | ||
- (angle += getHeadingRadians()))))).concat( | - (angle += getHeadingRadians()))))).concat( | ||
enemyHistory); | enemyHistory); | ||
− | while ((matchPos = enemyHistory | + | // |
− | + | // Match the history | |
− | + | // | |
− | + | while ((matchPos = enemyHistory.indexOf(enemyHistory.substring(0, | |
+ | matchLen--), i = (int) (((dist = e.getDistance()) / 12.5D) - 1))) < 0) | ||
; | ; | ||
+ | // | ||
+ | // Get the firing angle | ||
+ | // | ||
do | do | ||
− | angle += (short) enemyHistory.charAt(--matchPos) / dist/ | + | angle += |
+ | Math.asin | ||
+ | ((short) enemyHistory.charAt(--matchPos) / dist | ||
+ | / 2d ); | ||
while (--i > 0); | while (--i > 0); | ||
+ | // | ||
+ | // Turn the gun | ||
+ | // | ||
setTurnGunRightRadians(Utils.normalRelativeAngle(angle | setTurnGunRightRadians(Utils.normalRelativeAngle(angle | ||
- getGunHeadingRadians())); | - getGunHeadingRadians())); | ||
− | + | // | |
− | // | + | // Fire |
+ | // | ||
+ | //if (dist < 100) setFire(3d); | ||
+ | //else | ||
setFire(FIRE_POWER); | setFire(FIRE_POWER); | ||
+ | // | ||
+ | // /////////////////////////////////////////////////////////////////////////////// | ||
} | } | ||
+ | /** | ||
+ | * When hit wall, reverse direction | ||
+ | */ | ||
public void onHitWall(HitWallEvent e) { | public void onHitWall(HitWallEvent e) { | ||
dir = -dir; | dir = -dir; | ||
} | } | ||
− | static String enemyHistory = "" | + | /** |
+ | * Enemy history string. Preload to prevent StringIndexOutOfBoundException. | ||
+ | */ | ||
+ | private static String enemyHistory = "" + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
Line 105: | Line 248: | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
− | + (char) 0 + (char) | + | + (char) 0 + (char) 0 + (char) 1 + (char) 0 + (char) 0 + (char) 0 |
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
Line 119: | Line 262: | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
− | + (char) 0 + (char) | + | + (char) 0 + (char) 0 + (char) 2 + (char) 0 + (char) 0 + (char) 0 |
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
Line 133: | Line 276: | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
− | + (char) 0 + (char) | + | + (char) 0 + (char) 0 + (char) -1 + (char) 0 + (char) 0 + (char) 0 |
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
Line 147: | Line 290: | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 | ||
− | + (char) 0 + (char) 0 + (char) 0 + (char) -2 + (char) -4 | + | + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) -2 + (char) -4 |
+ (char) -6 + (char) -8 + (char) -8 + (char) -8 + (char) -8 | + (char) -6 + (char) -8 + (char) -8 + (char) -8 + (char) -8 | ||
+ (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8 | + (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8 | ||
Line 168: | Line 311: | ||
+ (char) 2 + (char) 1 + (char) 0; | + (char) 2 + (char) 1 + (char) 0; | ||
} | } | ||
− | </ | + | |
+ | </syntaxhighlight> |
Latest revision as of 09:30, 1 July 2010
- Ocnirp Sub-pages:
- Ocnirp - Version History - Source Code
package nat.nano;
import robocode.AdvancedRobot;
import robocode.HitWallEvent;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
/**
* Ocnirp - a robot by Nat Pavasant
*
* "Battle for the one-on-one nano-bot crown!"
*
* @version 1.4
* @author Nat Pavasant
*/
public final class Ocnirp extends AdvancedRobot {
package nat.nano;
import robocode.AdvancedRobot;
import robocode.HitWallEvent;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
/**
* Ocnirp - a robot by Nat Pavasant
*
* "Battle for the one-on-one nano-bot crown!"
*
* @version 1.61
* @author Nat Pavasant
*/
@SuppressWarnings("unused")
public final class Ocnirp extends AdvancedRobot {
/**
* Size of pattern to match. 45 is the maximum value or robot will skip a
* turn in unacceptable rate. 30 is a standard value.
*/
private static final int PATTERN_DEPTH = 30;
/**
* If Math.random() exceed this number, the robot will change the direction.
*/
private static final double CHANGE_INTERVAL = 0.92;
/**
* Preferred distance between this robot and enemy.
*/
private static final double PREFERRED_DISTANCE = 180d;
/**
* Fire power, it used to be 2.5, but my crazy part of my brain told me to
* reduce this a bit.
*/
private static final double FIRE_POWER = 2.4433565d;
/**
* Bullet velocity. It should be {@code 20 - 3 * FIRE_POWER}, but my crazy
* part of my brain told me to leave this 12.5
*/
private static final double BULLET_VELOCITY = 12.5d;
/**
* Distance offset to turn
*/
private static final double DISTANCE_OFFSET = 0.38435d;
/**
* Distance offset to turn
*/
private static final double DISTANCE_CONTROLLER = 237.5;
/**
* Velocity trick multiplier, make this higher will make more change that
* robot will move at max velocity
*/
private static final double VELOCITY_MULTIPILER = 17.78456345d;
/**
* Hard-coded bullet fight time make a code much smaller since my distance
* controller control all the distance.
*/
private static final int BFT = (int) (PREFERRED_DISTANCE / BULLET_VELOCITY + 2);
/**
* A static variable to keep which direction it is moving.
*/
private static int dir = 100;
/**
* Main robot method. For nanobot, this contains only radar control.
*/
public void run() {
/*
* Performance Enhancing Bug! Have this cost 10 bytes and make me lose
* score.
*/
setAdjustGunForRobotTurn(true);
// setAdjustRadarForGunTurn(true);
turnRadarRightRadians(Double.POSITIVE_INFINITY);
}
/**
* What to do when you see another robot.
*
* Main robot operation method for almost all nano/micro/mini robots.
*/
public void onScannedRobot(ScannedRobotEvent e) {
/*
* Variable order here is important. We can save ~3-4 bytes here. since
* all math operation must be done on registers. Java virtual machine
* has 4 register slot. First register will be taken by {@code this}
* object. Then each parameters will take the rest of registers. If
* there are any registers left, the variables defined in the method is
* filled the register until it full. Every type will take 1 registers
* except double, which take 2. If double is the fourth variable
* defined, it will overflow to the extra fifth register.
*
* So, the most
* used variable should define first, which will be enemy absolute
* bearing in most cases. In this case, we define most used int before
* and make double overflow its register.
*/
int matchLen = PATTERN_DEPTH; // PM Stuff
double angle; // enemy absolute bearing
double dist; // enemy distance
int matchPos; // PM Stuff
// ///////////////////////////////////////////////////////////////////////////////
// Radar
//
// Do infinity lock
setTurnRadarLeftRadians(getRadarTurnRemaining());
// ///////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
// Movement (Perpendicular and Random with distance control)
//
// Turn perpendicular to an enemy, and add/deduct the angle a bit to
// control the distance
//
// setTurnRightRadians(
// Math.cos(angle = e.getBearingRadians())
// - Math.signum(
// getVelocity() * ((dist = e.getDistance()) - PREFERRED_DISTANCE)
// ) * DISTANCE_OFFSET);
// setTurnRightRadians(Math.cos(
// (angle = e.getBearingRadians())
// - ((dist = e.getDistance()) - PREFERRED_DISTANCE)
// * getVelocity() / DISTANCE_CONTROLLER
// ));
// No distance controller
setTurnRightRadians(Math.cos(angle = e.getBearingRadians()));
//
// Move ahead
//
setAhead(dir);
//
// If random() exceed the change interval
//
if (Math.random() > CHANGE_INTERVAL) {
//
// Reverse direction
// Optimize to
//
onHitWall(null);
//
// Velocity trick
//setMaxVelocity(Math.random() * VELOCITY_MULTIPILER + 1);
//
}
//
// ///////////////////////////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////////////////////////////
// Eric Simonton's Lateral Velocity Pattern Matching Gun
//
// Define counter
//
int i;
//
// Append enemy log
//
enemyHistory = String.valueOf(
(char) Math.round( 2 * (e.getVelocity() * Math.sin(e
.getHeadingRadians()
- (angle += getHeadingRadians()))))).concat(
enemyHistory);
//
// Match the history
//
while ((matchPos = enemyHistory.indexOf(enemyHistory.substring(0,
matchLen--), i = (int) (((dist = e.getDistance()) / 12.5D) - 1))) < 0)
;
//
// Get the firing angle
//
do
angle +=
Math.asin
((short) enemyHistory.charAt(--matchPos) / dist
/ 2d );
while (--i > 0);
//
// Turn the gun
//
setTurnGunRightRadians(Utils.normalRelativeAngle(angle
- getGunHeadingRadians()));
//
// Fire
//
//if (dist < 100) setFire(3d);
//else
setFire(FIRE_POWER);
//
// ///////////////////////////////////////////////////////////////////////////////
}
/**
* When hit wall, reverse direction
*/
public void onHitWall(HitWallEvent e) {
dir = -dir;
}
/**
* Enemy history string. Preload to prevent StringIndexOutOfBoundException.
*/
private static String enemyHistory = "" + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 1 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 2 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) -1 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) 0
+ (char) 0 + (char) 0 + (char) 0 + (char) 0 + (char) -2 + (char) -4
+ (char) -6 + (char) -8 + (char) -8 + (char) -8 + (char) -8
+ (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8
+ (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8
+ (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8
+ (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8
+ (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8
+ (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8
+ (char) -8 + (char) -8 + (char) -8 + (char) -8 + (char) -8
+ (char) -8 + (char) -7 + (char) -6 + (char) -5 + (char) -4
+ (char) -3 + (char) -2 + (char) -1 + (char) 0 + (char) 2
+ (char) 4 + (char) 6 + (char) 8 + (char) 8 + (char) 8 + (char) 8
+ (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8
+ (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8
+ (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8
+ (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8
+ (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8
+ (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8 + (char) 8
+ (char) 8 + (char) 7 + (char) 6 + (char) 5 + (char) 4 + (char) 3
+ (char) 2 + (char) 1 + (char) 0;
}