楼主: 〇〇

[SQL] puzzleup 2016

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
21#
发表于 2016-7-29 09:08 来自手机 | 只看该作者
我本来想再出个附加题,两两相似的也算重复,这个恐怕只有 M 能做了

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
22#
 楼主| 发表于 2016-7-29 15:57 | 只看该作者
newkid 发表于 2016-7-29 09:06
这得问老头,如果整个九点一起旋转翻转,那就不能重合。

所以出题用五边形还是有道理的

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
23#
发表于 2016-7-29 22:45 | 只看该作者
〇〇 发表于 2016-7-29 15:57
所以出题用五边形还是有道理的

如果是判断全等,SQL还是有办法的,所有图形平移到最贴近原点再来比较就可以了。但是写起来很啰嗦。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
24#
发表于 2016-7-30 05:20 | 只看该作者
还有没有重复的?

PID2
------------------------
124
126
127
129
135
137
138
168
1254
1257
1265
1267
1268
1269
1287
1294
1297
1298
1358
1397
1538
1568
1658
2486
12538
12567
12568
12594
12597
12598
12657
12658
12675
12684
12685
12687
12694
12697
12945
12957
12958
12975
13567
13568
13597
15268
24586
125367
125368
125384
125387
125394
125397
125398
125684
125687
125694
125697
125984
126584
126594
126597
126598
126845
126857
126875
126945
126957
126984
1253684
1253687
1253984
1256984
1265984

74 rows selected.

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
25#
发表于 2016-7-30 12:47 | 只看该作者
判断交叉不会啊。。。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
26#
 楼主| 发表于 2016-8-3 20:39 | 只看该作者
No: 02       August 03, 2016

NUMBERED BALLS
There are 100 balls numbered from 1 to 100. You will randomly draw some of them without replacement. What is the minimum number of balls you need to draw in order to have probability of drawing at least two consecutive numbers greater than 50%?
[ You can answer this problem starting from Thursday at 11:00 (GMT) ]
第2题 数字球
有100个球,分别标着数字1-100.你要不放回地随机取出它们.如果要取出至少2个号码连续球的概率大于50%,至少要取几个球?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
27#
发表于 2016-8-3 21:49 | 只看该作者
虽然没有明确说,但是可以看出这个“连续”和取的顺序无关,也即最后取到的N个球至少“含有”两个连续数字。这就是个排列组合题,感觉从反向思考比较好下手,就是考虑所有都不连续(比如全是偶数,只含一个偶数,两个偶数,...)的组合数量。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
28#
发表于 2016-8-3 22:44 | 只看该作者
第一题附加题的SQL,



WITH c AS (  ---- 构造九个点坐标
SELECT ROWNUM AS cid,x,y
  FROM (
       SELECT x,y
         FROM (SELECT LEVEL x FROM DUAL CONNECT BY LEVEL<=3)
             ,(SELECT LEVEL y FROM DUAL CONNECT BY LEVEL<=3)
       ORDER BY x,y
       )
)
,lines AS (  ---- 枚举所有三点直线
SELECT 1 lid,'123' str FROM DUAL
UNION ALL SELECT 2,'456' FROM DUAL
UNION ALL SELECT 3,'789' FROM DUAL
UNION ALL SELECT 4,'147' FROM DUAL
UNION ALL SELECT 5,'258' FROM DUAL
UNION ALL SELECT 6,'369' FROM DUAL
UNION ALL SELECT 7,'159' FROM DUAL
UNION ALL SELECT 8,'357' FROM DUAL
)
,all_lines AS ( --- 直线上的三个点的全排列,比如123,132,321,...
SELECT REPLACE(SYS_CONNECT_BY_PATH(c,','),',') str
  FROM (
SELECT lid,SUBSTR(str,n,1) c
  FROM lines,(SELECT LEVEL n FROM DUAL CONNECT BY LEVEL<=3)
  )
WHERE LEVEL=3
CONNECT BY NOCYCLE lid=PRIOR lid AND C<>PRIOR C
)
,edges as ( ----- 九个点两两构成的所有的线段,两个方向都包括
SELECT c1.cid||c2.cid as eid
      ,c1.x,c1.y
      ,c2.x x2,c2.y y2
  FROM c c1,c c2
WHERE c1.cid<>c2.cid
)
,crossing as ( ----- 找出所有的交叉线段对, 参考https://segmentfault.com/a/1190000004457595
SELECT m1.eid eid1,m2.eid eid2
  FROM edges m1, edges m2
WHERE INSTR(m1.eid,SUBSTR(m2.eid,1,1))=0
       AND INSTR(m1.eid,SUBSTR(m2.eid,2,1))=0
       AND ((m1.x-m2.x)*(m1.y-m2.y2)-(m1.x-m2.x2)*(m1.y-m2.y))*((m1.x2-m2.x)*(m1.y2-m2.y2)-(m1.x2-m2.x2)*(m1.y2-m2.y))<=0
       AND ((m2.x-m1.x)*(m2.y-m1.y2)-(m2.x-m1.x2)*(m2.y-m1.y))*((m2.x2-m1.x)*(m2.y2-m1.y2)-(m2.x2-m1.x2)*(m2.y2-m1.y))<=0
)
,p (pid,vcnt) as ( ---- 递归构造所有多边形,包括重复的
select cast(cid as varchar2(10)) as pid,1 from c WHERE cid IN (1,2,5) ---- 因为结果要求去除对称重复,只需从这三个点开始
UNION ALL
SELECT p.pid||c.cid,p.vcnt+1
  FROM p,c
WHERE INSTR(p.pid,c.cid)=0
       AND NOT EXISTS (SELECT NULL FROM all_lines WHERE all_lines.str=SUBSTR(p.pid,-2)||c.cid) --- 排除直线
       AND NOT EXISTS (SELECT NULL FROM crossing WHERE INSTR(p.pid||c.cid,crossing.eid1)>0 AND INSTR(p.pid||c.cid,crossing.eid2)>0) ---- 排除交叉
)
,all_p AS ( --- 首尾衔接(加上最后一个端点到第一个端点的线段)后再去除交叉和直线
SELECT *
  FROM p
  WHERE vcnt>=3
        AND NOT EXISTS (SELECT NULL FROM crossing WHERE INSTR(p.pid||p.pid,crossing.eid1)>0 AND INSTR(p.pid||p.pid,crossing.eid2)>0)
        AND NOT EXISTS (SELECT NULL FROM all_lines WHERE INSTR(p.pid||p.pid,all_lines.str)>0)
)
,tp1 as ( ----- 九个点的旋转/翻转变形模版
SELECT '123456789' tp1 FROM DUAL
UNION ALL SELECT '741852963' tp1 FROM DUAL
UNION ALL SELECT '987654321' tp1 FROM DUAL
UNION ALL SELECT '369258147' tp1 FROM DUAL
UNION ALL SELECT '321654987' tp1 FROM DUAL
UNION ALL SELECT '789456123' tp1 FROM DUAL
UNION ALL SELECT '147258369' tp1 FROM DUAL
UNION ALL SELECT '963852741' tp1 FROM DUAL
)
,rotate(tp2,vcnt,n,last_cid) AS ( ----- 同一个图形的顺时针旋转模版, 比如125和251,512等等其实是同一个图形
SELECT CAST(CHR(ASCII('A')+c2.cid) AS VARCHAR2(10)),c1.cid,1,c2.cid
  FROM c c1,c c2
UNION ALL
SELECT rotate.tp2||CHR(ASCII('A')+c.cid),rotate.vcnt,rotate.n+1,c.cid
  FROM rotate,c
WHERE rotate.n<rotate.vcnt
       AND (c.cid=rotate.last_cid+1 AND c.cid<=rotate.vcnt OR rotate.last_cid=rotate.vcnt AND c.cid=1)
)
,tp2 AS ( ---- 用REVERSE构造出逆时针变换
SELECT tp2,vcnt,MIN(tp2) OVER(PARTITION BY vcnt) as org
  FROM (
        SELECT tp2,vcnt FROM rotate WHERE vcnt=n AND vcnt>=3
        UNION ALL
        SELECT REVERSE(tp2),vcnt FROM rotate WHERE vcnt=n AND vcnt>=3
       )
)
,tran1 AS ( ---- 第一次变换:九个点坐标的旋转翻转变换
SELECT all_p.pid
      ,all_p.vcnt
      ,TRANSLATE(all_p.pid,'123456789',tp1.tp1) as tran_id1
      ,rownum rn
  FROM all_p,tp1
)
,v1 as ( ----- 变换之后把每个端点拆出来,为平移做准备
SELECT pid,tran_id1,to_number(SUBSTR(tran1.tran_id1,n,1)) cid,vcnt,n,rownum rn
           FROM tran1
               ,(SELECT LEVEL n FROM DUAL CONNECT BY LEVEL<=9)
WHERE n<=tran1.vcnt
)
,t1 as ( ---- 平移到最靠近原点(纵横坐标都减去同样的偏移),平移是为了识别出全等多边形,比如124和125
SELECT pid,tran_id1
               ,X+1-MIN(X) OVER(PARTITION BY pid,tran_id1) X
               ,Y+1-MIN(Y) OVER(PARTITION BY pid,tran_id1) Y
               ,n
               ,vcnt
           FROM v1
               ,c
          WHERE v1.cid=c.cid
)
,move1 AS ( ---------- 把平移后的端点再用LISTAGG拼成图形
SELECT pid,vcnt,LISTAGG(c.cid) WITHIN GROUP(ORDER BY n) new_tran_id1
  FROM t1,c
WHERE t1.x=c.x AND t1.y=c.y
GROUP BY pid,vcnt,tran_id1
)
select distinct pid2 from ( ----- 再加上顺逆时针变换后取最小值,去除重复
SELECT move1.pid
      ,MIN(translate(tp2.tp2,tp2.org,new_tran_id1)) as pid2
  FROM move1,tp2
WHERE move1.vcnt=tp2.vcnt
GROUP BY move1.pid
)
ORDER BY LENGTH(pid2),pid2;


PID2
------------------------
124
126
127
129
135
137
138
168
1254
1257
1265
1267
1268
1269
1287
1294
1297
1298
1358
1397
1538
1568
1658
2486
12538
12567
12568
12594
12597
12598
12657
12658
12675
12684
12685
12687
12694
12697
12945
12957
12958
12975
13567
13568
13597
15268
24586
125367
125368
125384
125387
125394
125397
125398
125684
125687
125694
125697
125984
126584
126594
126597
126598
126845
126857
126875
126945
126957
126984
1253684
1253687
1253984
1256984
1265984

74 rows selected.      

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
29#
发表于 2016-8-4 00:13 | 只看该作者
NEWKID 大神,膜拜啊

第二题:

P(6,50) = 0.487432271706092
p(7,50) = 0.616350821549711
P(4,100) = 0.116388373531231
P(5,100) = 0.188124884442999
P(6,100) = 0.270914781095193
P(7,100) = 时间太长算不出来了
P(8,100)
P(9,100)
......

我估计 答案为9

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
30#
发表于 2016-8-4 00:38 | 只看该作者
solomon_007 发表于 2016-8-4 00:13
NEWKID 大神,膜拜啊

第二题:

看样子你用穷举啊?这玩意得用公式,代码最多就起个计算器的作用。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表