楼主: newkid

[每日一题] puzzleup 2018

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
41#
 楼主| 发表于 2018-8-16 21:15 | 只看该作者
nayi224 发表于 2018-8-16 15:59
为什么不是这样呢

select count(distinct sys_connect_by_path(p||c,','))

此外,这个DISTINCT可以去掉。

使用道具 举报

回复
论坛徽章:
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
42#
发表于 2018-8-16 21:34 | 只看该作者
对啊,还可以取相等

SQL>
SQL> with t as (select level n from dual connect by level <=11),
  2       r as (select 'R' c from dual
  3              union all
  4             select 'Y' from dual
  5              union all
  6             select 'B' from dual),
  7  s(lvl,nList,cList,nLast) as (select 1,cast(n as varchar2(30)),c,n
  8                                 from t,r
  9                                union all
10                               select s.lvl+1,
11                                      s.nList||','||t.n,
12                                      s.cList||','||r.c,
13                                      t.n
14                                 from s,t,r
15                                where
16                                      s.nLast <= t.n
17                                  and s.lvl <5)
18  select count(*) from s
19  /
  COUNT(*)
----------
    819159

使用道具 举报

回复
论坛徽章:
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
43#
发表于 2018-8-16 21:42 | 只看该作者
sys_guid() 比 DBMS_RANDOM.value 慢很多。。。

SQL> set timing on;
SQL>
SQL>
SQL> select count(distinct sys_connect_by_path(p||c,','))
  2    from (select chr(64+level) p
  3            from dual
  4           connect by level<=11
  5         )
  6        ,(select level c from dual connect by level<=3)
  7  connect by level<=5 and p>=prior p and prior sys_guid() is not null;
COUNT(DISTINCTSYS_CONNECT_BY_P
------------------------------
                        819159
Executed in 19.547 seconds

SQL>
SQL> SELECT COUNT(DISTINCT SYS_CONNECT_BY_PATH(P||C,','))
  2    FROM (SELECT CHR(64+LEVEL) P
  3            FROM DUAL
  4           CONNECT BY LEVEL<=11
  5         )
  6        ,(SELECT LEVEL C FROM DUAL CONNECT BY LEVEL<=3)
  7  CONNECT BY LEVEL<=5 AND P>= PRIOR P and prior dbms_random.value is not null
  8  /
COUNT(DISTINCTSYS_CONNECT_BY_P
------------------------------
                        819159
Executed in 5.157 seconds

使用道具 举报

回复
论坛徽章:
2
紫蜘蛛
日期:2018-08-24 21:46:44玉兔
日期:2018-09-07 22:04:20
44#
发表于 2018-8-17 17:45 | 只看该作者
我又有问题了。先把题目简化一下。只有一张黑卡,颜色也只能选两种,最多加三张卡。那么sql应该改成这样吧

select*from (
select  sys_connect_by_path(p||c,',') ssssssssssssss
  from (select chr(64+level) p
          from dual
         connect by level<=2
       )
      ,(select level c from dual connect by level<=2)
connect by level<=3 and p>=prior p and prior sys_guid() is not null
) t1
where length(t1.ssssssssssssss) > -3
;

结果集为

,A1
,A1,A1
,A1,A1,A1
,A1,A1,A2
,A1,A1,B1
,A1,A1,B2
,A1,A2
,A1,A2,A1
,A1,A2,A2
,A1,A2,B1
,A1,A2,B2
,A1,B1
,A1,B1,B1
,A1,B1,B2
,A1,B2
,A1,B2,B1
,A1,B2,B2
,A2
,A2,A1
,A2,A1,A1
,A2,A1,A2
,A2,A1,B1
,A2,A1,B2
,A2,A2
,A2,A2,A1
,A2,A2,A2
,A2,A2,B1
,A2,A2,B2
,A2,B1
,A2,B1,B1
,A2,B1,B2
,A2,B2
,A2,B2,B1
,A2,B2,B2
,B1
,B1,B1
,B1,B1,B1
,B1,B1,B2
,B1,B2
,B1,B2,B1
,B1,B2,B2
,B2
,B2,B1
,B2,B1,B1
,B2,B1,B2
,B2,B2
,B2,B2,B1
,B2,B2,B2

但是,A1,A1,A2  与  ,A1,A2,A1应该算是一种组合吧。

不过a1a2b1b1 与 a2a1b1b1又应该算是两种组合。

看起来应该对每一行拆分后同字母的直接接合,不同字母间重新排序。这样可以识别出a2a1b1b1,a2b1a1b1是一种组合。

使用道具 举报

回复
论坛徽章:
2
紫蜘蛛
日期:2018-08-24 21:46:44玉兔
日期:2018-09-07 22:04:20
45#
发表于 2018-8-17 17:59 | 只看该作者
搞了一下午只用归纳法推出了一个递归的算法,用来解决一个简化的问题。3张黑卡,两种颜色,加入2个卡
select*from (
select  sys_connect_by_path(p||c,',') ssssssssssssss
  from (select chr(64+level) p
          from dual
         connect by level<=4
       )
      ,(select level c from dual connect by level<=2)
connect by level<=2 and p>=prior p and prior sys_guid() is not null
) t1
where length(t1.ssssssssssssss) > 3
;

select power((2 * 4), 2)
- (power((2 * 4), 2) * (1 / 4) * (1 / 4))
- (power((2 * 4), 2) * (1 / 4) * (2 / 4))
- (power((2 * 4), 2) * (1 / 4) * (3 / 4))
from dual;

但是加入3个卡的情况就完全想不通了。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
46#
 楼主| 发表于 2018-8-17 21:27 | 只看该作者
nayi224 发表于 2018-8-17 17:45
我又有问题了。先把题目简化一下。只有一张黑卡,颜色也只能选两种,最多加三张卡。那么sql应该改成这样吧
...

你理解有误,这个子查询"p"是以黑卡为间隙,求出所有可能放置新卡的位置。比如10张黑卡就有11个位置可放,1张黑卡就有两个位置。
1,2,3是三种颜色。

因此 ,A1,A1,A2  与  ,A1,A2,A1 是两种不同的序列。位置A表示黑卡的左边,所以两个颜色序列是:
112黑
121黑

我那个查询里面的DISTINCT可以去掉,因为不会有重复。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
47#
 楼主| 发表于 2018-8-17 21:28 | 只看该作者
solomon_007 发表于 2018-8-16 21:42
sys_guid() 比 DBMS_RANDOM.value 慢很多。。。

SQL> set timing on;

这个真没想到,我一直以为SYS_GUID更好,看来是这个函数太复杂,开销太大了。

使用道具 举报

回复
论坛徽章:
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
48#
发表于 2018-8-17 23:50 | 只看该作者
newkid 发表于 2018-8-17 21:28
这个真没想到,我一直以为SYS_GUID更好,看来是这个函数太复杂,开销太大了。

CONNECT BY 后跟DBMS_RANDOM.value 避免循环,N 年前最早还是看你最先这样用的呢!

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
49#
 楼主| 发表于 2018-8-18 02:20 | 只看该作者
solomon_007 发表于 2018-8-17 23:50
CONNECT BY 后跟DBMS_RANDOM.value 避免循环,N 年前最早还是看你最先这样用的呢!

这方法可不是我发明的,最早也不记得哪里看来的。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
50#
 楼主| 发表于 2018-8-22 23:04 | 只看该作者
#4

DIGIT SUMS

When all numbers from 1 to X are written, the sum of the written digits is ten times X. Find the positive integer X satisfying this condition.

Example: When numbers up to 18 are written, sum of the written digits is 90.


把从1到X的所有数字写出来,数字位之和是X的十倍。找到满足该条件的正整数X.

例子:当写到18时,数字位的总和为90。

无聊的题目。

使用道具 举报

回复

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

本版积分规则 发表回复

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