自身をYuichirouと名乗る謎の男が文字通り「つれずれなるままに」書くよくわからん日記。
検索サイトから来た方、こんなページでゴメンナサイ。下にあるフォームに検索ワードを入れて検索すると、情報が得られるかも。
なお、タイトルに打ち間違いはありません。
1504 | 01 | 02 | 03 |
2003 | 10 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 |
2007年9月14日
■「幕府を作りたいのですが」欲しい!

(キーワードを書くだけで応募できるなんてホントすばらしいね!)
自分の一番興味深かった質問は、id:lionfanさんのこの質問。
ただ1人だけが生き残れる、迷宮脱出ゲームをしたいと思います。
参加者中、最後まで生き残った1人か、
死亡がいちばん遅かったk人(全員死亡もありえます)に (600/k) ポイント進呈です。
ゲームは毎日、1回ずつ進みます。
参加人数がそろった翌日から、毎日「はてな」で、
【迷宮脱出ゲーム・m回目の選択】(m≧1)という質問をします。
ですから毎日チェックできる人だけ参加してください。
なお決着がつくまでに、たぶん1週間ほどかかります。
死亡した場合、以降のゲームの参加資格を失います。つまり回答をオープンしません。
もちろんこのエントリーに参加しなかった人の回答もオープンしません。
いわば「貴様はすでに死んでいる」のです。
選択肢にない回答や、無回答の場合、
m回目に生き残ったかどうかは、(m+1)回目の質問の冒頭で述べます。
というわけで、第0回目の選択は「エントリーする?」です。
参加したい人は、決意表明とともに名乗り出てください。
1日待って、参加者(10名〜15名程度?)を指名させていただきます。
エントリー、お待ちしてます!
http://q.hatena.ne.jp/1151168908
これから始まった一連のゲーム(質問)によって、人力検索はてなで一大推理ゲームブームが生まれ、今も「ナポリタン問題」など形式を変えながら続いています。
■国際化ドメイン名で使われるPunycodeの変換プログラムをJavaScriptで書いてみた

- インスパイア:
- 参考資料:
利用例
FireBugまたはFirefox標準搭載のエラーコンソールで、
>>> Punycode.encode("日本語");
wgv71a119e
http://xn--wgv71a119e.jp/(国際化ドメイン名ではPunycodeした前に"xn--"を加える)は「日本語.jp」と等価です(ブラウザによってはリンクに触れると下に"http://xn--wgv71a119e.jp/"ではなく"http://日本語.jp/"と表示されます)。
逆変換もできます。
>>> Punycode.decode("wgv71a119e");
日本語
ソース
何をやってるのかはRFC3429の日本語訳を熟読してください。ほぼ疑似コードおよびC言語での実装例と同じです(ただエンコード部分で1か所、無駄を省いている部分があります)。
var Punycode = new function() { /* Bootstringパラメーター値 */ var base = 36; var tmin = 1, tmax = 26; var skew = 38; var damp = 700; var initial_bias = 72; var initial_n = 0x80; var delimiter = "-"; /* Punycode独自の36進数表記を計算 */ var charCode_a = "a".charCodeAt(0); var charCode_A = "A".charCodeAt(0); var charCode_0 = "0".charCodeAt(0); function encode_digit(d) { return (d < 26) ? String.fromCharCode(charCode_a + d) : String(d - 26); } function decode_digit(cp) { return (cp - charCode_0 < 10) ? (cp - charCode_0 + 26) : /* 数字 */ (cp - charCode_a < 26) ? (cp - charCode_a) : /* 英小文字 */ (cp - charCode_A < 26) ? (cp - charCode_A) : /* 英大文字 */ base; } /* バイアス補正関数 */ function adapt(delta, numpoints, firsttime) { delta = parseInt(delta / (firsttime ? damp : 2)); delta += parseInt(delta / numpoints); for (var k = 0; delta > ((base - tmin) * tmax) / 2; k += base) { delta = parseInt(delta / (base - tmin)); } return k + parseInt(((base - tmin + 1) * delta) / (delta + skew)); } /* デコード */ this.decode = function (input) { /* 状態を初期化 */ var n = initial_n; var i = 0; var bias = initial_bias; var output = ""; /* 基本文字を分離する */ var b = input.lastIndexOf(delimiter); if (b > 0) output = input.substring(0, b); b++; /* 全部の文字を処理するまで */ while (b < input.length) { var oldi = i, w = 1; /* 一般化可変長整数を逆変換して i に代入 */ for (var k = base; ; k += base) { var digit = decode_digit(input.charCodeAt(b++)); i += digit * w; var t = (k <= bias) ? tmin : (k >= bias + tmax) ? tmax : (k - bias); if (digit < t) break; w *= (base - t); } /* バイアス補正 */ bias = adapt(i - oldi, output.length + 1, oldi == 0); /* この時点で i = oldi + delta */ /* 文字コードの増分を i から取り出し加算 */ n += parseInt(i / (output.length + 1)); /* 挿入位置を i から取り出す */ i %= (output.length + 1); /* 拡張文字を挿入 */ output = output.substring(0, i) + String.fromCharCode(n) + output.substring(i); i++; } return output; }; /* エンコード */ this.encode = function (input) { /* 状態を初期化 */ var n = initial_n; var delta = 0; var bias = initial_bias; var output = ""; for (var m = Infinity, j = 0; j < input.length; j++) { var code = input.charCodeAt(j); /* 基本文字を分離する */ if (code < n) { output += input[j]; /* 拡張文字のうちコードが最小のものを探す */ } else if (code < m) { m = input.charCodeAt(j); } } /* b : 基本コードポイントの数, h : 処理した文字数 */ var b = output.length, h = b; /* 基本文字があるなら区切り文字を出力 */ if (b > 0) output += delimiter; /* 全部の文字を処理するまで */ while (h < input.length) { /* (delta / (h + 1)) の商 = 今処理する文字コードの前からの増分 */ delta += (m - n) * (h + 1); n = m; for (m = Infinity, j = 0; j < input.length; j++) { code = input.charCodeAt(j); /* すでに挿入済みの文字なら */ if (code < n) { /* 移動量をカウント */ /* (delta / (h + 1)) の余り = 今処理する文字を入れる位置までの移動量 */ delta++; /* 挿入する文字なら */ } else if (code == n) { /* この時点での delta を一般化可変長整数に変換して出力 */ for (var q = delta, k = base; ; k += base) { var t = (k <= bias) ? tmin : (k >= bias + tmax) ? tmax : (k - bias); if (q < t) break; output += encode_digit(t + (q - t) % (base - t)); q = parseInt((q - t) / (base - t)); } output += encode_digit(q); /* バイアス補正 */ bias = adapt(delta, h + 1, h == b); /* delta をリセット */ delta = 0; /* 処理した文字数をインクリメント */ h++; /* 残りの(拡張)文字のうちコードが最小のものを探す */ } else if (code < m) { m = input.charCodeAt(j); } } delta++; n++; } return output; }; };