# The Tic Tac Toe Dictionary

((],~':',~1":[){&'DOX'@(</+2*>/)@:(<./"1)@:(((2{m/.@|.),(2{m/.),m"1,>./)"2)@(<:@(>:%2|]),:(%(2|>:)))@(3 3$]))"1((i.!9)A.i.9)  X win, O win and Draw counts check out. Was a bit painful to debug though. :) ## Ruby 1.9, 201 characters r=*[*l=0..8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6].each_slice(3) w=->a{r.any?{|b|b&a==b}} [*l].permutation(9){|a|u=[[],[]];i=-1 u[i%2]<<a[i+=1]while !((x=w[u[1]])||o=w[u[0]])&&i<8 puts a*""+":#{x ??X:o ??O:?D}"}  Slightly golfed so far. Takes about 45 seconds to complete here. • Edit: (268 -> 249) Write to stdout instead of a file • Edit: (249 -> 222) Don't pre-fill the array with each player's moves. • Edit: (222 -> 208) Shorter way to find out if a player won • Edit: (208 -> 213) Back to 213, the previous solution was too slow. • Edit: (213 -> 201) Some rearrangements, removed whitespace ## Haskell, 224 222 characters import Data.List p=sort.permutations a(e:_:z)=e:a z;a z=z [c,d]%(e:z)|any((elemwords"012 345 678 036 147 258 048 246").take 3).p.a.reverse$e=c|1<3=[d,c]%z;_%[]='D'
main=putStr\$p['0'..'8']>>=(\s->s++':':"OX"%inits s:"\n")


Alas, the permutations function from Data.List doesn't produce permutations in lexographic order. So I had to expend 6 characters on the sort.