#!/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