Difference between revisions of "Yatagan/Source"
< Yatagan
Jump to navigation
Jump to search
m (Next version.) |
m (→Latest Released Version (1.0.4): Updated to 1.0.5) |
||
Line 237: | Line 237: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == Latest Released Version (1.0. | + | == Latest Released Version (1.0.5) == |
Codesize: 249 | Codesize: 249 | ||
<syntaxhighlight> | <syntaxhighlight> | ||
/* | /* | ||
− | Yatagan 1.0. | + | Yatagan 1.0.5 by Sheldor & Skilgannon |
The yatagan is a short sabre which was used extensively in the Ottoman Empire. | The yatagan is a short sabre which was used extensively in the Ottoman Empire. | ||
Line 270: | Line 270: | ||
{ | { | ||
setAdjustGunForRobotTurn(true); | setAdjustGunForRobotTurn(true); | ||
− | + | ||
//Start spinning radar and initialize direction to infinity. | //Start spinning radar and initialize direction to infinity. | ||
setTurnRadarRightRadians(direction = Double.POSITIVE_INFINITY); | setTurnRadarRightRadians(direction = Double.POSITIVE_INFINITY); | ||
Line 278: | Line 278: | ||
{ | { | ||
//Local variables. | //Local variables. | ||
− | int integer = | + | int integer = 30; |
double absoluteBearing; | double absoluteBearing; | ||
double distance; | double distance; | ||
int matchPosition; | int matchPosition; | ||
− | + | ||
//Orbiting/Oscillating/Random movement, all depending on how big the number you multiply the random with is. | //Orbiting/Oscillating/Random movement, all depending on how big the number you multiply the random with is. | ||
if( (char) ((enemyEnergy - 1.09999999999 | if( (char) ((enemyEnergy - 1.09999999999 | ||
Line 291: | Line 291: | ||
} | } | ||
setAhead(direction); | setAhead(direction); | ||
− | + | ||
//Stay perpendicular to the enemy. | //Stay perpendicular to the enemy. | ||
− | setTurnRightRadians(Math.cos(absoluteBearing = e.getBearingRadians()) + ((160.0 - (distance = e.getDistance())) * (getVelocity() | + | setTurnRightRadians(Math.cos(absoluteBearing = e.getBearingRadians()) + ((160.0 - (distance = e.getDistance())) * (getVelocity() / 3000))); |
− | + | ||
//Pattern Matching. | //Pattern Matching. | ||
enemyHistory = String.valueOf((char) (e.getVelocity() * (Math.sin(e.getHeadingRadians() - (absoluteBearing += getHeadingRadians()))))).concat(enemyHistory); | enemyHistory = String.valueOf((char) (e.getVelocity() * (Math.sin(e.getHeadingRadians() - (absoluteBearing += getHeadingRadians()))))).concat(enemyHistory); | ||
− | + | ||
// search for a match | // search for a match | ||
− | while((matchPosition = enemyHistory.indexOf(enemyHistory.substring(0, integer | + | while((matchPosition = enemyHistory.indexOf(enemyHistory.substring(0, integer--), 64)) < 0); |
− | + | ||
integer = (int)(distance); | integer = (int)(distance); | ||
// calculate aim offset | // calculate aim offset | ||
− | + | ||
do { | do { | ||
absoluteBearing += ((short) enemyHistory.charAt(--matchPosition)) / distance; | absoluteBearing += ((short) enemyHistory.charAt(--matchPosition)) / distance; | ||
− | } while ((integer -= | + | } while ((integer -= 12) > 0); |
− | + | ||
//Aim at the predicted target. | //Aim at the predicted target. | ||
setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians())); | setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians())); | ||
− | + | ||
//Fire! | //Fire! | ||
− | setFire( | + | setFire(2.6666666666666666666666666666666666666666666666); |
− | + | ||
//Infinite radar lock. | //Infinite radar lock. | ||
setTurnRadarLeftRadians(getRadarTurnRemainingRadians()); | setTurnRadarLeftRadians(getRadarTurnRemainingRadians()); | ||
Line 331: | Line 331: | ||
//chance out of 3 for given number of deaths, 'final' saves a few bytes | //chance out of 3 for given number of deaths, 'final' saves a few bytes | ||
private static final String chancesOfReversing = "" | private static final String chancesOfReversing = "" | ||
− | + (char)60000 + (char)0 + (char)60000 + (char) 0 | + | + (char)60000 + (char)0 + (char)60000 + (char) 0 + (char)60000 + (char)0 |
//100 rounds of deaths, should be enough? | //100 rounds of deaths, should be enough? | ||
// range which will produce 'bullet hit': 3.0999 - 0.0999 = 3 | // range which will produce 'bullet hit': 3.0999 - 0.0999 = 3 |
Revision as of 13:37, 23 March 2013
Development Version
Codesize: 249
/*
Yatagan 1.0.6 by Sheldor & Skilgannon; Release date: 03/23/2013
The yatagan is a short sabre which was used extensively in the Ottoman Empire.
Codesize: 249 bytes without any colors
Credits:
Pattern Matching code from simonton.WeekendObsession_S and mld.Moebius, heavily modified.
And a general thanks to all open source bot authors and contributors to the RoboWiki.
Yatagan is open source and released under the terms of the RoboWiki Public Code License (RWPCL) - Version 1.1
see license here: http://robowiki.net/wiki/RWPCL
*/
package sheldor.jk;
import robocode.*;
import robocode.util.Utils;
public class Yatagan extends AdvancedRobot
{
//Global variables.
static double direction;
static double enemyEnergy;
static int deathCount;
public void run()
{
setAdjustGunForRobotTurn(true);
//Start spinning radar and initialize direction to infinity.
setTurnRadarRightRadians(direction = Double.POSITIVE_INFINITY);
}
public void onScannedRobot(ScannedRobotEvent e)
{
//Local variables.
int integer = 30;
double absoluteBearing;
double distance;
int matchPosition;
//Orbiting/Oscillating/Random movement, all depending on how big the number you multiply the random with is.
if( (char) ((enemyEnergy - 1.09999999999
+ chancesOfReversing.charAt(deathCount)*Math.random()
- (enemyEnergy = e.getEnergy()))) <= 1 )
{
onHitWall(null);
}
setAhead(direction);
//Stay perpendicular to the enemy.
setTurnRightRadians(Math.cos(absoluteBearing = e.getBearingRadians()) + ((160.0 - (distance = e.getDistance())) * (getVelocity() / 3000)));
//Pattern Matching.
enemyHistory = String.valueOf((char) (e.getVelocity() * (Math.sin(e.getHeadingRadians() - (absoluteBearing += getHeadingRadians()))))).concat(enemyHistory);
// search for a match
while((matchPosition = enemyHistory.indexOf(enemyHistory.substring(0, integer--), 64)) < 0);
integer = (int)(distance);
// calculate aim offset
do {
absoluteBearing += ((short) enemyHistory.charAt(--matchPosition)) / distance;
} while ((integer -= 12) > 0);
//Aim at the predicted target.
setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians()));
//Fire!
//Bullet power must be a multiple of 0.33333... or else the gun will be inaccurate.
setFire(2.666666666666666666666666666666666666666666666666666666666666666666666666666666666666);
//Infinite radar lock.
setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
}
public void onDeath(DeathEvent e)
{
deathCount++;
}
public void onHitWall(HitWallEvent e)
{
//Reverse direction when the bot hits a wall.
direction = -direction;
}
//The chance that Yatagan will reverse direction when the enemy fires.
//Since this is an unchanging table, we can use 'final' to save a few bytes.
private static final String chancesOfReversing = ""
+ (char)60000 + (char)0 + (char)60000 + (char) 0 +
//100 rounds of deaths, should be enough?
// range which will produce 'bullet hit': 3.0999 - 0.0999 = 3
//required reverse probability, from Toorkild's formula: 0.6*sqrt((20 - 3*2.5)/160) - 0.04 ~= 0.125
//thus 3/x = 0.125 --> x = 3/0.125 = 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24;
//Preloaded log of enemy movements for pattern matcher so it doesn't need error checking.
static String enemyHistory = ""
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 2
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (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)1
+ (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) 1;
}
Latest Released Version (1.0.5)
Codesize: 249
/*
Yatagan 1.0.5 by Sheldor & Skilgannon
The yatagan is a short sabre which was used extensively in the Ottoman Empire.
Credits:
Pattern Matching code from simonton.WeekendObsession_S and mld.Moebius, heavily modified,
and a general thanks to all open source bot authors and contributors to the RoboWiki.
Yatagan is open source and released under the terms of the RoboWiki Public Code License (RWPCL) - Version 1.1
see license here: http://robowiki.net/wiki/RWPCL
*/
package sheldor.jk;
import robocode.*;
import robocode.util.Utils;
public class Yatagan extends AdvancedRobot
{
//Global variables.
static double direction;
static double enemyEnergy;
static int deathCount;
//En garde!
public void run()
{
setAdjustGunForRobotTurn(true);
//Start spinning radar and initialize direction to infinity.
setTurnRadarRightRadians(direction = Double.POSITIVE_INFINITY);
}
public void onScannedRobot(ScannedRobotEvent e)
{
//Local variables.
int integer = 30;
double absoluteBearing;
double distance;
int matchPosition;
//Orbiting/Oscillating/Random movement, all depending on how big the number you multiply the random with is.
if( (char) ((enemyEnergy - 1.09999999999
+ chancesOfReversing.charAt(deathCount)*Math.random()
- (enemyEnergy = e.getEnergy()))) <= 1 )
{
onHitWall(null);
}
setAhead(direction);
//Stay perpendicular to the enemy.
setTurnRightRadians(Math.cos(absoluteBearing = e.getBearingRadians()) + ((160.0 - (distance = e.getDistance())) * (getVelocity() / 3000)));
//Pattern Matching.
enemyHistory = String.valueOf((char) (e.getVelocity() * (Math.sin(e.getHeadingRadians() - (absoluteBearing += getHeadingRadians()))))).concat(enemyHistory);
// search for a match
while((matchPosition = enemyHistory.indexOf(enemyHistory.substring(0, integer--), 64)) < 0);
integer = (int)(distance);
// calculate aim offset
do {
absoluteBearing += ((short) enemyHistory.charAt(--matchPosition)) / distance;
} while ((integer -= 12) > 0);
//Aim at the predicted target.
setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians()));
//Fire!
setFire(2.6666666666666666666666666666666666666666666666);
//Infinite radar lock.
setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
}
public void onDeath(DeathEvent e)
{
deathCount++;
}
public void onHitWall(HitWallEvent e)
{
//Reverse direction when the bot hits a wall.
direction = -direction;
}
//chance out of 3 for given number of deaths, 'final' saves a few bytes
private static final String chancesOfReversing = ""
+ (char)60000 + (char)0 + (char)60000 + (char) 0 + (char)60000 + (char)0
//100 rounds of deaths, should be enough?
// range which will produce 'bullet hit': 3.0999 - 0.0999 = 3
//required reverse probability, from Toorkild's formula: 0.6*sqrt((20 - 3*2.5)/160) - 0.04 ~= 0.125
//thus 3/x = 0.125 --> x = 3/0.125 = 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24
+ (char) 24 + (char) 24 + (char) 24 + (char) 24 + (char) 24;
//Preloaded log of enemy movements for pattern matcher so it doesn't need error checking
static String enemyHistory = ""
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 2
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (char) 1 + (char) 1 + (char) 1
+ (char) 1 + (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)1
+ (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) 1;
}