2023数据库编程大赛-答辩总结
12月27日,NineData和云数据库技术社区主办,华为云、火山引擎、开源中国、云和恩墨、TDengine、云猿生数据、DORIS、ITPUB等协办单位和媒体,共同举办了本次《数据库编程大赛》。大赛题目「用一条SQL给出扑克牌24点的计算表达式」,截至比赛当天,本次大赛共收集了近200份SQL代码参赛报名。
比赛玩法
其中 result 字段是计算的表达式,只需返回1个解,如果没有解,result 返回null。具体比赛玩法参考:数据库编程大赛:一条SQL计算扑克牌24点
决赛答辩
8位种子选手入围
以下是本次数据库编程大赛的最终排名:
第8名
李家的张麻子
选手采用的是“人工”穷举算法。值得一提的是,该选手是少数成功使用ChatGPT生成SQL的。首先通过详细列举和排序的方式,全面呈现了所有可能性,并在此基础上由ChatGPT生成SQL代码,再进行适当调整。尽管这种方法稍显粗暴,但是打破常规,正确的运用AI,也是一种新颖的方式。
第7名
李立涵
4.对算式结果进行聚合
第6名
傅昌林
3. 随后按照具体的12条步骤生成最终结果。
第5名
张泽鹏
本算法用了取巧的方法:提前计算好4个1~10数值求24的结果,执行查询时,直接通过特征向量来查询;思路类似于“相似图片搜索”,先提前计算好图片库中每张图片的特征向量,后续通过特征向量做相似搜索即可。
算法原理如下:
1. 预计算:因为`result`中数值的顺序无关,因此先对`10 ^ 4 = 10000`个数组做无序去重,获得715个顺序无关的数组;经过计算可得715中只有566个组合能计算出`24`。
2. 将这566个公式预置在SQL文件中,即代码中的`expressions(result)`。
3. 提取公式的特征向量
4. 得知最终测试数据集内会包含重复的题目(即c1、c2、c3、c4)会有相同,这些相同的题目只计算一次。即代码中`rounds(ids, c1, c2, c3, c4)`。
5. 用相同的方法,计算`rounds`中每道题目的特征向量,即代码中的`rounds_features(ids, features)`。
6. 然后根据特征向量,`rounds_features`从`results`中匹配出结果,并展开得到每道题目的结果`cards_results(id, result)`。
第4名
郭其
参赛选手:郭其
选手简介:中国移动设计院 数据库技术专家负责人
参赛数据库:Oracle
第3名
参赛选手:卢涛
选手简介:ITPUB Oracle开发版版主
参赛数据库:MySQL
1. 采取查表法,预先用其他方法((grubbyoo 编写的SQL ,552条6秒) (C语言566条0.3秒))生成4个数四则运算能算出24点的组合,包括点数从小到大排序拼接成字符串和输出结果,把它保存在SQL的CTE表中备查。
3. 解决测试数据和已知结论对应关系。cards表包含数字1到10的全排列,共10000种。
第2名
柳胜勋
1. 生成存在的组合的答案集,转成json,并压缩,因为不压缩SQL过长。
2. 在SQL中,解压答案并转换成临时表,然后使用GROUP BY处理,强制走HASH JOIN。
3. 使用LEFT JOIN算出结果。
第1名
郑凌云
0. 核心:因为4张牌计算24点时的顺序可任意互换,所以不同排列的4张牌可视为同一组合。采用质数编码,把1到10映射成2到29内的质数,4张牌的积可作为该组合的唯一编码
1. 本地写代码,通过简单的回溯算法,生成24点游戏的所有解:152,((1+1)+1)*8,156,(6*2)*(1+1),...
2. 受限于代码大小10k限制,通过把上一步生成的数据进行压缩:SELECT REPLACE(TO_BASE64(COMPRESS('152,((1+1)+1)*8,156,(6*2)*(1+1),...')), '\n', '')
3. 提交的代码中,先对上一步生成的数据解压缩:UNCOMPRESS(FROM_BASE64('XXXX')),并通过递归CTE生成查询表:152,((1+1)+1)*8;156,(6*2)*(1+1);...
《数据库编程大赛》
下一次再聚!
本次《数据库编程大赛》前30名通过正确性验证的选手,也是会获得一份精美礼品,感谢大家对本次大赛的关注和支持,我们下次再相聚!
END