つれずれなるままに… このページをアンテナに追加 RSSフィード Twitter

自身をYuichirouと名乗る謎の男が文字通り「つれれなるままに」書くよくわからん日記。

検索サイトから来た方、こんなページでゴメンナサイ。下にあるフォームに検索ワードを入れて検索すると、情報が得られるかも。

なお、タイトルに打ち間違いはありません。

1000 | 01 | 02 | 03 | 04 |
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日

「幕府を作りたいのですが」欲しい! 11:23 「幕府を作りたいのですが」欲しい!を含むブックマーク

キーワードを書くだけで応募できるなんてホントすばらしいね!)


自分の一番興味深かった質問は、id:lionfanid:lionfanさんのこの質問。

迷宮脱出ゲーム・0回目の選択】


ただ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で書いてみた 01:14 国際化ドメイン名で使われる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;
  };
};
トラックバック - http://d.hatena.ne.jp/Yuichirou/20070914