var CHAR_ROOT = 'A'.charCodeAt( 0 ); var CHAR_HASH = {}; for( var ypos = 0; ypos < 15; ypos ++ ){ for( var xpos = 0; xpos < 15; xpos ++ ){ CHAR_HASH[ String.fromCharCode( CHAR_ROOT + xpos, CHAR_ROOT + ypos ) ] = [ xpos, ypos ]; } } //==================================================== // get key from GemLine //==================================================== function getKeyFromGemLine( gemLine ){ //-------------------------- cut subline if( gemLine.match( /^([A-Za-z][0-9][A-O]{2})+/ ) ){ gemLine = RegExp.lastMatch; } //-------------------------- angle x 8 var MAX_KEY = ""; for( var angle = 0; angle < 8; angle ++ ){ var Xmin = 15, Ymin = 15; var GEM_LIST = []; var len = gemLine.length; for( var pos = 0; pos < len; pos += 4 ){ var xp = gemLine.charCodeAt( pos + 2 ) - CHAR_ROOT; var yp = gemLine.charCodeAt( pos + 3 ) - CHAR_ROOT; if( angle & 1 ){ xp = 14 - xp; } if( angle & 2 ){ yp = 14 - yp; } if( angle & 4 ){ var temp = xp; xp = yp; yp = temp; } GEM_LIST = GEM_LIST.concat( [ { X : xp, Y : yp, // T : gemLine.charAt( pos ) < 'a' ? 1 : -1 T : ( gemLine.charAt( pos ) < 'a' && gemLine.charAt( pos ) != '^' ) ? 1 : -1 } ] ); Xmin = Math.min( Xmin, xp ); Ymin = Math.min( Ymin, yp ); } //-------------------------------- get key about $transGemLine var keyList = []; var checkKey = []; for( var Gnum in GEM_LIST ){ with( GEM_LIST[ Gnum ] ){ var key = T * ( X - Xmin + 1 + ( Y - Ymin + 1 ) * 16 ); } if( !checkKey[ key ] ){ keyList = keyList.concat( [ key ] ); checkKey[ key ] = true; } } var makeKey = keyList.sort().join( "," ); if( MAX_KEY < makeKey ){ MAX_KEY = makeKey; } } return MAX_KEY; } //--------------------------------- // trans pos by sym //--------------------------------- function transSymAxis( baseGemLine, G4a, G4b, G5 ){ if( G4a == G4b ){ return G5; } //------------------------ get pos A1,a2,A3,a4(,A5) var Xmin = 15, Ymin = 15; var Xmax = 0, Ymax = 0; for( var pos = 0; pos < baseGemLine.length; pos += 4 ){ var xp = baseGemLine.charCodeAt( pos + 2 ) - CHAR_ROOT; var yp = baseGemLine.charCodeAt( pos + 3 ) - CHAR_ROOT; Xmin = Math.min( Xmin, xp ); Ymin = Math.min( Ymin, yp ); Xmax = Math.max( Xmax, xp ); Ymax = Math.max( Ymax, yp ); } var Xcen = ( Xmax + Xmin ) / 2; var Ycen = ( Ymax + Ymin ) / 2; var sub = [ ( G4a.charCodeAt( 2 ) - CHAR_ROOT + G4b.charCodeAt( 2 ) - CHAR_ROOT ) / 2 - Xcen, ( G4a.charCodeAt( 3 ) - CHAR_ROOT + G4b.charCodeAt( 3 ) - CHAR_ROOT ) / 2 - Ycen ]; var gem5X = G5.charCodeAt( 2 ) - CHAR_ROOT; var gem5Y = G5.charCodeAt( 3 ) - CHAR_ROOT; if( baseGemLine == 'A1HHa2HGA3IG' && G4a == 'a4GI' ){ var setG5 = ""; if( sub[ 0 ] * sub[ 1 ] ){ if( 0 < sub[ 0 ] * sub[ 1 ] ){ setG5 = "+:" + G5.substr( 0, 2 ) + String.fromCharCode( CHAR_ROOT + Xcen + gem5Y - Ycen, CHAR_ROOT + Ycen + gem5X - Xcen ); }else{ setG5 = "-:" + G5.substr( 0, 2 ) + String.fromCharCode( CHAR_ROOT + Xcen - gem5Y + Ycen, CHAR_ROOT + Ycen - gem5X + Xcen ); } }else{ setG5 = "0:" + G5.substr( 0, 2 ) + String.fromCharCode( CHAR_ROOT + ( sub[ 0 ] ? gem5X : Xcen * 2 - gem5X ), CHAR_ROOT + ( sub[ 1 ] ? gem5Y : Ycen * 2 - gem5Y ) ); } alert( '????? A1HHa2HGA3IG' + "\n" + G4a + "\n" + G4b + "\n" + "[" + gem5X + "," + gem5Y + "]" + "\n" + G5 + "\n" + setG5 ); } if( sub[ 0 ] * sub[ 1 ] ){ if( 0 < sub[ 0 ] * sub[ 1 ] ){ return G5.substr( 0, 2 ) + String.fromCharCode( CHAR_ROOT + Xcen + gem5Y - Ycen, CHAR_ROOT + Ycen + gem5X - Xcen ); }else{ return G5.substr( 0, 2 ) + String.fromCharCode( CHAR_ROOT + Xcen - gem5Y + Ycen, CHAR_ROOT + Ycen - gem5X + Xcen ); } }else{ return G5.substr( 0, 2 ) + String.fromCharCode( CHAR_ROOT + ( sub[ 0 ] ? gem5X : Xcen * 2 - gem5X ), CHAR_ROOT + ( sub[ 1 ] ? gem5Y : Ycen * 2 - gem5Y ) ); } } //-------------------------------------- // get symmetrical list //-------------------------------------- function getSymList( baseGemLine, targetGem ){ //var debug = baseGemLine == 'A1HHa2HGA3IG' && targetGem == 'a4HI'; // //-------------------------- cut subline // if( baseGemLine.match( /^([A-Za-z][0-9][A-O]{2})+/ ) ){ // baseGemLine = RegExp.lastMatch; // } //------------------------ get pos A1,a2,A3,a4(,A5) var Xmin = 15, Ymin = 15; var Xmax = 0, Ymax = 0; var len = baseGemLine.length; for( var pos = 0; pos < len; pos += 4 ){ var xp = baseGemLine.charCodeAt( pos + 2 ) - CHAR_ROOT; var yp = baseGemLine.charCodeAt( pos + 3 ) - CHAR_ROOT; Xmin = Math.min( Xmin, xp ); Ymin = Math.min( Ymin, yp ); Xmax = Math.max( Xmax, xp ); Ymax = Math.max( Ymax, yp ); } var Xcen = ( Xmax + Xmin ) / 2; var Ycen = ( Ymax + Ymin ) / 2; //------------------------- get last gem var lastTurn = targetGem < 'a'; var last = [ targetGem.charCodeAt( 2 ) - CHAR_ROOT, targetGem.charCodeAt( 3 ) - CHAR_ROOT ]; //------------------------- get delta var sub = [ last[ 0 ] - Xcen, last[ 1 ] - Ycen, ]; //------------------------- sift out from possible symmetrical pos var symList = []; var checkList = []; var firstFlag = true; var baseKey = ""; var baseFrom1st = 0; var symBase = [ [ Xcen + sub[0], Ycen + sub[1] ], [ Xcen + sub[0], Ycen - sub[1] ], [ Xcen - sub[0], Ycen + sub[1] ], [ Xcen - sub[0], Ycen - sub[1] ], [ Xcen + sub[1], Ycen + sub[0] ], [ Xcen + sub[1], Ycen - sub[0] ], [ Xcen - sub[1], Ycen + sub[0] ], [ Xcen - sub[1], Ycen - sub[0] ] ]; for( var SYnum in symBase ){ var sym = symBase[ SYnum ]; //---------------------------------- out on axis if( Math.floor( sym[ 0 ] ) < sym[ 0 ] || Math.floor( sym[ 1 ] ) < sym[ 1 ] ){ continue; } //---------------------- first sym is for check var checkKey = getKeyFromGemLine( baseGemLine + ( lastTurn ? "A0" : "a0" ) + String.fromCharCode( CHAR_ROOT + sym[ 0 ], CHAR_ROOT + sym[ 1 ] ) ); var disFrom1st = Math.pow( sym[ 0 ] - 7, 2 ) + Math.pow( sym[ 1 ] - 7, 2 ); if( firstFlag ){ baseKey = checkKey; baseFrom1st = disFrom1st; firstFlag = false; } //------------------------- check if( checkKey == baseKey ){ checkPos = sym.join( "," ); if( !checkList[ checkPos ] ){ symList = symList.concat( [ { GEM : String.fromCharCode( CHAR_ROOT + sym[ 0 ], CHAR_ROOT + sym[ 1 ] ), SAME : baseFrom1st == disFrom1st } ] ); checkList[ checkPos ] = 1; } } } return symList; } //-------------------------------------- // get trans list from other //-------------------------------------- function getTransListFromOther( orgBase, transGems, targetLine ){ //-------------------------- make target rareKey var posList = []; var Xmin = 15, Ymin = 15; var Xmax = 0, Ymax = 0; var len = targetLine.length; for( var pos = 0; pos < len; pos += 4 ){ var xp = targetLine.charCodeAt( pos + 2 ) - CHAR_ROOT; var yp = targetLine.charCodeAt( pos + 3 ) - CHAR_ROOT; posList = posList.concat( [ { X : xp, Y : yp, T : targetLine.charAt( pos ) < 'a' ? 1 : -1 } ] ); Xmin = Math.min( Xmin, xp ); Ymin = Math.min( Ymin, yp ); Xmax = Math.max( Xmax, xp ); Ymax = Math.max( Ymax, yp ); } var targetCen = [ ( Xmax + Xmin ) / 2, ( Ymax + Ymin ) / 2 ]; //-------------------------------- get key about $transGemLine var checkKey = {}; for( var Gnum in posList ){ with( posList[ Gnum ] ){ checkKey[ T * ( ( X - Xmin + 1 ) + ( Y - Ymin + 1 ) * 16 ) ] = true; } } for( var angle = 0; angle < 8; angle ++ ){ //------------------------------------------------------------- // need to make new posList each times // because "temppos = posList;" means not "create" //------------------------------------------------------------- var posList = []; for( var pos = 0; pos < orgBase.length; pos += 4 ){ posList = posList.concat( [ { X : orgBase.charCodeAt( pos + 2 ) - CHAR_ROOT, Y : orgBase.charCodeAt( pos + 3 ) - CHAR_ROOT, T : orgBase.charAt( pos ) < 'a' ? 1 : -1 } ] ); } var Xmin = 15, Ymin = 15; var Xmax = 0, Ymax = 0; //------------------ trans angle for( var pos in posList ){ if( angle & 1 ){ posList[ pos ].X = 14 - posList[ pos ].X; } if( angle & 2 ){ posList[ pos ].Y = 14 - posList[ pos ].Y; } if( angle & 4 ){ var temp = posList[ pos ].X; posList[ pos ].X = posList[ pos ].Y; posList[ pos ].Y = temp; } Xmin = Math.min( Xmin, posList[ pos ].X ); Ymin = Math.min( Ymin, posList[ pos ].Y ); Xmax = Math.max( Xmax, posList[ pos ].X ); Ymax = Math.max( Ymax, posList[ pos ].Y ); } //------------------- make rareKey var isMatch = true; for( var pos in posList ){ with( posList[ pos ] ){ if( !checkKey[ T * ( ( X - Xmin + 1 ) + ( Y - Ymin + 1 ) * 16 ) ] ){ isMatch = false; break; } } } /* if( orgBase == 'A1HHa2HGA3IGa4GI' && transGems == 'A5GG' ){ document.write( "
" ); document.write( "" + "

" + "" + "

" ); document.write( "
", posString );
	document.write( angleKeyLine + "\n" + targetKeyLine + "\n\n" + angle + "//" + isMatch );
	document.write( "
" ); } */ if( !isMatch ){ continue; } //---------------------------- // found match //---------------------------- var baseCen = [ ( Xmax + Xmin ) / 2, ( Ymax + Ymin ) / 2 ]; var resString = ""; for( var pos = 0; pos < transGems.length; pos += 4 ){ var xp = transGems.charCodeAt( pos + 2 ) - CHAR_ROOT; var yp = transGems.charCodeAt( pos + 3 ) - CHAR_ROOT; if( angle & 1 ){ xp = 14 - xp; } if( angle & 2 ){ yp = 14 - yp; } if( angle & 4 ){ var temp = xp; xp = yp; yp = temp; } resString += transGems.substr( pos, 2 ) + String.fromCharCode( CHAR_ROOT + xp - baseCen[ 0 ] + targetCen[ 0 ], CHAR_ROOT + yp - baseCen[ 1 ] + targetCen[ 1 ] ); } return resString; } return transGems; }