text, 'egc2011' ) === false ) { return true; } // expression to search for $regex = '/{egc2011(\s([^}]*(\\\\})*)*[^\\\\])?}/i'; // check whether plugin has been unpublished if ( !$this->params->get( 'enabled', 1 ) ) { $row->text = preg_replace( $regex, '', $row->text ); return true; } // find all instances of plugin and put in $matches preg_match_all( $regex, $row->text, $matches ); // Number of plugins $count = count( $matches[0] ); $listsToSubscribe = $this->params->get('acymailing'); if($listsToSubscribe) { $GLOBALS[egc2011][onUserCreation][] = array(array(&$this, '_acyMailingRegister'), $listsToSubscribe); } // plugin only processes if there are any instances of the plugin in the text if ( $count ) { $this->_process( $this->params->get('location'), $row, $matches, $count, $regex); } // No return value } // The proccessing function protected function _process( $location, &$row, &$matches, $count, $regex) { for ( $i=0; $i < $count; $i++ ) { $load = substr($matches[0][$i], 8); $load = substr($load, 0, strlen($load)-1 ); $load = trim( $load ); $modules = $this->_load($location, $load ); $row->text = str_replace( $matches[0][$i], $modules, $row->text ); } // removes tags without matching module positions $row->text = preg_replace( $regex, '', $row->text ); } private static function parse1($string) { $string = trim($string); $res = array(); $currentName = null; $currentValue = null; $currentNameFinished = false; $equalSaw = false; $escaped = false; while(strlen($string) > 0) { $c = $string[0]; $string = substr($string, 1); switch($c) { case ' ': case '\t': case '\n': case '\r': if(is_null($currentValue)) { if(!is_null($currentName) && !$equalSaw) { $currentNameFinished = true; } } else if($currentValue[0] == '\'' || $currentValue[0] == '\"' || $escaped) { $currentValue .= $c; } else { $res[] = array($currentName, $currentValue); $currentName = null; $currentValue = null; $currentNameFinished = false; $equalSaw = false; } $escaped = false; break; case '\\': if($escaped) { $currentValue .= $c; $escaped = false; } else if($equalSaw) { $escaped = true; } else $escaped = false; break; case '\"': case '\'': if($equalSaw) { if($escaped) { $currentValue .= $c; } else if($currentValue && $currentValue[0] == $c) { $currentValue .= $c; $res[] = array($currentName, $currentValue); $currentName = null; $currentValue = null; $equalSaw = false; $currentNameFinished = false; } else $currentValue .= $c; } else { } $escaped = false; break; case '=': if($equalSaw) { $currentValue .= $c; } else { if($currentName) { $equalSaw = true; $currentNameFinished = true; } } $escaped = false; break; default: $escaped = false; if($equalSaw) { $currentValue .= $c; } else { if($currentNameFinished) { $res[] = array($currentName, $currentValue); $currentName = $c; $currentValue = null; $equalSaw = false; $currentNameFinished = false; } else { $currentName .= $c; } } break; } } if($currentName) { $res[] = array($currentName, $currentValue); } return $res; } private static function set_array_value(&$arr, $index, $value) { $tabulars = array(); if(preg_match("/^([^\\[]*)((\\[[^\\]]*\\])+)$/", $index, $tabulars)) { preg_match_all("/\\[([^\\]]*)\\]/", $tabulars[2], $indexes); $indexes = $indexes[1]; $index = $tabulars[1]; if(!$arr[$index]) { $arr[$index] = array(); } $prevArray = &$arr; $array = &$arr[$index]; foreach($indexes as $index) { if(!$index) { array_push($array, array()); end($array); $index = key($array); } if(!$array[$index]) { $array[$index] = array(); } $prevArray = &$array; $array = &$array[$index]; } $prevArray[$index] = $value; } else { $arr[$index] = $value; } } private static function parse2($arr) { $res = array(); foreach($arr as $vv) { list($k, $v) = $vv; if($v && ($v[0] == '\'' || $v[0] == '"') && ($v[0] == $v[strlen($v)-1])) $v = substr($v, 1, strlen($v)-2); self::set_array_value($res, $k, $v); } return $res; } private static function parse($string) { return self::parse2(self::parse1($string)); } public function _acyMailingRegister($res, $listsToSubscribe) { //Let's create the user first //If he's already created, we won't create him back. if(!include_once(rtrim(JPATH_ADMINISTRATOR,DS).DS.'components'.DS.'com_acymailing'.DS.'helpers'.DS.'helper.php')) return; if(!($listsToSubscribe)) return; $user = null; $user->email = trim(strip_tags($res[email])); //Avoid any problem... $userHelper = acymailing::get('helper.user'); if(!$userHelper->validEmail($user->email)) return; if(!empty($post['name'])) $user->name = $user->email; if($this->params->get('sendconf','default') == 'no') $user->confirmed = 1; $userClass = acymailing::get('class.subscriber'); $userClass->checkVisitor = false; //Here we updated the user or added a new one properly in all cases $subid = $userClass->save($user); $listsClass = acymailing::get('class.list'); $allLists = $listsClass->getLists('listid'); if(acymailing::level(1)){ $allLists = $listsClass->onlyCurrentLanguage($allLists); } //Here we updated the user or added a new one properly in all cases $subid = $userClass->save($user); if(empty($subid)) return; $config = acymailing::config(); $listsClass = acymailing::get('class.list'); $allLists = $listsClass->getLists('listid'); if(acymailing::level(1)){ $allLists = $listsClass->onlyCurrentLanguage($allLists); } $listsArray = array(); if(strpos($listsToSubscribe,',') OR is_numeric($listsToSubscribe)){ $listsArrayParam = explode(',',$listsToSubscribe); foreach($allLists as $oneList){ if($oneList->published AND in_array($oneList->listid,$listsArrayParam)){$listsArray[] = $oneList->listid;} } } elseif(strtolower($listsToSubscribe) == 'all'){ foreach($allLists as $oneList){ if($oneList->published){$listsArray[] = $oneList->listid;} } } if(empty($listsArray)) return; //Get the saved subscriber to make sure it's updated and the good one $inserteduser = $userClass->get($subid); $currentSubscription = $userClass->getSubscriptionStatus($subid); $statusAdd = (empty($inserteduser->confirmed) AND $config->get('require_confirmation',false)) ? 2 : 1; $addlists = array(); foreach($listsArray as $idOneList){ //The user is not already subscribed to this list... so we add it if(!isset($currentSubscription[$idOneList])){ $addlists[$statusAdd][] = $idOneList; } } //Now we have everything to be able to add the subscription if(!empty($addlists)) { $listsubClass = acymailing::get('class.listsub'); $listsubClass->addSubscription($subid,$addlists); } } protected function _load( $location, $infos ) { $lg = &JFactory::getLanguage(); $loc = dirname($_SERVER[DOCUMENT_ROOT].$_SERVER[SCRIPT_NAME]); include_once($loc.$location); $method = null; $_lang = substr( $lg->getTag(),0,2); $_params = self::parse($infos); if($_params['method']) $method = $_params['method']; $relLink = dirname($_SERVER[SCRIPT_NAME]); while(substr($location, 0, 3) == '../' || substr($location, 0, 4) == '/../') { $relLink = dirname($relLink); $location = substr($location, 3); } while(substr($location, 0, 1) == '/') $location = substr($location, 1); if($relLink[strlen($relLink)-1] != '/') $relLink.="/"; $_params['rellink'] = $relLink.$location; $user =& JFactory::getUser(); if($user && !($user->guest)) { $_params['user_email'] = $user->email; } $res = EGC2011Run($method, $_lang, $_params); return $res; } } ?>



At the beginning of the second week, four special days will be dedicate to Computer-Go thanks to our partner of the Mogo project, a famous Go software well known for its performances and developed by Inria (National Institute for Research in Computer Science and Control) and the Paris-Sud University.


From Sunday 31st July onwards, top Go programs will compete over three days, in three categories: 9x9, 13x13 and 19x19.

Then on Wednesday, the winners of each category will play against professional players.

There will also be special activities on Go variants like Phantom Go, Blindfold Go and a lecture on recent progresses in Go software.

Online Computer-Go tournaments

No registration fee. No prize for winning, but winners in each tournament will be given the opportunity to play against strong players.

The tournament will be simple round-robin and double round-robin for the 9x9 (each game corresponding to a pair of programs being played twice, changing black and white).

The detailed planning is as follows:

  • The 19x19 games will be played on KGS the sunday, 31 (July 2011), starting at 9am.
  • The 9x9 games will be played on KGS the monday, 1st (August 2011), starting at 9am.
  • The 13x13 games will be played on KGS the tuesday, 2nd (August 2011), starting at 9am.

In case of equalities or missing time the day before, playoffs will be played the 3rd of August. Operators, or people delegated by the developpers, should be present in the dedicated room. Games against strong players will be played at that time.

List of registered participants:















Results : http://www.gokgs.com/tournList.jsp


Games between computers and professional

The following games will be played against humans:

  • The winner of the 9x9 computer tournament will be given the opportunity to play against a professional. No handicap, 2 games alternating black and white. Wednesday, at 10 am.
  • The winner of the 13x13 computer tournament will be given the opportunity to play against a professional. The handicap can be chosen by the operator of the program. Wednesday, at 1:30 - 2:30 pm.
  • The winner of the 19x19 computer tournament will be given the opportunity to play against a professional. The handicap can be chosen by the operator of the program. Wednesday, at 3 pm.

The games will be played in Chinese rules, following the rules mentioned below. A human operator must be available on site for each program.

At the end the day, the competition will be followed at 6 pm by a lecture on recent progresses in Go software untitled: "Computer-Go: recent progresses for an old challenge", followed by the prizes Giving Ceremony.


Phantom-Go, Blind Go & other variants of Go


Tristan Cazenave is invited for joining the "phantom-go" animation with his program. The program will play against a strong player,  tuesday at 4pm, as follows:

  • 9x9 Go.
  • Chinese Rules, komi 7.5.
  • The ataris are not mentionned by the referee.
  • When a move by player A is illegal, the referee publicly claims that the move is illegal; but player B does not know which move has been tried by A, and player A does not know if the move is illegal by suicide, ko, superko, presence of a stone.
  • When a capture is performed, both players are informed that there is a capture and are informed of which stones are captured.


In blind Go, players do not put any stone on the board - they just announce the locations of their moves by letters and numbers.
A "blind-go" animation is proposed monday at 4pm.. Is there a human able to win against a strong program in blind Go?

9x9, 13x13 and 19x19 are proposed.


There will be also:

  • some Tsumego proposed to human, some of them for which computers are specially weak and some of them for which computers are specially strong; monday and tuesday at 4pm.
  • some special Tsumegos with interesting mathematical properties.
  • some variants of initial position (not the empty board as in usual Go) which are quite puzzling for humans.

General rules for computer-Go

All programs are supposed to be able to connect to KGS and their operators are supposed to be able to take care of connections with KGS. An internet connection will be available. On the EGC site, there's no room for clusters or non-standard computers.

Remote computing is allowed.

All computer-Go events (9x9, 13x13, 19x19) will use the following standard rules:

  • Chinese rules;
  • komi 7.5;
  • the standard KGS way of handling time will be used, except for phantom-Go.