楼主: newkid

[每日一题] PUZZLEUP 2015

[复制链接]
论坛徽章:
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
461#
 楼主| 发表于 2015-12-3 10:51 | 只看该作者
lugionline 发表于 2015-12-3 10:44
比赛题太烦锁了,花了差不多20行M代码

败给你了。贴出来看看?

SQL版的写了没?

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
462#
发表于 2015-12-3 11:00 | 只看该作者
newkid 发表于 2015-12-3 10:51
败给你了。贴出来看看?

SQL版的写了没?

在家里呢,贴出来就泄露了,不写SQL了,没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
463#
发表于 2015-12-3 21:56 | 只看该作者
想不到整数运算比字符快那么多
with a as(select level-1 a from dual connect by level<=3),
e as(select a.a||b.a||c.a||d.a p,a.a b1,b.a b2,c.a b3,d.a b4
from a,a b,a c,a d
where regexp_count(a.a||b.a||c.a||d.a,'2')>regexp_count(a.a||b.a||c.a||d.a,'0')),
g as(select * from(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
power(10,e.b1)+power(10,f.b1)s1,
power(10,e.b2)+power(10,f.b2)s2,
power(10,e.b3)+power(10,f.b3)s3,
power(10,e.b4)+power(10,f.b4)s4
from e,e f)
where instr(b1||b2||b3||b4,'00') not in(1,3,5,7)) ,
h as(select * from
(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
s1+power(10,f.b1)s1,
s2+power(10,f.b2)s2,
s3+power(10,f.b3)s3,
s4+power(10,f.b4)s4
from g e,e f)x
--where substr(s1,1,1)>=substr(s1,3,1) and substr(s2,1,1)>=substr(s2,3,1) and substr(s3,1,1)>=substr(s3,3,1) and substr(s4,1,1)>=substr(s4,3,1)
),
j as (select * from
(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
s1+power(10,f.b1)s1,
s2+power(10,f.b2)s2,
s3+power(10,f.b3)s3,
s4+power(10,f.b4)s4
from h e,e f)x
where substr(s1,1,1)>substr(s1,3,1) and substr(s2,1,1)>substr(s2,3,1) and substr(s3,1,1)>substr(s3,3,1) and substr(s4,1,1)>substr(s4,3,1))
select count(*) from j;

  COUNT(*)
----------
    294879

已用时间:  00: 00: 07.22

----------------

with a as(select level-1 a,level-2 b from dual connect by level<=3),
e as(select a.a||b.a||c.a||d.a p,a.a b1,b.a b2,c.a b3,d.a b4,a.b s1,b.b s2,c.b s3,d.b s4
from a,a b,a c,a d
where regexp_count(a.a||b.a||c.a||d.a,'2')>regexp_count(a.a||b.a||c.a||d.a,'0')),
g as(select * from(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4
from e,e f)
where  instr(b1||b2||b3||b4,'00') not in(1,3,5,7)) ,
h as(select * from
(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4
from g e,e f)x
),
j as (select * from
(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4
from h e,e f)x
where s1>0 and s2>0 and s3>0 and s4>0)
select count(*) from j;

  COUNT(*)
----------
    294879

已用时间:  00: 00: 00.84

使用道具 举报

回复
论坛徽章:
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
464#
 楼主| 发表于 2015-12-3 23:38 | 只看该作者
lugionline 发表于 2015-12-3 11:00
在家里呢,贴出来就泄露了,不写SQL了,没M简单

你还怕走光?想太多了吧!这里除了你谁能看得懂M代码?
要是SQL简单还叫比赛吗?咱们从事的是SQL极限运动。要不我个人给你一万PB作为出场费?别人可没有这待遇哟。

使用道具 举报

回复
论坛徽章:
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
465#
 楼主| 发表于 2015-12-3 23:39 | 只看该作者
我写的19题的SQL:

WITH c AS (SELECT 'W' c FROM DUAL UNION ALL SELECT 'B' FROM DUAL UNION ALL SELECT '-' FROM DUAL)
,t AS (
SELECT * FROM (
SELECT c
      ,DECODE(SUBSTR(c,1,1),'W',1,0) w1
      ,DECODE(SUBSTR(c,2,1),'W',1,0) w2
      ,DECODE(SUBSTR(c,3,1),'W',1,0) w3
      ,DECODE(SUBSTR(c,4,1),'W',1,0) w4
      ,DECODE(SUBSTR(c,1,1),'B',1,0) b1
      ,DECODE(SUBSTR(c,2,1),'B',1,0) b2
      ,DECODE(SUBSTR(c,3,1),'B',1,0) b3
      ,DECODE(SUBSTR(c,4,1),'B',1,0) b4
FROM (
       SELECT REPLACE(SYS_CONNECT_BY_PATH(c,','),',') c
         FROM c
        WHERE LEVEL=4
        CONNECT BY LEVEL<=4
       )
)
WHERE w1+w2+w3+w4>b1+b2+b3+b4
)
SELECT COUNT(*)
  FROM t t1,t t2,t t3,t t4
WHERE     t1.w1+t2.w1+t3.w1+t4.w1>t1.b1+t2.b1+t3.b1+t4.b1
       AND t1.w2+t2.w2+t3.w2+t4.w2>t1.b2+t2.b2+t3.b2+t4.b2
       AND t1.w3+t2.w3+t3.w3+t4.w3>t1.b3+t2.b3+t3.b3+t4.b3
       AND t1.w4+t2.w4+t3.w4+t4.w4>t1.b4+t2.b4+t3.b4+t4.b4
;

  COUNT(*)
----------
    294879

Elapsed: 00:00:00.61

使用道具 举报

回复
论坛徽章:
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
466#
发表于 2015-12-4 07:46 | 只看该作者
newkid 发表于 2015-12-3 23:39
我写的19题的SQL:

WITH c AS (SELECT 'W' c FROM DUAL UNION ALL SELECT 'B' FROM DUAL UNION ALL SELEC ...

没想到直截了当的解法这么快,光想着在中途剪枝了,这道题中间剪不了多少

使用道具 举报

回复
论坛徽章:
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
467#
发表于 2015-12-4 07:47 | 只看该作者
newkid 发表于 2015-12-3 23:38
你还怕走光?想太多了吧!这里除了你谁能看得懂M代码?
要是SQL简单还叫比赛吗?咱们从事的是SQL极限运动 ...

也可以参照sql解法,加密文件,到活动结束时候揭开

使用道具 举报

回复
论坛徽章:
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
468#
发表于 2015-12-4 07:49 | 只看该作者
本帖最后由 〇〇 于 2015-12-4 07:50 编辑

不过在我机器上,464楼还是不如462楼第二种快

使用道具 举报

回复
论坛徽章:
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
469#
发表于 2015-12-4 08:19 | 只看该作者
462楼改成递归又慢得不行了,递归层越多越差
with a as(select level-1 a,level-2 b from dual connect by level<=3),
e as(select a.a||b.a||c.a||d.a p,a.a b1,b.a b2,c.a b3,d.a b4,a.b s1,b.b s2,c.b s3,d.b s4
from a,a b,a c,a d
where regexp_count(a.a||b.a||c.a||d.a,'2')>regexp_count(a.a||b.a||c.a||d.a,'0')),
g(p,s1,s2,s3,s4,lv) as(
select p,s1,s2,s3,s4,1 from(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4
from e,e f)
where  instr(b1||b2||b3||b4,'00') not in(1,3,5,7)
union all
select e.p||f.p p,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4,lv+1
from g e,e f where lv<=2)
,j as (select * from g
where lv=3 and s1>0 and s2>0 and s3>0 and s4>0)
select count(*) from j;

  COUNT(*)
----------
    294879

已用时间:  00: 00: 14.82

with a as(select level-1 a,level-2 b from dual connect by level<=3),
e as(select a.a||b.a||c.a||d.a p,a.a b1,b.a b2,c.a b3,d.a b4,a.b s1,b.b s2,c.b s3,d.b s4
from a,a b,a c,a d
where regexp_count(a.a||b.a||c.a||d.a,'2')>regexp_count(a.a||b.a||c.a||d.a,'0')),
g(p,s1,s2,s3,s4,lv) as(
select cast('' as varchar(16)),0,0,0,0,0 from dual
--where  instr(b1||b2||b3||b4,'00') not in(1,3,5,7)
union all
select e.p||f.p p,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4,lv+1
from g e,e f where lv<=3)
,j as (select * from g
where lv=4 and s1>0 and s2>0 and s3>0 and s4>0)
select count(*) from j ;

  COUNT(*)
----------
    294879

已用时间:  00: 00: 50.28

使用道具 举报

回复
论坛徽章:
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
470#
发表于 2015-12-4 09:05 | 只看该作者
我写递归最快也就这样了
with a as(select level-1 a,level-2 b from dual connect by level<=3),
e as(select a.a||b.a||c.a||d.a p,a.b b1,b.b b2,c.b b3,d.b b4
from a,a b,a c,a d
where a.b+b.b+c.b+d.b>0),
g(p,s1,s2,s3,s4,lv) as(
select cast(p as varchar(16)),b1,b2,b3,b4,1 from e
union all
select e.p||f.p p,
b1+s1,
b2+s2,
b3+s3,
b4+s4,lv+1
from g e,e f where lv<=3 and(least(b1+s1,b2+s2,b3+s3,b4+s4)>lv-3))
select count(*) from g where lv=4 and least(s1,s2,s3,s4)>0;

  COUNT(*)
----------
    294879

已用时间:  00: 00: 06.20

使用道具 举报

回复

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

本版积分规则 发表回复

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