首页 > > > 等你来战!ITPUB第3届SQL大赛开启

2011年ITPUB社区主办了第1届“盛拓传媒杯”SQL数据库编程大赛,2013举办了第2届,活动受到了广大社区会员的支持和热情参与,很多人依然记得之前热闹的场景,应广大会员要求,今年继续组织SQL数据库编程大赛。欢迎各路高手各显神通!

盛拓传媒是中国领先的互联网传媒集团,以传媒和互联网的力量,帮助消费者提高生活品质和工作效率是其使命。盛拓传媒拥有两家IT领域专业垂直网站(IT168、泡泡网PCPOP),在全国各个主要城市均设有分支机构,覆盖国内几乎所有的目标人群,拥有无可比拟的影响力和传播力,是中国最具价值的互联网专业传媒航母。

1995年参加工作,2001年转到IT部门从事c/c++软件开发,2004年开始做系统分析和Oracle数据库方面工作。参加过多个全国性普查数据处理项目的开发和运维,目前主要从事统计报表联网填报系统的后台支持。

现居加拿大多伦多,长期活跃于开发板为网友答疑解难,坚持每天贡献PL/SQL CHALLENGE 每日一题,曾参与撰写itpub系列丛书:剑破冰山:Oracle开发艺术。

拥有8年电信行业从业经验,在某大型电信系统提供商工作7年,任资深工程师,从事过系统开发与维护、业务架构和数据分析、系统优化等工作。擅长基于ORACLE的系统优化,精通SQL、PL/SQL、JAVA等。
▎赛事流程:
活动流程
1、发布本期活动题目及答题时间范围,大家可以在此期间根据以上参与规则上传自己的参赛程序文档。
2、结束答题,进入评审阶段,评审将在10天内对所有参赛程序进行评审,并给予点评。
3、公布评审结果及部分作品点评。
评审规则
1、由ITPUB论坛助理丸喵喵下载参赛者附件并解压后隐去参赛者ID,将各参赛文档重编序号发布给评委。
2、所有评委独立对运行出正确答案的程序打分,把相应分数告知论坛助理。论坛助理取平均数为该答案最后得分。
评审依据
1.用一句SQL实现,通俗易通,可读性(20分)(禁止在代码中包含参赛者ID、昵称等可能标识参赛者身份的信息)
2.解决问题的思路(20分)
3.解决问题的正确性和完善程度(40分)
4.性能(20分)
具体标准可能根据赛题进行适当调整。
▎奖项设置:
一等奖
500元京东礼品卡,2016中国数据库技术大会门票一张、并授予“ITPUB SQL数据库编程大师”的称号,奖励专属徽章以标识身份;
二等奖
300元京东礼品卡,2016中国数据库技术大会门票一张、并授予“ITPUB SQL数据库编程大师”的称号,奖励专属徽章以标识身份;
三等奖
200元京东礼品卡,2016中国数据库技术大会门票一张、并授予“ITPUB SQL数据库编程大师”的称号,奖励专属徽章以标识身份;
四等奖
100元京东礼品卡,2016中国数据库技术大会门票一张、并授予“ITPUB SQL数据库编程大师”的称号,奖励专属徽章以标识身份;
参与奖
每位参与的会员均可获赠IT168纪念连帽衫一件、所有参与的会员均可得到一枚参与徽章。

▎题目设置:
两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的井字格上打自己的符号,最先以任意一行、一列或对角线连成一线则为胜。规定X先手。
一个终局棋谱(MOVES)指的是从开始下子到一方获胜或者下完9个子出现平局,从头到尾的下子情况。一方获胜后,本局即终止。不得提前认输。
格子从上到下,从左到右,依次编号1-9
MOVES的第一位表示第一子位置,第二位表示第二子位置,......如果一方获胜,MOVES的长度有可能<9。
局面(BOARD)表示棋盘上呈现的局面,也是按照从上到下,从左到右排列。用X和0填入相应的格子。减号“-” 表示空位。
这里有个棋局:

表示出来是:
MOVES=3175968,
BOARD=O-X-OOXXX,
WINNER=X
比赛环境及功能要求:
在oracle 数据库10g及以上版本上成功运行,SQL中尽量避免使用12c的带有PL/SQL函数的WITH子查询。在WITH中使用了PL/SQL函数的答案将被扣10分。若要使用字符串拼接,应当使用listagg函数,不得使用wm_concat未公开函数。
若没有oracle 数据库测试环境,可以从此链接下载:
http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html
第一题(100分):求出所有可能终局棋谱和相应的局面,插入如下的表中:
CREATE TABLE TICTACTOE (MOVES VARCHAR2(9) PRIMARY KEY,BOARDVARCHAR2(9),WINNER VARCHAR2(1));
格式要求:
首先CREATE 上述TICTACTOE表。然后用一个能直接放在“insert into TICTACTOE ”后面成功运行的SQL查询语句,一次性插入所有满足标准的棋谱和相应的局面、胜者(WINNER=X或O或D,其中D表示平局)
注意:本题要求生成所有可能的终局棋谱,只要符合规则即可,哪怕其中有些走法可能看起来很愚蠢,也得包含进去。还没下完的棋谱不要列入。
如果两个终局的局面(BOARD)相同,但是其下子顺序(MOVES)不同,则视为不同棋谱,两个都必须出现在结果中。
如果两个棋谱的MOVES不同,但是其终局局面(BOARD)经过旋转、翻转后重合,仍然被视为不同棋谱,两个都必须出现在结果中。
第二题(100分):给定一个局面,假定该局面一定为有效(不会出现一方比另一方多两子的情况,或者两方都有三子连线的情况),用SQL判断出哪一方有必胜策略,以及获胜方最多再下几子必定会获胜。比如输入:V_BOARD='X-0------' 则输出'X3',表示WINNER=X,下子数=3,因为不管对手怎么走,X最多再下3子一定获胜。(不计入O再下的子数)
如果O方有失误,也有可能X再下两子就取胜的;X方也有可能下错而输掉,但这些都不在本题考虑范围,假定双方都是完美棋手,即双方都尽可能取胜,不能取胜则尽可能求和,不能求和则尽可能多下几子。
如果给定的局面中一方已经获胜,则输出获胜方符号和子数0,例如输入:V_BOARD='OXX—XOOX', 则输出'X0'
如果不存在必胜策略(比如一个空局:V_BOARD='---------'),则输出'D'。
输出中都不含单引号。
格式要求:
首先在sqlplus中声明变量var v_BOARDvarchar2(9),再对变量赋值(如:exec :v_BOARD:='X-O------')。然后用一个包含变量v_BOARD的查询语句,返回对应此棋局的结果字符串(X数字,或O数字,或D表示平局)
m,n,k游戏是指两个对手在m*n的棋盘上轮流下子,谁先在纵、横、四十五度斜线上连续取得k个子就获胜的一种游戏,井字棋游戏其实就是3,3,3的一种特例。五子棋则为15,15,5游戏。
上述第二题中,如果SQL能够适用于m,n,k大于等于3的情况,则可获得10分的附加分。

原文作者:;如有侵权,请联系管理员删除。