A force de voire fleurir partout des captcha imagée et aussi à force d'avoir à utiliser lynx, je me suis mis en tête de réaliser un test de turing qui soit accessible. Pour ce faire, j'utilise la méthode des questions simples posée à l'utilisateur.
Source / Exemple :
<?php
/*******************************************************************************
- Software: Turing Test class *
- Version: 0.2 *
- Date: 2007-01-20 *
- Author: William POTTIER *
- License: Freeware *
- *
- You may use, modify and redistribute this software as you wish. *
class Turing
{
// List of many word wich may be use.
private $dictionnary = array(
'programmation',
'interface',
'variable',
'apprentissage'
);
// List of questions types
private $questions = array(
'Indiquer le résultat de la somme de %x et %y',
'Indiquer le plus grand nombre entre %x et %y',
'Indiquer la lettre n°%u du mot "%mot_z"',
'Indiquer le plus petit nombre entre %x et %y'
);
// Results that corresponds with associated questions.
private $results = array(
'addition(x,y)',
'_max(x,y)',
'letterOfWord(u,mot_z)',
'_min(x,y)'
);
private $nb, $u, $x, $y, $z,$mot_z;
////////////////////////////////////////
// Constructor : just many simple test
public function __construct()
{
// We check if Session is open
if(session_id() == '')
throw new Exception('Can\'t use Turing test because session is close.');
}
//////////////////////////////////////////
// a function for callback (for $results)
private function addition($a, $b)
{
return $a+$b;
}
//////////////////////////////////////////
// a function for callback (for $results)
private function letterOfWord($pos, $mot)
{
return $mot[$pos];
}
private function _max($a, $b)
{
return max(array($a, $b));
}
private function _min($a, $b)
{
return min(array($a, $b));
}
//////////////////////////////////////////////////////
// We pick a question from our list and we return it
public function GenerateQuestion($force_new = 0)
{
if($this->nb == '' || $force_new == 1)
$this->nb = mt_rand(0, count($this->questions)-1);
// We get the random number
$this->x = mt_rand(1, 50);
$this->y = mt_rand(1, 50);
$this->z = mt_rand(0, count($this->dictionnary)-1);
$this->mot_z = $this->dictionnary[$this->z];
$this->u = mt_rand(0,strlen($this->mot_z)-1);
// We get the result and we save it in $_SESSION
$_SESSION['turing'] = $this->GetResult();
$search = array('%x', '%y', '%mot_z', '%u');
$replace = array($this->x, $this->y, $this->mot_z, $this->u+1);
$question = str_replace($search, $replace, $this->questions[$this->nb]);
return $question;
}
////////////////////////////////////////////////////////
// we return the result associated with the number $nb
private function GetResult()
{
$result = $this->results[$this->nb];
// We explode the string to get function name and param list
$temp1 = explode('(', $result);
// Good, wa have the callback
$callback = $temp1[0];
// Now the params
$params = trim($temp1[1], ')');
$param = explode(',', $params);
$count_param = count($param);
for($i = 0; $i < $count_param; $i++)
{
$param_callback[$i] = $this->$param[$i];
}
// We run the callback
return call_user_method_array($callback, $this, $param_callback);
}
}
?>
Conclusion :
Voilà si vous avez des remarques, commentaires et suggestions n'hésiter pas.
Le petit exemple permet de montrer la mise en oeuvre d'un tel système et de la classe.
Pour ceux que ça intéresse, la classe utilise un système de callback pour le calcul des résultat.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.