笨人 20170402
在微信同步貼上《小學一年級算術題求解》後,有人問能否給個破解程序。我說沒問題。我用SAS和Python編程得到相同結果,但SAS比Python快很多。那就給個SAS的吧。
該小學一年級的算術題說的是:8個變量a, b, c, d, e, f, g, h, 在1到8範圍內取不同值, 求解下列4個等式中此8個變量的賦值:
1. a+b=9
2. c+d=7
3. e-f=1
4. g-h=3
下面是用SAS軟件編的蠻力破解此題的程序:
%macro DoValuation(Eq4);
data Output_&Eq4 (Keep=Variable Valuation label="Variable Valuation where g-h=&Eq4");
label Variable='Variable'
Valuation='Valuation';
length Variable $1 Valuation s1-s8 $7;
array varArr{8} a b c d e f g h;
array lblArr{8} $1 ('a' 'b' 'c' 'd' 'e' 'f' 'g' 'h');
array strArr{8} $7 s1-s8;
do a=1 to 4;
do b=8 to 5 by -1;
do c=1 to 3;
do d=6 to 4 by -1;
do e=2 to 8;
do f=1 to 7;
do g=4 to 8;
do h=1 to (8 - &Eq4);
AnySame=0;
do i=1 to 7;
do j=i+1 to 8;
if varArr(i)=varArr{j} then
AnySame=1;
end;
end;
if AnySame=0 and a+b=9 and c+d=7 and
e-f=1 and g-h=&Eq4 then do i=1 to 8;
if strArr(i) ne '' then strArr(i)=cat(strip(strArr(i)),
put(varArr(i),1.));
else strArr(i)=put(varArr(i),1.);
end;
end;
end;
end;
end;
end;
end;
end;
end;
if s1 ne '' then do i=1 to 8;
Variable=lblArr(i);
Valuation=strip(strArr(i));
output;
end;
run;
%mend DoValuation;
%DoValuation(3)