require("Sajax.php");
//
// The world's least efficient wall implementation
//
function colorify_ip($ip)
{
$parts = explode(".", $ip);
$color = sprintf("%02s", dechex($parts[1])) .
sprintf("%02s", dechex($parts[2])) .
sprintf("%02s", dechex($parts[3]));
return $color;
}
function add_line($msg) {
$f = fopen("genius.html", "a");
$dt = date("Y-m-d h:i:s");
$msg = strip_tags(stripslashes($msg));
$remote = $_SERVER["REMOTE_ADDR"];
// generate unique-ish color for IP
$color = colorify_ip($remote);
fwrite($f, "$msg|$dt|$remote
\n");
fclose($f);
}
function unicode_urldecode($url)
{
preg_match_all('/%u([[:alnum:]]{4})/', $url, $a);
foreach ($a[1] as $uniord)
{
$utf = '' . $uniord . ';';
$url = str_replace('%u'.$uniord, $utf, $url);
}
return urldecode($url);
}
function refresh($offset = -30, $length = 30) {
$lines = array();
$lines = file("genius.html");
//get all the valid lines
$validlines = array();
$ips = array(1 => 'start');
foreach($lines as $ln) {
list($guess, $name, $dt, $ip) = explode('|', $ln);
// return join(', ', [$guess, $name, $dt, $ip]);
if($guess<=100 && $guess >= 0 && !array_search($ip, $ips) && is_numeric($guess))
$validlines[] = $ln;
$ips[] = $ip;
}
// return the last 30 lines
$lns = array_slice($validlines, $offset, $length);
$guesses = array();
$n = 0;
$total = 0;
$return = '
';
foreach($lns as $ln) {
list($guess, $name, $dt, $ip) = explode('|', $ln);
$guesses[] = array(
'guess' => $guess,
'name' => urldecode($name),
'dt' => $dt,
'ip' => $ip);
$n = $n + 1;
$total = $total + $guess;
$return .= "" . unicode_urldecode($name) . ": | $guess | $dt |
";
}
$final = ($total*2/3/(0.0001+$n));
$return .= "Average: | " . ($total/(0.00001 + $n)) . " | |
2/3 of Average: | $final | |
";
$currentmin = 100;
foreach($guesses as $guess) {
$diff = abs($guess['guess'] - $final);
if($diff<$currentmin) {
$currentmin = $diff;
$currentwinner = $guess['name'];
$currentwinningguess = $guess['guess'];
}
}
$return .= "Winner: | $currentwinner | |
Winning Guess: | $currentwinningguess |
";
return $return;
}
$sajax_request_type = "GET";
sajax_init();
sajax_export("add_line", "refresh");
sajax_handle_client_request();
if($_GET['action'] == 'result') {
?>
《世界不是天才创造的》提及的游戏的完整的结果
王建硕
《旅行的艺术》是本好书
« 世界不是天才创造的
《世界不是天才创造的》提及的游戏的完整的结果
前天写了一篇文章《世界不是天才创造的》,
介绍了一个老华带我们做的猜数游戏。很多人参与这个游戏。而参与人数越多,
越有可能接近这个世界的真实情况。我很高兴能把其中的一部分结果公布在这里,让大家可以看到这个游戏的全貌。不做过多评论,大家自己来看吧。
最近的100个人的结果
echo refresh(-100, 100);
?>最近的100个人的结果
echo refresh(-300, 300);
?>最近的100个人的结果
echo refresh(-4000, 4000);
?>
注:这个程序的原则,目的是尽量模仿真实的游戏场景:
- 不手工删除任何人的数据。
- 不合规则的输入将被忽略,比如小于0,大于100或者输入不是数字的
- 一个人的多次重复输入将由程序只保留第一个。
exit();
}?>
// remote scripting library
// (c) copyright 2005 modernmethod, inc
var sajax_debug_mode = false;
var sajax_request_type = "GET";
function sajax_debug(text) {
if (sajax_debug_mode)
alert("RSD: " + text)
}
function sajax_init_object() {
sajax_debug("sajax_init_object() called..")
var A;
try {
A=new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
A=new ActiveXObject("Microsoft.XMLHTTP");
} catch (oc) {
A=null;
}
}
if(!A && typeof XMLHttpRequest != "undefined")
A = new XMLHttpRequest();
if (!A)
sajax_debug("Could not create connection object.");
return A;
}
function sajax_do_call(func_name, args) {
var i, x, n;
var uri;
var post_data;
uri = "http://home.wangjianshuo.com/scripts/php/genius.php";
if (sajax_request_type == "GET") {
if (uri.indexOf("?") == -1)
uri = uri + "?rs=" + escape(func_name);
else
uri = uri + "&rs=" + escape(func_name);
for (i = 0; i < args.length-1; i++)
uri = uri + "&rsargs[]=" + escape(args[i]);
uri = uri + "&rsrnd=" + new Date().getTime();
post_data = null;
} else {
post_data = "rs=" + escape(func_name);
for (i = 0; i < args.length-1; i++)
post_data = post_data + "&rsargs[]=" + escape(args[i]);
}
x = sajax_init_object();
x.open(sajax_request_type, uri, true);
if (sajax_request_type == "POST") {
x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
x.onreadystatechange = function() {
if (x.readyState != 4)
return;
sajax_debug("received " + x.responseText);
var status;
var data;
status = x.responseText.charAt(0);
data = x.responseText.substring(2);
if (status == "-")
alert("Error: " + data);
else
args[args.length-1](data);
}
x.send(post_data);
sajax_debug(func_name + " uri = " + uri + "/post = " + post_data);
sajax_debug(func_name + " waiting..");
delete x;
}
// wrapper for add_line
function x_add_line() {
sajax_do_call("add_line",
x_add_line.arguments);
}
// wrapper for refresh
function x_refresh() {
sajax_do_call("refresh",
x_refresh.arguments);
}
var check_n = 0;
function refresh_cb(new_data) {
document.getElementById("wall").innerHTML = unescape(new_data);
document.getElementById("status").innerHTML = "....";
//setTimeout("refresh()", 120000);
}
function refresh() {
document.getElementById("status").innerHTML = "...";
x_refresh(refresh_cb);
}
function add_cb() {
// we don't care..
}
function add() {
var line;
var handle;
handle = document.getElementById("handle").value;
line = document.getElementById("line").value;
if (line == "")
return;
x_add_line(line + "|" + handle, add_cb);
document.getElementById("line").value = "";
document.f.style.display = "none";
document.getElementById("ok").style.display = 'block';
}