論理的思考テスト【回答】
Javaで思いついたまま書きました。
ダメだし、他の方法、他の言語での回答、お待ちしています。^^
package main.java; import java.util.ArrayList; import java.util.Collections; import java.util.Random; public class Logical { /* * 9つの鉄球の中から、重さの異なる1つの鉄球を、天秤を3回だけ使って * 特定せよ。 */ public static void main(String[] args) { /* * 1つのだけ重さの異なる9つの鉄球を準備する。 */ ArrayList<Integer> array = new ArrayList<Integer>(); Random rnd = new Random(); int onlyNum = rnd.nextInt(10); int standardNum = rnd.nextInt(10); while (standardNum == onlyNum) { // 標準とは異なる重さの鉄球を入れる onlyNum = rnd.nextInt(10); } int cnt = 0; while (cnt < 8) { // 8個の標準の重さの鉄球を入れる array.add(standardNum); cnt++; } // 1個の重さの異なる鉄球を入れる array.add(onlyNum); // シャッフル Collections.shuffle(array); // 中身を表示 cnt = 0; while (cnt < 9) { System.out.print(array.get(cnt) + " "); cnt++; } /* * 9つの鉄球の中から、重さの異なる1つの鉄球を、天秤を3回だけ使って * 特定する処理 */ int ans; ArrayList<Integer> groupA = new ArrayList<Integer>(); ArrayList<Integer> groupB = new ArrayList<Integer>(); ArrayList<Integer> groupC = new ArrayList<Integer>(); for (int cnt3 = 0; cnt3 < 3; cnt3++) { // 0, 1, 2 groupA.add(array.get(cnt3)); // 3, 4, 5 groupB.add(array.get(cnt3 + 3)); // 6, 7, 8 groupC.add(array.get(cnt3 + 6)); } int totalA = groupA.get(0) + groupA.get(1) + groupA.get(2); int totalB = groupB.get(0) + groupB.get(1) + groupB.get(2); int totalC = groupC.get(0) + groupC.get(1) + groupC.get(2); // 【1回目】 ・・・ グループAとグループBを天秤にかける if (totalA == totalB) { // つりあった場合は、重さの違う鉄球はグループCにいる int groupC_a = groupC.get(0); int groupC_b = groupC.get(1); int groupC_c = groupC.get(2); // 【2回目】 if (groupC_a == groupC_b) { // つりあった場合は、重さの違う鉄球は、groupC_cです。 ans = groupC_c; } else { // 不釣り合いの場合は、重さの違う鉄球は、groupC_aかgroupC_bです。 // 【3回目】 if (groupC_c == groupC_a) { ans = groupC_b; } else { ans = groupC_a; } } } else { // 不釣り合いの場合は、重さの違う鉄球はグループAかグループBにいる // Ptn1 グループA > グループB ・・・ Aに重い鉄球がいるか、Bに軽い鉄球がいる // Ptn2 グループA < グループB ・・・ Aに軽い鉄球がいるか、Bに重い鉄球がいる // 1回目の天秤測定で、Pnt1かPnt2かは分かっている。 if (totalA > totalB) { // Pnt1の場合 ・・・ Aに重い鉄球がいるか、Bに軽い鉄球がいる // 【2回目】 if (totalC == totalA) { // つりあった場合は、重さの違う鉄球は、グループBにいる int groupB_a = groupB.get(0); int groupB_b = groupB.get(1); int groupB_c = groupB.get(2); // 【3回目】 if (groupB_a == groupB_b) { // このルートはPtn1なので、これは軽い鉄球 ans = groupB_c; } else { // このルートはPtn1なので、3回目の計測で軽かった方が重さの違う1つの鉄球 ans = groupB_a > groupB_b ? groupB_b : groupB_a; } } else { // 不釣り合いの場合は、重さの違う鉄球は、グループAにいる int groupA_a = groupA.get(0); int groupA_b = groupA.get(1); int groupA_c = groupA.get(2); // 【3回目】 if (groupA_a == groupA_b) { // このルートはPtn1なので、これは重い鉄球 ans = groupA_c; } else { // このルートはPtn1なので、3回目の計測で重かった方が重さの違う1つの鉄球 ans = groupA_a > groupA_b ? groupA_a : groupA_b; } } } else { // Pnt2の場合 ・・・ Aに軽い鉄球がいるか、Bに重い鉄球がいる // 【2回目】 if (totalC == totalA) { // つりあった場合は、重さの違う鉄球は、グループBにいる int groupB_a = groupB.get(0); int groupB_b = groupB.get(1); int groupB_c = groupB.get(2); // 【3回目】 if (groupB_a == groupB_b) { // このルートはPtn2なので、これは重い鉄球 ans = groupB_c; } else { // このルートはPtn2なので、3回目の計測で重かった方が重さの違う1つの鉄球 ans = groupB_a > groupB_b ? groupB_a : groupB_b; } } else { // 不釣り合いの場合は、重さの違う鉄球は、グループAにいる int groupA_a = groupA.get(0); int groupA_b = groupA.get(1); int groupA_c = groupA.get(2); // 【3回目】 if (groupA_a == groupA_b) { // このルートはPtn2なので、これは軽い鉄球 ans = groupA_c; } else { // このルートはPtn2なので、3回目の計測で軽かった方が重さの違う1つの鉄球 ans = groupA_a < groupA_b ? groupA_a : groupA_b; } } } } // 重さの違う鉄球はこれです。 System.out.println("\r\nAnser : " + ans); } }