楼主: newkid

[每日一题] PUZZLEUP 2015

[复制链接]
论坛徽章:
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
231#
发表于 2015-10-4 22:31 | 只看该作者
lugionline 发表于 2015-10-4 08:15
我的理解是这5个数不必要一定出现,111.....111这种也算

SQL如果硬拼数字统计的话估计机器要响上半天了

如果没有最后1个条件,相邻都相等,就都是1个数字了

使用道具 举报

回复
论坛徽章:
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
232#
 楼主| 发表于 2015-10-6 02:16 | 只看该作者
lugionline 发表于 2015-10-4 08:15
我的理解是这5个数不必要一定出现,111.....111这种也算

SQL如果硬拼数字统计的话估计机器要响上半天了

是不是这个总数:
  COUNT(*)
----------
  64570081

Elapsed: 00:00:25.35

如果要求5个数全部出现还更费周折,要多算几秒:
  COUNT(*)
----------
  21310248

Elapsed: 00:00:29.19

使用道具 举报

回复
论坛徽章:
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
233#
发表于 2015-10-6 09:35 | 只看该作者
#10

SQL> set timing on;
SQL>
SQL>
SQL> with t as (select to_char(level) n from dual connect by level <=5),
  2       s (lvl,lastchar,str) as ( select 1 lvl,
  3                                        n lastchar,
  4                                        n str
  5                                   from t
  6                                  union all
  7                                 select s.lvl + 1,
  8                                        t.n,
  9                                        s.str||case when substr(s.str,-1,1) =1 then t.n
10                                                    else case when t.n=1 then '1'
11                                                              else s.lastchar
12                                                         end
13                                               end
14                                   from s,t
15                                  where s.lvl < 16
16                                    and t.n = case when substr(s.str,-1,1) =1 then t.n
17                                                        else case when t.n=1 then '1'
18                                                                  else s.lastchar
19                                                             end
20                                              end
21                                 )
22  select count(*) from s where lvl = 16
23  /
  COUNT(*)
----------
  64570081
Executed in 3056.149 seconds

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
234#
发表于 2015-10-6 11:07 | 只看该作者
newkid 发表于 2015-10-6 02:16
是不是这个总数:
  COUNT(*)
----------

不得不说你的SQL是很快,我是好学生,我用通项公式

In[3]:= (3^(n + 1) - (-1)^n)/2 /. n -> 16

Out[3]= 64570081

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
235#
发表于 2015-10-6 18:39 | 只看该作者
要求5个数字全部出现就比较麻烦了,但是也能算出通项公式

不能贴图就只能贴难看的公式了

In[238]:= FullSimplify[(1 + 1/2 (-(-1)^n + 3^(n + 1)) +
    3 ((1 - Sqrt[2])^(n + 1) + (1 + Sqrt[2])^(n + 1)) -
    2 ((1 - Sqrt[3])^(n + 1) + (1 + Sqrt[3])^(n + 1)) - 2^(n + 2)) /.
  n -> 16]

Out[238]= 21310248

使用道具 举报

回复
论坛徽章:
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
236#
发表于 2015-10-6 21:25 | 只看该作者
solomon_007 发表于 2015-10-6 09:35
#10

SQL> set timing on;

不错,不到1小时插入了6千万行

使用道具 举报

回复
论坛徽章:
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
237#
 楼主| 发表于 2015-10-6 21:38 | 只看该作者
solomon_007 发表于 2015-10-6 09:35
#10

SQL> set timing on;

好吧给你发个章。你还真有耐心,我也写了递归版本但是等不了那么九。

改用二分法:
WITH d2 AS (
SELECT n1||n2 n
  FROM (SELECT LEVEL n1 FROM DUAL CONNECT BY LEVEL<=5)
      ,(SELECT LEVEL n2 FROM DUAL CONNECT BY LEVEL<=5)
WHERE n1=n2 OR n1=1 OR n2=1
)
,d4 AS (
SELECT a.n||b.n n
  FROM d2 a,d2 b
WHERE SUBSTR(a.n,2)=SUBSTR(b.n,1,1)
       OR SUBSTR(a.n,2)=1
       OR SUBSTR(b.n,1,1)=1
)
,d8 AS (
SELECT a.n||b.n n
  FROM d4 a,d4 b
WHERE SUBSTR(a.n,4)=SUBSTR(b.n,1,1)
       OR SUBSTR(a.n,4)=1
       OR SUBSTR(b.n,1,1)=1
)
,d16 AS (
SELECT a.n||b.n n
  FROM d8 a,d8 b
WHERE SUBSTR(a.n,8)=SUBSTR(b.n,1,1)
       OR SUBSTR(a.n,8)=1
       OR SUBSTR(b.n,1,1)=1
)
SELECT COUNT(*) FROM d16;

  COUNT(*)
----------
  64570081

Elapsed: 00:00:25.35

如果要求所有的数全部包含:
WITH d2 AS (
SELECT n1||n2 n
  FROM (SELECT LEVEL n1 FROM DUAL CONNECT BY LEVEL<=5)
      ,(SELECT LEVEL n2 FROM DUAL CONNECT BY LEVEL<=5)
WHERE n1=n2 OR n1=1 OR n2=1
)
,d4 AS (
SELECT a.n||b.n n
  FROM d2 a,d2 b
WHERE SUBSTR(a.n,2)=SUBSTR(b.n,1,1)
       OR SUBSTR(a.n,2)='1'
       OR SUBSTR(b.n,1,1)='1'
)
,d8 AS (
SELECT n
      ,INSTR(n,'1') p1
      ,INSTR(n,'2') p2
      ,INSTR(n,'3') p3
      ,INSTR(n,'4') p4
      ,INSTR(n,'5') p5
  from (
SELECT CAST(a.n||b.n AS VARCHAR2(8)) n
  FROM d4 a,d4 b
WHERE SUBSTR(a.n,4)=SUBSTR(b.n,1,1)
       OR SUBSTR(a.n,4)='1'
       OR SUBSTR(b.n,1,1)='1'
       )
)
,d16 AS (
SELECT a.n||b.n n
  FROM d8 a,d8 b
WHERE (SUBSTR(a.n,8)=SUBSTR(b.n,1,1)
       OR SUBSTR(a.n,8)='1'
       OR SUBSTR(b.n,1,1)='1'
       )
       AND a.p1+b.p1>0
       AND a.p2+b.p2>0
       AND a.p3+b.p3>0
       AND a.p4+b.p4>0
       AND a.p5+b.p5>0
)
SELECT COUNT(*) FROM d16;

  COUNT(*)
----------
  21310248

Elapsed: 00:00:29.19

使用道具 举报

回复
论坛徽章:
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
238#
 楼主| 发表于 2015-10-6 21:41 | 只看该作者
lugionline 发表于 2015-10-6 11:07
不得不说你的SQL是很快,我是好学生,我用通项公式

In[3]:= (3^(n + 1) - (-1)^n)/2 /. n -> 16

这个应该不难推,我怎么没想到?

使用道具 举报

回复
论坛徽章:
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
239#
发表于 2015-10-7 10:44 | 只看该作者
newkid 发表于 2015-10-6 21:38
好吧给你发个章。你还真有耐心,我也写了递归版本但是等不了那么九。

改用二分法:

随便给一个吧     我只会简单的做法, 我怎么就没有想到像你那样先构造所有的两位的组合呢?

使用道具 举报

回复
论坛徽章:
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
240#
发表于 2015-10-7 10:50 | 只看该作者
〇〇 发表于 2015-10-6 21:25
不错,不到1小时插入了6千万行

第一次运行TEMP表空间不足, 死掉了; 后来加了2个临时文件. 运算的过程中,临时表空间扩展到了好像十多G吧

另外,我的笔记本性能还可以吧...

使用道具 举报

回复

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

本版积分规则 发表回复

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