[20250529]]24点计算的bash shell版本.txt
[20250529]]24点计算的bash shell版本.txt
--//我开始编辑按照dc的操作顺序排列运算符号,结果导致bc的运算符号乱序。
--//实际上按照顺序排列就可以,现在这样保证dc,bc的计算结果一致。
--//参数5等于all,显示全部结果。
#! /bin/bash
all=${5:-0}
#echo $all
numbers=($1 $2 $3 $4)
numlist=$(mktemp)
for n1 in {0..3};do
for n2 in {0..3};do
for n3 in {0..3};do
for n4 in {0..3}
do
if [ "$n1" != "$n2" -a "$n1" != "$n3" -a "$n1" != "$n4" -a "$n2" != "$n3" -a "$n2" != "$n4" -a "$n3" != "$n4" ]
then
echo "n1=${numbers[$n1]};n2=${numbers[$n2]};n3=${numbers[$n3]};n4=${numbers[$n4]}"
fi
done
done
done
done | sort| uniq >| ${numlist}
#/bin/cp ${numlist} e3.txt
oplist=$(mktemp)
ops=( "+" "*" "-" "/")
for n1 in {0..3};do
for n2 in {0..3};do
for n3 in {0..3};do
echo "p1='${ops[$n1]}';p2='${ops[$n2]}';p3='${ops[$n3]}'"
done
done
done >| ${oplist}
#/bin/cp ${oplist} e4.txt
result='bad'
## method 1: ((n1 p1 n2 ) p2 n3) p3 n4
## method 2: ( n1 p1 n2 ) p3 (n3 p2 n4)
## method 3: ( n1 p2 (n2 p1 n3)) p3 n4
## method 4: n1 p3 (n2 p2 (n3 p1 n4))
## method 5: n1 p3 ((n2 p1 n3) p2 n4)
for i in {1..5}
do
while read line1
do
eval $line1
while read line2
do
eval $line2
case $i in
1)
exp_bc="(( $n1 $p1 $n2 ) $p2 $n3 ) $p3 $n4"
exp_dc="$n1 $n2 $p1 $n3 $p2 $n4 $p3"
;;
2)
exp_bc="( $n1 $p1 $n2 ) $p3 ( $n3 $p2 $n4 )"
exp_dc="$n1 $n2 $p1 $n3 $n4 $p2 $p3"
;;
3)
exp_bc="( $n1 $p2 ( $n2 $p1 $n3 )) $p3 $n4"
exp_dc="$n1 $n2 $n3 $p1 $p2 $n4 $p3"
;;
4)
exp_bc="$n1 $p3 ( $n2 $p2 ( $n3 $p1 $n4 ))"
exp_dc="$n1 $n2 $n3 $n4 $p1 $p2 $p3"
;;
5)
exp_bc="$n1 $p3 (( $n2 $p1 $n3 ) $p2 $n4 )"
exp_dc="$n1 $n2 $n3 $p1 $n4 $p2 $p3"
;;
esac
#echo "scale=20 ; $exp_bc / 1 "
#echo "scale=20 ; $exp_dc 1 / pq"
#res_bc=$(echo "scale=20; $exp_bc / 1" | bc 2>/dev/null)
res_dc=$(echo "20k $exp_dc 1 / pq" | dc 2>/dev/null)
#echo ${res}
#if [ "${res_dc}" = '24.00000000000000000000' -a "$res_bc" = "$res_dc" ]
#if [ "${res_bc}" = '24.00000000000000000000' ]
if [ "${res_dc}" = '24.00000000000000000000' ]
then
echo "$1 $2 $3 $4 :method $i: $exp_dc : $exp_bc"
result='ok'
#return 1
fi
if [ $result = 'ok' -a ${all} != 'all' ]
then
/bin/rm ${numlist} ${oplist}
exit 1
fi
done < ${oplist}
done < ${numlist}
done
if [ $result != 'ok' ]
then
echo "$1 $2 $3 $4 : fail"
fi
/bin/rm ${numlist} ${oplist}
#echo "end!!"
--//我开始编辑按照dc的操作顺序排列运算符号,结果导致bc的运算符号乱序。
--//实际上按照顺序排列就可以,现在这样保证dc,bc的计算结果一致。
--//参数5等于all,显示全部结果。
#! /bin/bash
all=${5:-0}
#echo $all
numbers=($1 $2 $3 $4)
numlist=$(mktemp)
for n1 in {0..3};do
for n2 in {0..3};do
for n3 in {0..3};do
for n4 in {0..3}
do
if [ "$n1" != "$n2" -a "$n1" != "$n3" -a "$n1" != "$n4" -a "$n2" != "$n3" -a "$n2" != "$n4" -a "$n3" != "$n4" ]
then
echo "n1=${numbers[$n1]};n2=${numbers[$n2]};n3=${numbers[$n3]};n4=${numbers[$n4]}"
fi
done
done
done
done | sort| uniq >| ${numlist}
#/bin/cp ${numlist} e3.txt
oplist=$(mktemp)
ops=( "+" "*" "-" "/")
for n1 in {0..3};do
for n2 in {0..3};do
for n3 in {0..3};do
echo "p1='${ops[$n1]}';p2='${ops[$n2]}';p3='${ops[$n3]}'"
done
done
done >| ${oplist}
#/bin/cp ${oplist} e4.txt
result='bad'
## method 1: ((n1 p1 n2 ) p2 n3) p3 n4
## method 2: ( n1 p1 n2 ) p3 (n3 p2 n4)
## method 3: ( n1 p2 (n2 p1 n3)) p3 n4
## method 4: n1 p3 (n2 p2 (n3 p1 n4))
## method 5: n1 p3 ((n2 p1 n3) p2 n4)
for i in {1..5}
do
while read line1
do
eval $line1
while read line2
do
eval $line2
case $i in
1)
exp_bc="(( $n1 $p1 $n2 ) $p2 $n3 ) $p3 $n4"
exp_dc="$n1 $n2 $p1 $n3 $p2 $n4 $p3"
;;
2)
exp_bc="( $n1 $p1 $n2 ) $p3 ( $n3 $p2 $n4 )"
exp_dc="$n1 $n2 $p1 $n3 $n4 $p2 $p3"
;;
3)
exp_bc="( $n1 $p2 ( $n2 $p1 $n3 )) $p3 $n4"
exp_dc="$n1 $n2 $n3 $p1 $p2 $n4 $p3"
;;
4)
exp_bc="$n1 $p3 ( $n2 $p2 ( $n3 $p1 $n4 ))"
exp_dc="$n1 $n2 $n3 $n4 $p1 $p2 $p3"
;;
5)
exp_bc="$n1 $p3 (( $n2 $p1 $n3 ) $p2 $n4 )"
exp_dc="$n1 $n2 $n3 $p1 $n4 $p2 $p3"
;;
esac
#echo "scale=20 ; $exp_bc / 1 "
#echo "scale=20 ; $exp_dc 1 / pq"
#res_bc=$(echo "scale=20; $exp_bc / 1" | bc 2>/dev/null)
res_dc=$(echo "20k $exp_dc 1 / pq" | dc 2>/dev/null)
#echo ${res}
#if [ "${res_dc}" = '24.00000000000000000000' -a "$res_bc" = "$res_dc" ]
#if [ "${res_bc}" = '24.00000000000000000000' ]
if [ "${res_dc}" = '24.00000000000000000000' ]
then
echo "$1 $2 $3 $4 :method $i: $exp_dc : $exp_bc"
result='ok'
#return 1
fi
if [ $result = 'ok' -a ${all} != 'all' ]
then
/bin/rm ${numlist} ${oplist}
exit 1
fi
done < ${oplist}
done < ${numlist}
done
if [ $result != 'ok' ]
then
echo "$1 $2 $3 $4 : fail"
fi
/bin/rm ${numlist} ${oplist}
#echo "end!!"