#!/bin/bash # 入力された数字は$1に入っているので、その文字数の確認をします count=${#1} if test $count -ne 4 ; then echo "入力された $1 は4桁の数ではありません。" echo 'もう一度入力してください。' exit 1 fi echo "$1 ;" # cutコマンドを使って、4つの数字を1つずつ変数に代入します n1=`echo $1 | cut -c1` n2=`echo $1 | cut -c2` n3=`echo $1 | cut -c3` n4=`echo $1 | cut -c4` # ここから実際の計算に入りますが、普通に考えても # 3つの演算子の組み合わせで3^3=27通り、 # 括弧の付け方だけでも # (ab)cd (abc)d a(bc)d a(bcd) ab(cd) # (ab)(cd) ((ab)c)d (a(bc))d a((bc)d) a(b(cd)) の10通りあるので # ひとまず演算子の組み合わせを繰り返し処理で # 代入できるようにします # # そこでi,j,kの3つの演算子を代入する変数を使います # すでにquiz2.txtが存在する場合は内容のクリア if test -e quiz2.txt ; then cat /dev/null >quiz2.txt fi # 括弧がない計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr $n1 "$i" $n2 "$j" $n3 "$k" $n4` # ifコマンドで、$ans が10ならばechoで式を表示させます if test $ans -eq 10 ; then # echoで計算結果をquiz2.txtに書き込みます echo "$n1 $i $n2 $j $n3 $k $n4" >> quiz2.txt fi done done done # 以降は10通りの括弧のつけ方を # 手入力で計算させました # (ab)cdの計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr \( $n1 "$i" $n2 \) "$j" $n3 "$k" $n4` if test $ans -eq 10 ; then echo "($n1 $i $n2) $j $n3 $k $n4" >> quiz2.txt fi done done done # (abc)dの計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr \( $n1 "$i" $n2 "$j" $n3 \) "$k" $n4` if test $ans -eq 10 ; then echo "($n1 $i $n2 $j $n3) $k $n4" >> quiz2.txt fi done done done # a(bc)dの計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr $n1 "$i" \( $n2 "$j" $n3 \) "$k" $n4` if test $ans -eq 10 ; then echo "$n1 $i ($n2 $j $n3) $k $n4" >> quiz2.txt fi done done done # a(bcd)の計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr $n1 "$i" \( $n2 "$j" $n3 "$k" $n4 \)` if test $ans -eq 10 ; then echo "$n1 $i ($n2 $j $n3 $k $n4)" >> quiz2.txt fi done done done # ab(cd)の計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr $n1 "$i" $n2 "$j" \( $n3 "$k" $n4 \)` if test $ans -eq 10 ; then echo "$n1 $i $n2 $j ($n3 $k $n4)" >> quiz2.txt fi done done done # (ab)(cd)の計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr \( $n1 "$i" $n2 \) "$j" \( $n3 "$k" $n4 \)` if test $ans -eq 10 ; then echo "($n1 $i $n2) $j ($n3 $k $n4)" >> quiz2.txt fi done done done # ((ab)c)dの計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr \( \( $n1 "$i" $n2 \) "$j" $n3 \) "$k" $n4` if test $ans -eq 10 ; then echo "$n1 $i $n2 $j $n3 $k $n4" >> quiz2.txt fi done done done # (a(bc))dの計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr \( $n1 "$i" \( $n2 "$j" $n3 \) \) "$k" $n4` if test $ans -eq 10 ; then echo "($n1 $i ($n2 $j $n3)) $k $n4" >> quiz2.txt fi done done done # a((bc)d)の計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr $n1 "$i" \( \( $n2 "$j" $n3 \) "$k" $n4 \)` if test $ans -eq 10 ; then echo "$n1 $i (($n2 $j $n3) $k $n4)" >> quiz2.txt fi done done done # a(b(cd))の計算 for i in + - '*' do for j in + - '*' do for k in + - '*' do ans=`expr $n1 "$i" \( $n2 "$j" \( $n3 "$k" $n4 \) \)` if test $ans -eq 10 ; then echo "$n1 $i ($n2 $j ($n3 $k $n4))" >> quiz2.txt fi done done done # 最後に、10になる計算があればquiz2.txtに書き込まれているはずなので、 # ファイルのサイズは0より大きいはずで # それが条件文 test -s file です # それ以外の場合(サイズが0のとき)は計算式が存在しないと表示されます if test -s quiz2.txt ; then cat < quiz2.txt # quiz2.txtの行数をカウントして計算式が何個あるか調べます result_number=`wc -l < quiz2.txt` echo "$result_number 個の計算式が存在します。" else echo "計算結果が10になる式は存在しません。" fi