楼主: newkid

[每日一题] PUZZLEUP 2017

[复制链接]
论坛徽章:
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
41#
 楼主| 发表于 2017-8-23 23:16 | 只看该作者
solomon_007 发表于 2017-8-23 23:02
这么简单啊。。。

SQL>

注意,“对于其任意四个连续的数字”可没说这个数只有四位。

使用道具 举报

回复
论坛徽章:
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#
发表于 2017-8-24 01:31 | 只看该作者
newkid 发表于 2017-8-23 23:16
注意,“对于其任意四个连续的数字”可没说这个数只有四位。

长度最大为10,很慢,7,8 都一样了,后来想想数字组合 12 肯定不在答案中,因为 1*2 < 1+2 ,所以长度
取得8就够了,而且0只可能在最后一位,姑且假设它在答案中,所以:

SQL>
SQL> with t as (select level-1 n from dual connect by level <=10),
  2       s(n,str) as (select 1,cast( n as varchar2(10)) from t
  3                      union all
  4                    select s.n+1,
  5                           s.str||t.n
  6                      from s,t
  7                     where s.n < 8
  8                       and instr(s.str,'0') = 0
  9                       and instr(s.str,t.n) = 0 )
10   select max(str)
11     from (
12           select n,str,
13                  sum(case when substr(four,2,1)*substr(four,3,1)
14                                > substr(four,1,1)+substr(four,2,1)+substr(four,3,1)+substr(four,4,1)
15                           then 1
16                           else 0
17                       end) sum_val,
18                  count(*) cnt
19             from (
20                    select n,str,substr(str,p.m,4) four
21                      from (select *
22                             from s
23                            where n>=4
24                              and substr(str,2,1)*substr(str,3,1) > substr(str,1,1)+substr(str,2,1)+substr(str,3,1)+substr(str,4,1)
25                            ) s1,
26                           (select level m from dual connect by level <= 7) p
27                     where n >= 4
28                       and p.m + 3 <= s1.n )
29            group by n,str
30          )
31    where sum_val = cnt
32  /
MAX(STR)
--------------------------------------------------------------------------------
9876543

使用道具 举报

回复
论坛徽章:
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
43#
 楼主| 发表于 2017-8-24 03:35 | 只看该作者
你可真是出乎我的意料。
为什么事后才判断这四位数字呢?你完全可以在递归里面做的嘛?答案也太小。

使用道具 举报

回复
论坛徽章:
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
44#
发表于 2017-8-24 07:41 | 只看该作者
newkid 发表于 2017-8-24 03:35
你可真是出乎我的意料。
为什么事后才判断这四位数字呢?你完全可以在递归里面做的嘛?答案也太小。

你的意思是还有0 1 2中的数?

使用道具 举报

回复
论坛徽章:
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
45#
发表于 2017-8-24 09:28 | 只看该作者
newkid 发表于 2017-8-24 03:35
你可真是出乎我的意料。
为什么事后才判断这四位数字呢?你完全可以在递归里面做的嘛?答案也太小。

我智商捉鸡了!。。。

SQL>
SQL> with t as (select level-1 n from dual connect by level <=10),
  2       s(n,str) as (select 4,t1.n||t2.n||t3.n||t4.n
  3                      from t t1,t t2,t t3,t t4
  4                      where t2.n * t3.n > t1.n + t2.n + t3.n + t4.n
  5                       and t1.n <> t2.n and t1.n <> t3.n and t1.n <> t4.n
  6                       and t2.n <> t3.n and t2.n <> t4.n
  7                       and t3.n <> t4.n
  8                       and t1.n > 0
  9                      union all
10                    select s.n+1,
11                           s.str||t.n
12                      from s,t
13                     where s.n < 9
14                       and instr(s.str,'0') = 0
15                       and instr(s.str,t.n) = 0
16                       and substr(str,-2,1)*substr(str,-1,1) > substr(str,-3,1)+substr(str,-2,1)+substr(str,-1,1)+t.n
17                       )
18     select max(to_number(str)) from s
19  /
MAX(TO_NUMBER(STR))
-------------------
          956483721

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
46#
发表于 2017-8-24 09:57 | 只看该作者
solomon_007 发表于 2017-8-24 09:28
我智商捉鸡了!。。。

SQL>

为什么要 instr(s.str,'0') = 0

使用道具 举报

回复
论坛徽章:
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
47#
发表于 2017-8-24 10:00 | 只看该作者
〇〇 发表于 2017-8-24 09:57
为什么要 instr(s.str,'0') = 0

搞错了,上面的还是个 9 的, 。。。


SQL>
SQL> with t as (select level-1 n from dual connect by level <=10),
  2       s(n,str) as (select 4,t1.n||t2.n||t3.n||t4.n
  3                      from t t1,t t2,t t3,t t4
  4                      where t2.n * t3.n > t1.n + t2.n + t3.n + t4.n
  5                       and t1.n <> t2.n and t1.n <> t3.n and t1.n <> t4.n
  6                       and t2.n <> t3.n and t2.n <> t4.n
  7                       and t3.n <> t4.n
  8                       and t1.n > 0
  9                      union all
10                    select s.n+1,
11                           s.str||t.n
12                      from s,t
13                     where s.n < 10
14                       and instr(s.str,t.n) = 0
15                       and substr(str,-2,1)*substr(str,-1,1) > substr(str,-3,1)+substr(str,-2,1)+substr(str,-1,1)+t.n
16                       )
17     select max(to_number(str)) from s
18  /
MAX(TO_NUMBER(STR))
-------------------
         1956483720

使用道具 举报

回复
论坛徽章:
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#
发表于 2017-8-24 10:03 | 只看该作者
〇〇 发表于 2017-8-24 09:57
为什么要 instr(s.str,'0') = 0

0 的确只可能出现在最后一位,所以加上或去掉没有关系

使用道具 举报

回复
论坛徽章:
2
巨蟹座
日期:2016-04-10 09:37:03秀才
日期:2016-09-27 15:16:21
49#
发表于 2017-8-24 10:42 | 只看该作者
solomon_007 发表于 2017-8-24 10:03
0 的确只可能出现在最后一位,所以加上或去掉没有关系

开始并不能确定最大数是个几位数, 你加上 instr(s.str, '0') = 0 就默认了这个最大数是个10位数

使用道具 举报

回复
论坛徽章:
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
50#
发表于 2017-8-24 10:56 | 只看该作者
KBmohei 发表于 2017-8-24 10:42
开始并不能确定最大数是个几位数, 你加上 instr(s.str, '0') = 0 就默认了这个最大数是个10位数

没有啊,这只是保证每个链接长度上,最后一位可以为0,因为最后一位是t.n

使用道具 举报

回复

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

本版积分规则 发表回复

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