Code Golf:验证Sudoku Grid

mar*_*cog 17 algorithm code-golf sudoku

介绍

有效的数独网格填充数字1到9,在9,行或列的每个子块中没有数字出现多次.如果您不熟悉这个流行的谜题,请阅读本文以获取更多详细信息.

挑战

挑战是编写最短的程序来验证可能未满的Sudoku网格.

输入将是一行9行,每行9个字符,代表网格.空单元格将由a表示..您的输出应该是Valid网格有效,否则输出Invalid.

输入

123...789
...456...
456...123
789...456
...123...
564...897
...231...
897...564
...564...
Run Code Online (Sandbox Code Playgroud)

产量

Valid
Run Code Online (Sandbox Code Playgroud)

输入

123456789
987654321
123456789
123456789
987654321
123456789
123456789
987654321
123456789
Run Code Online (Sandbox Code Playgroud)

产量

Invalid
Run Code Online (Sandbox Code Playgroud)

代码高尔夫规则

请以解决此问题的任何语言发布您的最短代码.输入和输出可以通过stdin和stdout或您选择的其他文件来处理.

获胜者将是在发布此问题之前存在实现的语言中最短的解决方案(按字节数).因此,虽然您可以自由地使用您刚刚编写的语言来提交一个0字节的解决方案,但它不会计算,您可能会得到downvotes.

Nab*_*abb 11

Golfscript:56

n%{zip''+9/.{'.'-..&=}%$0=\}:|2*{3/}%|;**"InvV"3/="alid"
Run Code Online (Sandbox Code Playgroud)


650*_*502 9

C:165 162 161 160 159

int v[1566],x,y=9,c,b;main(){while(y--)for(x=9;x--+1;)if((c
=getchar()*27)>1242)b|=v[x+c]++|v[y+9+c]++|v[x-x%3+y/3+18+c]
++;puts(b?"Invalid":"Valid");return 0;}
Run Code Online (Sandbox Code Playgroud)

不需要这两个换行符.由josefx保存的一个char :-) ...

  • 它甚至在最后返回0!这样的举止!:) (4认同)
  • 我的最后一次尝试:替换x - > - 1; 用x - + 1; (2认同)

Joe*_*ams 6

Haskell:207 230 218 195 172

import List
t=take 3
h=[t,t.drop 3,drop 6]
v[]="V"
v _="Inv"
f s=v[1|v<-[s,transpose s,[g=<<f s|f<-h,g<-h]],g<-map(filter(/='.'))v,g/=nub g]++"alid\n"
main=interact$f.lines
Run Code Online (Sandbox Code Playgroud)

  • 并再次:用`Mon`替换`Data.List`和用'Monad`替换`Control.Monad`.删除let并将h作为顶级声明.将do-notation更改为显式monad.但确实非常好. (2认同)

hob*_*bbs 5

Perl:168 128

$_=join'',<>;@a=/.../g;print+(/(\d)([^\n]{0,8}|(.{10})*.{9})\1/s
+map"@a[$_,$_+3,$_+6]"=~/(\d).*\1/,0..2,9..11,18..20)?Inv:V,alid
Run Code Online (Sandbox Code Playgroud)

第一个正则表达式检查同一行和列中的重复项; 第二个正则表达式处理"相同框"中的重复.

通过将\n第一个正则表达式替换为文字换行符(1个字符),或者使用> = Perl 5.12替换[^\n]\N(3个字符),可以进一步改进

早期,168 char解决方案:输入来自stdin,输出是stderr,因为它使事情变得如此简单.换行符是可选的,不计算在内.

$_=join'',<>;$m=alid.$/;$n=Inv.$m;/(\d)(\N{0,8}|(.{10})*.{9})\1/s&&
die$n;@a=/.../g;for$i(0,8,17){for$j($i..$i+2){
$_=$a[$j].$a[$j+3].$a[$j+6];/(\d).*\1/&&die$n}}die"V$m"
Run Code Online (Sandbox Code Playgroud)