- 暁
- 大ベテラン
- 会議室デビュー日: 2006/06/28
- 投稿数: 116
|
投稿日時: 2006-08-23 00:05
久しぶりにひらめきに頭使った気がします。
どのようなブロックに分けるかということですね。
(12個でも出来るという書き込みを見たときは面食らいましたがなんとか)
|
- 会社員
- ベテラン
- 会議室デビュー日: 2003/01/21
- 投稿数: 50
|
投稿日時: 2006-08-23 00:35
昔、ハードウェアが高価で低性能だった頃の問題ですね。
今のように低価格・高性能の場合、
「別に3回でも5回でもたいしてかわんないよ」
とか
「めんどくさい方法よりも、天秤測りを4つ使って2回でやったほうがいいんじゃないか?」
といわれそうです。(組込み系なんかは別ですが)
|
- coasm
- 大ベテラン
- 会議室デビュー日: 2001/11/26
- 投稿数: 237
|
投稿日時: 2006-08-23 01:11
m個の球があって、その中の1個(以下、「犯人」と呼ぶ)だけ重さが違う。
天秤をn回使用して、犯人を突き止める。
情報量の制限から、mの上限が決まる。
(A) 犯人が重いか軽いか指摘する必要がある場合。
・天秤は右に傾く・左に傾く・つりあうの3状態を判別できるので、n回では3**nの状態を判別可能。
・m個の球のどれか一つが重い、または軽いので、判別すべき状態の数は2mである。
したがって、2m≦3**n がmの上限となる。
(B) 犯人が重いか軽いか指摘しなくても良い場合。
実は、(A)と比べてあまり楽にはならない。
手順の途中で一度でも犯人を天秤に乗せた場合、犯人が確定した段階で、それが重かったか軽かったかも確定する。
つまり、「犯人が重いか軽いか指摘しなくても良い」という条件を有利に活用できるのは、犯人を一度も天秤に乗せなかった場合に限られる。
この場合のmの上限は、2m-1≦3**nである。
というわけで、n=3の場合、
(A)なら、13個まで実現できるかもしれない。14個は不可能。
(B)なら、14個まで実現できるかもしれない。15個は不可能。
と、ここまでの論理は一本道です。
# ≦ を < と書き間違えていたので訂正
[ メッセージ編集済み 編集者: coasm 編集日時 2006-08-23 01:13 ]
|
- coasm
- 大ベテラン
- 会議室デビュー日: 2001/11/26
- 投稿数: 237
|
投稿日時: 2006-08-23 01:52
で、「天秤を一回使用する毎に、あり得る可能性を1/3に絞り込む」ことだけ意識していれば、(A)で球12個を判別する手順は組み立てられます。
「あらかじめ1個の球を除外しておいて(A)の手順を行う。それで犯人が判明しなかったならば、除外した1個が犯人だ」という手順で、(B)の13個は解決します。
残る問題は、
(A)の13個が不可能であることの証明。
(B)と(A)の差が、球数にして at most で1個であることの証明。
ですね。
一般解としては、
(A) 2*m ≦ 3**n を満たす && m は3の倍数であること。
(B) Aの場合の上限+1
のはずだが、これを「ちゃんとわかるように説明する」のは大仕事だなあ・・・
|
- R・田中一郎
- ぬし
- 会議室デビュー日: 2005/11/03
- 投稿数: 979
|
投稿日時: 2006-08-23 09:18
引用: |
|
じゃんぬねっとさんの書き込み (2006-08-22 20:36) より:
さすが、(;`ー´)o/ ̄ ̄ ̄ ̄ ̄ ̄~ >°))))彡) は違いますねw
|
おや?
これは何をしているところなのでしょうか。
僕には皆目検討がつきませんがw
引用: |
|
じゃんぬねっとさんの書き込み (2006-08-22 20:36) より:
閲覧数を見てビックリしましたよ。
|
内緒ですが、実はここの下段へのランクインを密かに狙っていたりします。
http://www.atmarkit.co.jp/bbs/phpBB/cstats.php
引用: |
|
Jittaさんの書き込み (2006-08-22 22:07) より:
採用試験?ネタはここですか?
Life is beautiful
(元マイクロソフト社員 中島聡さんのブログ)
|
最初の投稿に Nifty-serve の FWINDEV だと書いた記憶があるのですが^^;
当時、この話題で盛り上がったのを、ふとしたきっかけで思い出したのです。
|
- R・田中一郎
- ぬし
- 会議室デビュー日: 2005/11/03
- 投稿数: 979
|
投稿日時: 2006-08-23 10:24
以下解答です。つい先ほど、急いで書いたので穴があるかもしれませんが^^;
ツッコミ補足など大歓迎です。
以後、ネタバレになりましたので、この上の個数の場合については、ご自由に論じて下さい。_(_*_)_
コード: |
|
9個の玉を1〜9と表します。
123・456・789の3つのグループに分けます。
●123を左に、456を右に置いて1回目の計測を行います。
計測結果は、必ず「釣り合う・左に傾く・右に傾く(つまり釣り合わない)」のいずれかになります。
以下、この結果によって手順を変えて説明します。
釣り合う:
789に重さの違う玉があることになります。
●7を左に、8を右に置いて2回目の計測を行います。
釣り合う:
唯一計測していない、9が重さの違う玉になります。
釣り合わない:
●7を左に、9を右に置いて3回目の計測を行います。
釣り合う:
7と9は同じ重さなので、8が重さの違う玉になります。
釣り合わない:
2回目の計測結果から7と8は釣り合いませんでした。
3回目の計測結果から7と9は釣り合いませんでした。
つまり、8と9は釣り合い、7だけが釣り合わないことがわかります。
よって、7が重さの違う玉になります。
釣り合わない:
123と456は、どちらが重く、どちらが軽かったのかを覚えておきます。
●123を左に、789を右に置いて2回目の計測を行います。
釣り合う:
456の中に重さの違う玉があることになります。
同時に唯一重さの違う玉が重いか軽いかもわかります。
1回目の計測結果で456が重かったか、軽かったかに準じるからです。
●4を左に、5を右に置いて3回目の計測を行います。
釣り合う:
計測していない、6が重さの違う玉になります。
釣り合わない:
この場合、4か5が重さの違う玉と言う事になります。
そして、唯一重さの違う玉は重いか軽いかがわかっています。
以上により、重さの違う玉を特定できます。
釣り合わない:
123と456を測った結果、釣り合いませんでした。
123と789を測った結果、釣り合いませんでした。
つまり、どちらの計測にも参加した123だけが重さが違うことになります。
同時に唯一重さの違う玉が重いか軽いかもわかります。
何故なら、1回目2回目の計測結果で123が重いか軽いかがわかるからです。
●1を左に、2を右に置いて3回目の計測を行います。
釣り合う:
計測していない、3が重さの違う玉になります。
釣り合わない:
この場合、1か2が重さの違う玉になります。
そして、唯一重さの違う玉は重いか軽いかがわかっています。
以上により、重さの違う玉を特定できます。
|
解答を文章化したものをアップして、他の人に検証してもらうのも良いかもしれませんね。
|
- nagise
- ぬし
- 会議室デビュー日: 2006/05/19
- 投稿数: 1141
|
投稿日時: 2006-08-23 11:27
13個を判別するアルゴリズム
コード: |
|
int b0,b1...b12; // 玉の状態。-1, 0, 1が入る
if (b0 + b1 + b2 + b3 > b4 + b5 + b6 + b7) {
// b8-b12 = 0
if (b0 + b1 + b4 > b2 + b5 + b8) {
// b0-b3 > b4-b7 から b2,b3 = 0
if (b0 + b5 > b8 + b9) {
// b0-b3 > b4-b7 だから b0 = 1
return 0;
} else if (b0 + b5 < b8 + b9){
// b0-b3 > b4-b7 だから b5 = -1
return 5;
} else {
// b0,b5 = b8,b9 の場合
// b1 = 1
return 1;
}
} else if (b0 + b1 + b4 < b2 + b5 + b8) {
// b0-b3 > b4-b7 から b0,b1,b5 = 0
if (b4 < b8) {
// b4 = -1
return 4;
} else if (b4 == b8){
// b2 = 1
return 2;
} else {
throw new Exception();
}
} else {
// b3 = 1 | b6 = -1 | b7 = -1
if (b3 + b6 > b8 + b9) {
// b3 = 1
reutrn 3;
} else if (b3 + b6 < b8 + b9) {
// b6 = -1
return 6;
} else {
// b7 = -1
return 7;
}
}
} else if (b0 + b1 + b2 + b3 < b4 + b5 + b6 + b7) {
// b0 + b1 + b2 + b3 > b4 + b5 + b6 + b7 の時と同様につき省略
} else {
// b0-b7 = 0
if (b8 + b9 > b10 + b0) {
if (b8 + b10 > b0 + b1) {
// b8 + b9 > b10 + b0 だから b8 = 1
reutrn 8;
} else if (b8 + b10 < b0 + b1) {
// b8 + b9 > b10 + b0 だから b10 = -1
reutrn 10;
} else {
// b9 = 1
return 9;
}
} else if (b8 + b9 < b10 + b0) {
// 上記ロジックの大小関係が反転するだけなので省略
} else {
// b0-b10 = 0
if (b11 > b0) {
// b11 = 1
return 11;
} else if (b11 < b0){
// b11 = -1
return 11;
} else {
// b12 != 0
// 大小関係は不明
return 12;
}
}
}
|
天秤3回でとりうる状態は3^3 = 27通り。
玉の状態は[i番目の玉が±1]という表し方ができるので
27通りの状態で決定可能な玉の上限は27/2 = 13.5というのは既出ですね。
量子状態を使っていいなら、状態を重ね合わせてから量れば
1回の天秤の使用で無限の玉から相違のある玉を選出できますね。
|
- 未記入
- 会議室デビュー日: 2006/08/22
- 投稿数: 10
|
投稿日時: 2006-08-23 11:56
わちゃさん>私の言いたいことはnagiseさんが書いてくださいました・・
13.5についてはわたしの投稿よりも前に既出でしたね。
|