読者です 読者をやめる 読者になる 読者になる

論理的思考テスト【回答】

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);
    }
}