楼主: newkid

PUZZLEUP 2014

[复制链接]
论坛徽章:
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
301#
发表于 2014-10-16 16:59 | 只看该作者
peter1166 发表于 2014-10-16 14:37
这样就秒杀了。

算原题比你的慢,但我的数据很快出来了

with a as(select '21218453415461109221'a from dual), --75059993789508200000
b as(select level l from a connect by level<=log(2,a)+2),
c as(select level-1 c from dual connect by level<=2 union all
select sum(power(2,l)) over(partition by mod(l,2) order by l )+mod(l+1,2)from b),
t as(select c n from a,c where instr(a,c)>0)
SELECT *
FROM   T T1,T T2,T T3,T T4,T T5,T T6,a
where  t1.n like substr(a,1,1)||'%'
and T1.N||T2.N||T3.N||T4.N||T5.N||T6.N =a
AND    ROWNUM <= 1 ;
select count(*) from t;

使用道具 举报

回复
论坛徽章:
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
302#
发表于 2014-10-16 18:40 | 只看该作者
〇〇 发表于 2014-10-16 16:59
算原题比你的慢,但我的数据很快出来了

with a as(select '21218453415461109221'a from dual), --750 ...

改成递归就快了
with a as(select '21218453415461109221'a from dual), --75059993789508200000
b as(select level l from a connect by level<=log(2,a)+2),
c as(select level-1 c from dual connect by level<=2 union all
select sum(power(2,l)) over(partition by mod(l,2) order by l )+mod(l+1,2)from b),
t as(select c n from a,c where instr(a,c)>0),
s(lv,n,s) as(select 1 lv,to_char(n),0+n s from t,a where a like n||'%'
union all
select 1+lv,to_char(s.n)||to_char(t.n),s+t.n from s,t,a where a like to_char(s.n)||to_char(t.n)||'%'and lv<6)
SELECT *
FROM  s,a
where lv=6 and length(n)=length(a) and ROWNUM <= 1 ;

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
303#
发表于 2014-10-16 20:49 | 只看该作者
本帖最后由 peter1166 于 2014-10-16 21:18 编辑
〇〇 发表于 2014-10-16 15:19
用这个75059993789508200000跑不出来


您说的对, 我那个还是有缺陷, 因为 》 XOR 是对 0 无效的。 但0 也满足条件。
修改了一下应该出来了。

WITH T0 AS (
            SELECT LEVEL L
                   ,SUBSTR(S,LEVEL,1) C
            FROM   (SELECT '75059993789508200000' S FROM DUAL )
            CONNECT BY LEVEL <= LENGTH(S)
            )
    ,T1 AS (
            SELECT DISTINCT TO_NUMBER(REPLACE(SYS_CONNECT_BY_PATH(C,','),',','')) N
            FROM T0
            CONNECT BY LEVEL <= 20 AND L = PRIOR L+1
           )
    ,T AS (
             SELECT DISTINCT  N
             FROM (SELECT  N , FLOOR(N/2) SHR1 FROM T1)
             WHERE N = 0 OR N + SHR1 - 2 * BITAND(N,SHR1) IN (SELECT POWER(2,LEVEL)-1 FROM DUAL CONNECT BY LEVEL <= 100)
           )
SELECT *
FROM   T T1,T T2,T T3,T T4,T T5,T T6
WHERE  t1.n like '7%'
and    T1.N||T2.N||T3.N||T4.N||T5.N||T6.N = '75059993789508200000'  
AND    ROWNUM <= 1 ;

         N          N          N          N          N          N
---------- ---------- ---------- ---------- ---------- ----------
7505999378          0          0          0          0          0

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
304#
发表于 2014-10-16 21:15 | 只看该作者
〇〇 发表于 2014-10-16 16:59
算原题比你的慢,但我的数据很快出来了

with a as(select '21218453415461109221'a from dual), --750 ...

强!
先构造

100 + 1
10100 + 1
1010100 + 1
101010100 + 1
...
10
1010
101010
10101010
...
再拼。
log(2,a)+2 印象深刻。

使用道具 举报

回复
论坛徽章:
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
305#
 楼主| 发表于 2014-10-16 22:01 | 只看该作者
peter1166 发表于 2014-10-16 21:15
强!
先构造

给你发个章。
我写的是这样:


VAR S VARCHAR2(30);
EXEC :S := '21218453415461109221';

WITH n(n,lvl) AS (
SELECT 1,1 FROM DUAL
UNION ALL
SELECT n*2 + MOD(lvl+1,2), lvl+1 FROM n WHERE n<TO_NUMBER(:s)
)
,s AS (
SELECT n FROM n WHERE INSTR(:s,TO_CHAR(n))>0
)
SELECT *
  FROM s s1,s s2,s s3,s s4,s s5,s s6
WHERE s1.n||s2.n||s3.n||s4.n||s5.n||s6.n=:S
;

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
306#
发表于 2014-10-16 22:20 | 只看该作者
〇〇 发表于 2014-10-16 18:40
改成递归就快了
with a as(select '21218453415461109221'a from dual), --75059993789508200000
b as( ...

您这个是最快的,
如果我偷用你的递归, 速度跟这个差不多。

WITH A AS (SELECT '21218453415461109221' A FROM DUAL )
     ,T0 AS (
            SELECT LEVEL L
                   ,SUBSTR(A,LEVEL,1) C
            FROM   A
            CONNECT BY LEVEL <= LENGTH(A)
            )
    ,T1 AS (
            SELECT DISTINCT TO_NUMBER(REPLACE(SYS_CONNECT_BY_PATH(C,','),',','')) N
            FROM T0
            CONNECT BY LEVEL <= 20 AND L = PRIOR L+1
           )
    ,T AS (
             SELECT distinct  N
             FROM (SELECT  N , FLOOR(N/2) SHR1 FROM T1)
             WHERE N = 0 OR N + SHR1 - 2 * BITAND(N,SHR1) IN (SELECT POWER(2,LEVEL)-1 FROM DUAL CONNECT BY LEVEL <= 20)
           )
,s(lv,n,s) as(select 1 lv,to_char(n),0+n s from t,a where a like n||'%'
union all
select 1+lv,to_char(s.n)||to_char(t.n),s+t.n from s,t,a where a like to_char(s.n)||to_char(t.n)||'%'and lv<6)
SELECT *
FROM  s,a
where lv=6 and length(n)=length(a) and ROWNUM <= 1 ;

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
307#
发表于 2014-10-16 22:27 | 只看该作者
newkid 发表于 2014-10-16 22:01
给你发个章。
我写的是这样:

您这个精炼, 学习了, 难怪说简单。
要个劳斯莱斯, 谢谢。

使用道具 举报

回复
论坛徽章:
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
308#
 楼主| 发表于 2014-10-16 22:29 | 只看该作者
peter1166 发表于 2014-10-16 22:27
您这个精炼, 学习了, 难怪说简单。
要个劳斯莱斯, 谢谢。

转了。

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
309#
发表于 2014-10-16 22:51 | 只看该作者
newkid 发表于 2014-10-16 22:29
转了。

再次感谢! 期待下一题。

使用道具 举报

回复
论坛徽章:
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
310#
 楼主| 发表于 2014-10-17 02:54 | 只看该作者
不用笛卡尔积,直接两个递归速度更快:

WITH s(n) AS (
SELECT 1 FROM DUAL
UNION ALL
SELECT n*2 + 1 - MOD(n,2) FROM s WHERE n<TO_NUMBER(:s)
)
,r(n,cnt,r) AS (
SELECT TO_CHAR(n),1,TO_CHAR(n) FROM s WHERE :s LIKE n||'%'
UNION ALL
SELECT r.n||s.n,cnt+1,r||','||s.n FROM r,s WHERE :s LIKE r.n||s.n||'%'
)
SELECT r FROM r WHERE n=:s AND cnt=6;

使用道具 举报

回复

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

本版积分规则 发表回复

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