2012年02月02日
牌画
2011年05月24日
整数除算の仕様比較
プログラムを組んでいて嵌まったので、メモしておく。
| 言語 | Python | 他 |
|---|---|---|
| 4 / 3 | 1 | 1 |
| 4 % 3 | 1 | 1 |
| (-4) / 3 | -2 | -1 |
| (-4) % 3 | 2 | -1 |
| 4 / (-3) | -2 | -1 |
| 4 % (-3) | -2 | 1 |
| (-4) / (-3) | 1 | 1 |
| (-4) % (-3) | -1 | -1 |
具体的には Java で組んでいて Python と同じように書いて嵌まったのだが、使ったことのある他の言語 (Visual Basic, C++) も Java と同じ仕様だった。 数学的には Python の仕様が最も正しいだろう。
2011年02月04日
Webページ更新
2011年01月28日
卓組問題: 3プレイヤー8チーム7ラウンドの解
3プレイヤー8チーム (6テーブル) 7ラウンドの完全解 (全てのオポーネントとちょうど1回同卓する解) を見つけた。 前の記事に結果のみをコメントしたが、独立した記事にしておくことにする。 個人戦における6テーブル7ラウンドの卓組としても有用と考えられるから、また、前稿の説明を補足したいからだ。
まず、チーム間の対戦を以下のように定める。
チーム番号とラウンド番号とのビット単位ANDをとり、結果の各ビットをXORして0または1を得る。
| AND:XOR | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
|---|---|---|---|---|---|---|---|---|
| 000 | 000:0 | 000:0 | 000:0 | 000:0 | 000:0 | 000:0 | 000:0 | 000:0 |
| 001 | 000:0 | 001:1 | 000:0 | 001:1 | 000:0 | 001:1 | 000:0 | 001:1 |
| 010 | 000:0 | 000:0 | 010:1 | 010:1 | 000:0 | 000:0 | 010:1 | 010:1 |
| 011 | 000:0 | 001:1 | 010:1 | 011:0 | 000:0 | 001:1 | 010:1 | 011:0 |
| 100 | 000:0 | 000:0 | 000:0 | 000:0 | 100:1 | 100:1 | 100:1 | 100:1 |
| 101 | 000:0 | 001:1 | 000:0 | 001:1 | 100:1 | 101:0 | 100:1 | 101:0 |
| 110 | 000:0 | 000:0 | 010:1 | 010:1 | 100:1 | 100:1 | 110:0 | 110:0 |
| 111 | 000:0 | 001:1 | 010:1 | 011:0 | 100:1 | 101:0 | 110:0 | 111:1 |
この値が同じチームがそれぞれ3つの卓へ各1名のプレイヤーを出して同時に対戦する。
More...2011年01月06日
8ペア4卓の卓組問題: 7ラウンドの解
8ペア4卓の卓組について面白い解を見つけたので記録しておく。 ラウンド数は1から7, ペア番号は0から7, 卓番号は0から3, プレイヤー番号はペア番号の2倍に0または1をたしたものであるとする。
各ペアは各ラウンドにおいて、ラウンド数とペア番号のビット単位ANDをとり、結果を二進法で表した際に1であるビットの数と偶奇が等しい卓でプレイする。
各プレイヤーは各ラウンドにおいて、ラウンド番号から1を引き、定数 (2, 3, 4, 5 のいずれかに大会を通じて固定する) 倍して7で割った余り F とペア番号のビット単位ANDをとり、結果を二進法で表した際に1であるビットの数と、プレイヤー番号と卓番との差との偶奇が等しいような卓でプレイする。
具体的な卓組は以下の通りである。 斜線の左側に書かれた番号のペアは偶数番目の卓でプレイする。 斜線の右側に書かれた番号のペアは「小さいプレイヤー番号のプレイヤーが小さい卓番号の卓で」プレイする。 より対称性の高い方法として、1回戦目の「ペア内卓組」にオプション (0の代わりに7とビット単位ANDをとる方法) を用意した。
- 0246/01234567[0356]
- 0145/0145
- 0347/0123
- 0123/0167
- 0257/0246
- 0167/0347
- 0356/0257
この構成により、全てのプレイヤーが、パートナーとはプレイせず、自分たち以外のペアのうち片方と1回ずつプレイし、もう片方と2回ずつプレイすることができる。
2010年08月10日
大会対戦表プログラム (8)
これまでの記事で作ってきたプログラムは一般人数チーム戦の卓組を行う。 個人は1人チームと考えることができるから、当然、このプログラムは個人戦にも応用が可能だ。 チーム人数 {1, ..., 1} (1の個数は人数) を入力してやればよい。
しかしチーム間の対戦が「できるだけ」一様になるというのは、チーム人数が少ない場合には必ずしも再同卓を避ける結果にならない。 例えば、16個人5ラウンドの解は広く知られている。 しかし、1人16チーム5ラウンドの対戦をランダムに生成すると卓番号と座位を含めずラウンドの順序を含めて (C[15,3]C[11,3]C[7,3]C[3,3])^5 = 1,2526,1303,3102,8547,9403,7170,4101,5625 通りが考えられるが、そのうち正しい解は同様の条件では 5!(C[15,3]C[12,3]C[9,3]C[6,3]C[3,3]/5!)2(3!)^4 = 4358,9145,6000 通りしか存在しない。 したがって、ランダムに生成したチーム卓組を用いて個人卓組を行う方法は現実的ではない。
個人戦には再同卓の回避を優先として卓組を生成するオプションが必要だ。 そこでは以下の理由により、チーム戦の完成時に行ったシャッフルによる高速化が必要になるだろう:
More...