猛砸数独简化 [英] Bash simplified sudoku

查看:189
本文介绍了猛砸数独简化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,我必须写一个bash脚本来检查,如果一个9x9的数独的解决方案是有效的,但简化的是,我没有把它分成3x3的,但只是检查是否行和列包含任何重复号码和有效数字只有1-9 ..

这是我脑子里想的,但无法得到它的工作:

 #!/斌/庆典
错误=假
数= 0
#此将是列
#for i的1 2 3 4 5 6 7 8 9
#做
#cat sudoku.txt | awk的-F\\ t的'{$打印'$ I'}'| uniq的-c | awk的'$ 1> 1 {算++} END {打印计数}
#done#,然后这将是行
因为我在1 2 3 4 5 6 7 8 9

猫sudoku.txt | AWK'{打印FNR = $'$ I'}'| uniq的-c |
 awk的'$ 1> 1 {算++} END {打印计数}'|
 AWK'计数> 0 {$错误=真} END {$打印I}'|
 AWK'{如果($错误=真),打印错误的数据!否则打印正确的数据! }
DONE


解决方案

  $ AWK'
    功能检查(NUM){        返回NUM!= 45? 1:0;
    }
    {
        排= 0;
        对于(i = 1; I< = 9;我++){
            行+ = $ I;
            COL [I] + = $ I;
        }
        如果(检查(行)大于0){
            错误[++ error_len] = sprintf的(错误路线%S:%S,FNR,$ 0);
        }
    }
    结束 {
        对于(i = 1; I< = 9;我++){
            如果(检查(行)大于0){
                错误[++ error_len] = sprintf的(错误列%S:%S,我,COL [I]);
            }
        }
        如果(error_len){
            对于(i = 0; I< = error_len;我++){
                打印(错误[I]);
            }
        }
        其他{
            打印(都好);
        }
    }
数独
错误行4:6 7 1 4 8 2 6 9 3$数独猫
8 1 2 9 7 4 3 6 5
9 3 4 5 6 7 1 8 2
7 6 5 8 2 3 9 4 1
6 7 1 4 8 2 6 9 3'; - 在这里看到6那一个错误:
2 8 9 3 6 5 4 1 7
6 4 3 7 1 9 2 5 8
1 9 6 5 3 7 8 2 4
3 2 8 1 4 6 5 7 9
4 5 7 2 9 8 1 3 6

So,I have to write a bash script to check if a 9x9 "sudoku" solution is valid,but the simplification is that I don't have to divide it into 3x3,but just check if rows and columns contain any duplicate numbers,and valid numbers are only 1-9..

this is what I had in mind,but couldn't get it working:

    #!/bin/bash
error="false"
count=0
#this would be for columns
#for i in 1 2 3 4 5 6 7 8 9 
#do
#cat sudoku.txt | awk -F "\t" '{ print $'$i'}' | uniq -c | awk '$1 > 1 { count++ } END { print count }'
#done

#and this would be for rows
for i in 1 2 3 4 5 6 7 8 9 
do
cat sudoku.txt | awk '{ print FNR=$'$i'}' | uniq -c |
 awk '$1 > 1 { count++ } END { print count }' |
 awk ' count > 0 { $error="true" } END { print $i  }' | 
 awk '{ if ($error = "true")   print "Wrong data!";  else   print "Correct data!"; } '
done

解决方案

$ awk '
    function check(num) {

        return num != 45 ? 1 : 0;
    }
    {
        row = 0;
        for (i = 1; i <= 9; i++) {
            row += $i;
            col[i] += $i;
        }
        if (check(row) > 0) {
            errors[++error_len] = sprintf("error in line %s: %s", FNR, $0);
        }
    }
    END {
        for (i = 1; i <= 9; i++) {
            if (check(row) > 0) {
                errors[++error_len] = sprintf("error in column %s: %s", i, col[i]);
            }
        }
        if (error_len) {
            for (i = 0; i <= error_len; i++) {
                print(errors[i]);
            }
        }
        else {
            print("all good");
        }
    }
' sudoku
error in line 4: 6 7 1 4 8 2 6 9 3

$ cat sudoku
8 1 2 9 7 4 3 6 5  
9 3 4 6 5 1 7 8 2  
7 6 5 8 2 3 9 4 1  
6 7 1 4 8 2 6 9 3 <-- see the 6 here thats an error:
2 8 9 3 6 5 4 1 7  
6 4 3 7 1 9 2 5 8
1 9 6 5 3 7 8 2 4  
3 2 8 1 4 6 5 7 9  
4 5 7 2 9 8 1 3 6

这篇关于猛砸数独简化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆