[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!!"


posted @ 2025-05-29 20:26  lfree  阅读(13)  评论(0)    收藏  举报