#!/bin/bash
# your code goes here
passvar=
function isunique () { #判斷一列是否有重複的數字出現
tmp=$@
remove_the_same=`echo $tmp | tr " " "\n" | sort -u | tr "\n" " "`
tmp=`echo $tmp | tr " " "\n" | sort | tr "\n" " "`
if [ "${#tmp}" -ne "${#remove_the_same}" ]; then
passvar=1
else
passvar=0
fi
}
while true; do #讀取許多組數獨
arr_hori=() #存取橫列的陣列
yesno=0 #最後結果
for i in `seq 1 9`; do #讀取數獨每一列
read tmp
arr_hori+=(["$i"]=$tmp)
done
for i in `seq 1 9`; do #判斷數獨每一列是否有重複
isunique ${arr_hori["$i"]}
if [ $passvar -eq 1 ]; then
break
break
fi
done
arr_ver=() #存取直行的陣列
for i in `seq 1 9`; do #將數獨的每一個直行存入arr_ver
for j in `seq 1 9`; do
tmp=`echo ${arr_hori["$j"]} | cut -d ' ' -f $i`
row=`echo "$row $tmp"`
done
arr_ver+=(["$i"]=$row)
row=
done
for i in `seq 1 9`; do #判斷數獨每一行是否有重複
isunique ${arr_ver["$i"]}
if [ $passvar -eq 1 ]; then
yesno=1
break
break
fi
done
arr_sudoku=() #存取九宮格的陣列
#以下將數獨的九宮格中的數字存入arr_sudoku
for i in `seq 1 3 9`; do #1,4,7
for j in `seq 1 3 9`; do #1,4,7
for k in `seq 0 2`; do #0,1,2
num1=$((i + k))
num2=$((j + 2))
tmp=`echo ${arr_hori["$num1"]} | cut -d ' ' -f $j-$num2`
row=`echo "$row $tmp"`
done
if [ $j -eq 1 ]; then
ind=0
elif [ $j -eq 4 ]; then
ind=1
else
ind=2
fi
ind=$((i + ind))
arr_sudoku+=(["$ind"]="$row")
row=
done
done
for i in `seq 1 9`; do #判斷每個小九宮格是否有重複
isunique ${arr_sudoku["$i"]}
if [ $passvar -eq 1 ]; then
yesno=1
break
break
fi
done
if [ $yesno -eq 0 ]; then #判斷最後結果
echo "yes"
else
echo "no"
fi
read nline #讀取一個空行
if [ $? -ne 0 ]; then #如果連空行都沒有表示沒有下一組數獨
break
fi
done