The Tic Tac Toe Dictionary
J, 124 chars
((],~':',~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((`elem`words"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.