转载

井字棋解法(补充)

还是井字棋
http://blog.itpub.net/29254281/viewspace-1852817/


今天和王工相互印证之下,发现原来的SQL还是有点问题.
1.原来的SQL没有计算平局的情况
2.我对于棋盘的理解有错误.
下面这个棋盘(Board)

MOVES=3175968,

BOARD=XOXOXOX,

WINNER=X


其实应该是O-X-OOXXX
居然把题目理解错了...

3.还有一个bug.假如先手和后手走完了整个棋局,那么先手下了五个子,而后手仅仅下了四个子.

所以原来SQL的这个部分,标红加粗部分应该删除.
  1.     select n1.id||n2.id||n3.id||n4.id||n5.id||n6.id||n7.id||n8.id||n9.id moves,  
  2.     n1.id||n3.id||n5.id||n7.id||n9.id X,  
  3.     n2.id||n4.id||n6.id||n8.id||n9.id O,  

其实应该是
  1.     select n1.id||n2.id||n3.id||n4.id||n5.id||n6.id||n7.id||n8.id||n9.id moves,  
  2.     n1.id||n3.id||n5.id||n7.id||n9.id X,  
  3.     n2.id||n4.id||n6.id||n8.id O,  

所以经过修正之后的SQL,应该如下:
  1. create table t1 as     
  2. with nums as (    
  3.     select level id from dual connect by level<=9    
  4. ),    
  5. MOVES as(    
  6.     select n1.id||n2.id||n3.id||n4.id||n5.id||n6.id||n7.id||n8.id||n9.id moves,    
  7.     n1.id||n3.id||n5.id||n7.id||n9.id X,    
  8.     n2.id||n4.id||n6.id||n8.id O   
  9.     from     
  10.     nums n1,    
  11.     nums n2,    
  12.     nums n3,    
  13.     nums n4,    
  14.     nums n5,    
  15.     nums n6,    
  16.     nums n7,    
  17.     nums n8,    
  18.     nums n9    
  19.     where     
  20.     (n1.id!=n2.id and n1.id!=n3.id and n1.id!=n4.id and n1.id!=n5.id and n1.id!=n6.id and n1.id!=n7.id and n1.id!=n8.id and n1.id!=n9.id) and     
  21.     (n2.id!=n1.id and n2.id!=n3.id and n2.id!=n4.id and n2.id!=n5.id and n2.id!=n6.id and n2.id!=n7.id and n2.id!=n8.id and n2.id!=n9.id) and     
  22.     (n3.id!=n2.id and n3.id!=n1.id and n3.id!=n4.id and n3.id!=n5.id and n3.id!=n6.id and n3.id!=n7.id and n3.id!=n8.id and n3.id!=n9.id) and     
  23.     (n4.id!=n2.id and n4.id!=n3.id and n4.id!=n1.id and n4.id!=n5.id and n4.id!=n6.id and n4.id!=n7.id and n4.id!=n8.id and n4.id!=n9.id) and     
  24.     (n5.id!=n2.id and n5.id!=n3.id and n5.id!=n4.id and n5.id!=n1.id and n5.id!=n6.id and n5.id!=n7.id and n5.id!=n8.id and n5.id!=n9.id) and     
  25.     (n6.id!=n2.id and n6.id!=n3.id and n6.id!=n4.id and n6.id!=n5.id and n6.id!=n1.id and n6.id!=n7.id and n6.id!=n8.id and n6.id!=n9.id) and     
  26.     (n7.id!=n2.id and n7.id!=n3.id and n7.id!=n4.id and n7.id!=n5.id and n7.id!=n6.id and n7.id!=n1.id and n7.id!=n8.id and n7.id!=n9.id) and     
  27.     (n8.id!=n1.id and n8.id!=n3.id and n8.id!=n4.id and n8.id!=n5.id and n8.id!=n6.id and n8.id!=n7.id and n8.id!=n2.id and n8.id!=n9.id) and    
  28.     (n9.id!=n2.id and n9.id!=n3.id and n9.id!=n4.id and n9.id!=n5.id and n9.id!=n6.id and n9.id!=n7.id and n9.id!=n8.id and n9.id!=n1.id)      
  29. ),    
  30. v1 as (    
  31.     select m.*,    
  32.     translate(m.X,'123456789','1__4__7__') xc1,     
  33.     translate(m.X,'123456789','_2__5__8_') xc2,     
  34.     translate(m.X,'123456789','__3__6__9') xc3,     
  35.     translate(m.X,'123456789','1___5___9') xc4,     
  36.     translate(m.X,'123456789','__3_5_7__') xc5,    
  37.     translate(m.X,'123456789','123______') xc6,    
  38.     translate(m.X,'123456789','___456___') xc7,    
  39.     translate(m.X,'123456789','______789') xc8,    
  40.     translate(m.O,'123456789','1__4__7__') oc1,     
  41.     translate(m.O,'123456789','_2__5__8_') oc2,     
  42.     translate(m.O,'123456789','__3__6__9') oc3,     
  43.     translate(m.O,'123456789','1___5___9') oc4,     
  44.     translate(m.O,'123456789','__3_5_7__') oc5,    
  45.     translate(m.O,'123456789','123______') oc6,    
  46.     translate(m.O,'123456789','___456___') oc7,    
  47.     translate(m.O,'123456789','______789') oc8    
  48.     from moves m    
  49. ),    
  50. score as (    
  51.     select     
  52.     v1.*,    
  53.     least(    
  54.         decode(regexp_instr(xc1,'[1-9]',1,3) ,0,999,regexp_instr(xc1,'[1-9]',1,3)),    
  55.         decode(regexp_instr(xc2,'[1-9]',1,3) ,0,999,regexp_instr(xc2,'[1-9]',1,3)),    
  56.         decode(regexp_instr(xc3,'[1-9]',1,3) ,0,999,regexp_instr(xc3,'[1-9]',1,3)),    
  57.         decode(regexp_instr(xc4,'[1-9]',1,3) ,0,999,regexp_instr(xc4,'[1-9]',1,3)),    
  58.         decode(regexp_instr(xc5,'[1-9]',1,3) ,0,999,regexp_instr(xc5,'[1-9]',1,3)),    
  59.         decode(regexp_instr(xc6,'[1-9]',1,3) ,0,999,regexp_instr(xc6,'[1-9]',1,3)),    
  60.         decode(regexp_instr(xc7,'[1-9]',1,3) ,0,999,regexp_instr(xc7,'[1-9]',1,3)),    
  61.         decode(regexp_instr(xc8,'[1-9]',1,3) ,0,999,regexp_instr(xc8,'[1-9]',1,3))    
  62.     
  63.     ) xscore,    
  64.     least(    
  65.         decode(regexp_instr(oc1,'[1-9]',1,3) ,0,999,regexp_instr(oc1,'[1-9]',1,3)),    
  66.         decode(regexp_instr(oc2,'[1-9]',1,3) ,0,999,regexp_instr(oc2,'[1-9]',1,3)),    
  67.         decode(regexp_instr(oc3,'[1-9]',1,3) ,0,999,regexp_instr(oc3,'[1-9]',1,3)),    
  68.         decode(regexp_instr(oc4,'[1-9]',1,3) ,0,999,regexp_instr(oc4,'[1-9]',1,3)),    
  69.         decode(regexp_instr(oc5,'[1-9]',1,3) ,0,999,regexp_instr(oc5,'[1-9]',1,3)),    
  70.         decode(regexp_instr(oc6,'[1-9]',1,3) ,0,999,regexp_instr(oc6,'[1-9]',1,3)),    
  71.         decode(regexp_instr(oc7,'[1-9]',1,3) ,0,999,regexp_instr(oc7,'[1-9]',1,3)),    
  72.         decode(regexp_instr(oc8,'[1-9]',1,3) ,0,999,regexp_instr(oc8,'[1-9]',1,3))    
  73.     ) oscore    
  74.     from v1    
  75. )    
  76. select distinct    
  77. case when xscore<=oscore then substr(score.moves,0,xscore*2-1) else substr(score.moves,0,2*oscore) end moves,    
  78. regexp_replace(  
  79.   regexp_replace(  
  80.     regexp_replace('123456789','['||case when xscore<=oscore then substr(x,0,xscore) else substr(x,0,oscore) end||']','X')  
  81.     ,'['||case when xscore<=oscore then substr(o,0,xscore-1) else substr(o,0,oscore) end||']','O'),'[1-9]','-') board,  
  82. case when xscore=oscore and oscore=999 then '-' when xscore<=oscore then 'X' else 'O' end winner    
  83. from score;    

用时:309s
结果:
select winner,count(*) from t1 group by winner;
X 131184
- 46080
O 77904

井字棋解法(补充)

这个结果和王工计算的结果一致.应该是正确的.

正文到此结束
Loading...