KAP1 KAP1
1065
BLOG

27. Matematyczna zagadka

KAP1 KAP1 Nauka Obserwuj temat Obserwuj notkę 40

W komentarzu tutaj, Ark zadał zagadkę:

Używając liczb 1,3,4,6, każdej tylko raz, oraz korzystając jedynie z czterech operacji matematycznych +,-,x,/

otrzymać liczbę 24

Zafrapowało mnie, że nie mogłem znaleźć rozwiązania. Przeczytałem jeszcze wskazówki tichiego. Z podziwem przeczytałem też jego matematyczne podejście do zadania:

Mamy 4 binarne działania {f,g,h,k}, z tego dwa komutujące i jedno antykomutujące. 4 liczby {s,t,x,y}. Zatem, formatem rozwiązania jest
f(U,V), gdzie U=g(x,y), V=h(s,t)
lub
f(U,V), gdzie U=g(x),V=h(y,k(s,t)) (plus permutacje)

Z dwóch zbiorów wybory bez powtórzeń - 4!=24 oraz 4!=24, możliwości będzie - z grubszaq - mniej niż 2*24², circa 1000.

Da się skonstruwoać skończony browsing algorithm.

No więc nie mogąc w sposób klasyczny odgadnąć rozwiązania, napisałem algorytm przeszukujący wszystkie możliwe działania w języku C#:

27. Matematyczna zagadka

        private double calc(double d1, char s, double d2)
        {
            double r = d1;
            switch (s)
            {
                case '*': r = r * d2; break;
                case '/': r = r / d2; break;
                case '+': r = r + d2; break;
                case '-': r = r - d2; break;
            }
            return r;
        }

        int index = 0;
        StringBuilder txt = null;
        string solution = "";

        private void check(double d1, double d2, double d3, double d4,
            char s1, char s2, char s3)
        {
            double r;
            string str;

            r = calc(calc(calc(d1, s1, d2), s2, d3), s3, d4);
            str = String.Format("{0}: (({1} {2} {3}) {4} {5}) {6} {7} = {8}",
                index, d1, s1, d2, s2, d3, s3, d4, r);
            txt.AppendLine(str);
            if (r == 24)
                solution = str;
            index++;

            r = calc(calc(d1, s1, calc(d2, s2, d3)), s3, d4);
            str = String.Format("{0}: ({1} {2} ({3} {4} {5})) {6} {7} = {8}",
                index, d1, s1, d2, s2, d3, s3, d4, r);
            txt.AppendLine(str);
            if (r == 24)
                solution = str;
            index++;

            r = calc(d1, s1, calc(calc(d2, s2, d3), s3, d4));
            str = String.Format("{0}: {1} {2} (({3} {4} {5}) {6} {7}) = {8}",
                index, d1, s1, d2, s2, d3, s3, d4, r);
            txt.AppendLine(str);
            if (r == 24)
                solution = str;
            index++;

            r = calc(d1, s1, calc(d2, s2, calc(d3, s3, d4)));
            str = String.Format("{0}: {1} {2} ({3} {4} ({5} {6} {7})) = {8}",
                index, d1, s1, d2, s2, d3, s3, d4, r);
            txt.AppendLine(str);
            if (r == 24)
                solution = str;
            index++;
      
        }
       
        private void button1_Click(object sender, EventArgs e)
        {
            double[] digit = new double[4] { 1, 3, 4, 6 };
            char[] symbol = new char[4] { '*', '/', '+', '-' };

            index = 1;
            txt = new StringBuilder("");
            solution = "";
            int count = 0;
            for(int d1 = 0; d1 < 4; d1++)
                for(int d2 = 0; d2 < 4; d2++)
                    for(int d3 = 0; d3 < 4; d3++)
                        for (int d4 = 0; d4 < 4; d4++)
                        {
                            if (d1 != d2 && d1 != d3 && d1 != d4 &&
                                d2 != d3 && d2 != d4 &&
                                d3 != d4)
                            {
                                count++;
                                for(int s1 = 0; s1<4; s1++)
                                    for(int s2 = 0; s2<4; s2++)
                                        for (int s3 = 0; s3 < 4; s3++)
                                        {
                                            check(digit[d1], digit[d2], digit[d3], digit[d4],
                                                symbol[s1], symbol[s2], symbol[s3]);
                                        }
                            }
                        }

            textBox1.Text = String.Format("Rozwiązanie na pozycji {0}\r\n\r\n{1}",
                solution, txt.ToString());
        }
    }

 

Na pewno program można było napisać lepiej, prościej, czytelniej. Mi wystarczyło to co jest. Wersja skompilowana tutaj: ZagadkaMatematyczna.exe (15 KB, wymaga .NET 2.0)

Rozwiązanie zagadki jest też dostępne na stronie internetowej.Kliknij aby wyświetlić

KAP1
O mnie KAP1

Nowości od blogera

Komentarze

Pokaż komentarze (40)

Inne tematy w dziale Technologie