84 lines
1.3 KiB
Text
84 lines
1.3 KiB
Text
# Solution in '''RPN'''
|
|
check := function(x, y, z)
|
|
local r, c, s, i, j, k, a, b, p;
|
|
i := 0;
|
|
j := 0;
|
|
k := 0;
|
|
s := [ ];
|
|
r := "";
|
|
for c in z do
|
|
if c = 'x' then
|
|
i := i + 1;
|
|
k := k + 1;
|
|
s[k] := x[i];
|
|
Append(r, String(x[i]));
|
|
else
|
|
j := j + 1;
|
|
b := s[k];
|
|
k := k - 1;
|
|
a := s[k];
|
|
p := y[j];
|
|
r[Size(r) + 1] := p;
|
|
if p = '+' then
|
|
a := a + b;
|
|
elif p = '-' then
|
|
a := a - b;
|
|
elif p = '*' then
|
|
a := a * b;
|
|
elif p = '/' then
|
|
if b = 0 then
|
|
continue;
|
|
else
|
|
a := a / b;
|
|
fi;
|
|
else
|
|
return fail;
|
|
fi;
|
|
s[k] := a;
|
|
fi;
|
|
od;
|
|
if s[1] = 24 then
|
|
return r;
|
|
else
|
|
return fail;
|
|
fi;
|
|
end;
|
|
|
|
Player24 := function(digits)
|
|
local u, v, w, x, y, z, r;
|
|
u := PermutationsList(digits);
|
|
v := Tuples("+-*/", 3);
|
|
w := ["xx*x*x*", "xx*xx**", "xxx**x*", "xxx*x**", "xxxx***"];
|
|
for x in u do
|
|
for y in v do
|
|
for z in w do
|
|
r := check(x, y, z);
|
|
if r <> fail then
|
|
return r;
|
|
fi;
|
|
od;
|
|
od;
|
|
od;
|
|
return fail;
|
|
end;
|
|
|
|
Player24([1,2,7,7]);
|
|
# "77*1-2/"
|
|
Player24([9,8,7,6]);
|
|
# "68*97-/"
|
|
Player24([1,1,7,7]);
|
|
# fail
|
|
|
|
# Solutions with only one distinct digit are found only for 3, 4, 5, 6:
|
|
Player24([3,3,3,3]);
|
|
# "33*3*3-"
|
|
Player24([4,4,4,4]);
|
|
# "44*4+4+"
|
|
Player24([5,5,5,5]);
|
|
# "55*55/-"
|
|
Player24([6,6,6,6]);
|
|
# "66*66+-"
|
|
|
|
# A tricky one:
|
|
Player24([3,3,8,8]);
|
|
"8383/-/"
|