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#:

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ć
Inne tematy w dziale Technologie