楼主: newkid

[每日一题] puzzleup 2018

[复制链接]
论坛徽章:
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
281#
发表于 2018-11-23 00:10 | 只看该作者
newkid 发表于 2018-11-22 23:23
我算的是1759, 在和你对答案时,发现这个不在你的答案里面:
111110011100
不知道CONNECT BY为什么把它 ...

11
111
00
111
00

--  --
|  |   |
|  |   |

connect by 这种情况确实走不出来, 一个点为连接点拼接线段的方式连续走不出来, 必定有个线段要走两次, 这就被nocycle 过滤了。

我明天再尝试一下方块儿连接的方法行不行。

使用道具 举报

回复
论坛徽章:
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
282#
发表于 2018-11-23 00:22 | 只看该作者
〇〇 发表于 2018-11-22 19:32
就是我在259楼说的

终于找到了跟 peter的差别了,他用的是线段首尾相连,而我们上面用的是跟前面任何一个线段相连,
但跟前面任何一个线段相连跑不出答案,(下面是考虑首尾相连后的修改)

SQL> with point(n,x,y) as (select level n,ceil(level/3),decode(mod(level,3),0,3,mod(level,3)) from dual connect by level<=9),
  2       line(n,p1,p2) as (select rownum,p1.n,p2.n from point p1,point p2 where abs(p1.x - p2.x) + abs(p1.y-p2.y) =1 and p1.n < p2.n),
  3       shape(lvl,nlist,val,p1,p2) as (select 1,cast(n as varchar2(100)),power(2,n),p1,p2 from line
  4                                      union all
  5                                      select s.lvl + 1,
  6                                             s.nlist||','||a.n,
  7                                             s.val + power(2,a.n),
  8                                             a.p1,
  9                                             a.p2
10                                        from shape s,line a
11                                       where bitand(s.val,power(2,a.n))=0
12                                         and lvl < 12
13                                         and (a.p1 = s.p1 or a.p1 = s.p2 or a.p2 = s.p1 or a.p2 = s.p2)
14                                       )
15   select sum(cnt)
16     from (select lvl, count(distinct val) cnt from shape group by lvl)
17  /
  SUM(CNT)
----------
      1609

使用道具 举报

回复
论坛徽章:
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
283#
 楼主| 发表于 2018-11-23 01:09 | 只看该作者
我的写法:

VAR N NUMBER;
EXEC :N:=3;

WITH d AS (SELECT ROWNUM id,X, Y FROM (SELECT LEVEL x FROM DUAL CONNECT BY LEVEL<=:N),(SELECT LEVEL y FROM DUAL CONNECT BY LEVEL<=:N))
,e AS (
SELECT rownum id,d1.x x1,d1.y y1,d2.x x2,d2.y y2,power(2,rownum) b
  FROM d d1,d d2
WHERE d1.id<d2.id and (d1.x=d2.x and abs(d1.y-d2.y)=1 or d1.y=d2.y and abs(d1.x-d2.x)=1)
)
,c as (
select s1.b b1,s2.b b2,s1.b+s2.b b
  from e s1,e s2
where s1.id<s2.id
       and ((s1.x1,s1.y1) in ((s2.x1,s2.y1),(s2.x2,s2.y2))
            or
            (s1.x2,s1.y2) in ((s2.x1,s2.y1),(s2.x2,s2.y2))
           )
)                  
,t (b,rn) as (
select b,1 from e
union all
select t.b+c.b-bitand(t.b,c.b)  --- bitor
      ,row_number() over(partition by t.b+c.b-bitand(t.b,c.b) order by 1) rn
  from t,c
where t.rn=1  ------- 去重复
       and bitand(t.b,c.b) in (c.b1,c.b2)
)
select count(distinct b) from t;

COUNT(DISTINCTB)
----------------
            1759

Elapsed: 00:00:00.12

使用道具 举报

回复
论坛徽章:
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
284#
 楼主| 发表于 2018-11-23 01:12 | 只看该作者
一开始用的方法是手工把所有相邻的线段写出来:

把12段从上到下,从左到右编号:

  1   2
3   4   5
  6   7
8   9  10
11  12

with s as (
SELECT level n,power(2,level) b from dual connect by level<=12
)
,c as (
select s1.b b1,s2.b b2,s1.b+s2.b b
  from s s1,s s2
where (s1.n,s2.n) in ((1,2),(1,3),(1,4) -------手工枚举所有相邻的线段对
                      ,(2,4),(2,5)
                      ,(3,6),(3,8)
                      ,(4,6),(4,7),(4,9)
                      ,(5,7),(5,10)
                      ,(6,7),(6,8),(6,9)
                      ,(7,9),(7,10)
                      ,(8,11)
                      ,(9,11),(9,12)
                      ,(10,12)
                      ,(11,12)
                      )
)                     
,t (b,rn) as (
select b,1 from s
union all
select t.b+c.b-bitand(t.b,c.b)  --- bitor
      ,row_number() over(partition by t.b+c.b-bitand(t.b,c.b) order by 1) rn
  from t,c
where t.rn=1  ------- 去重复
       and bitand(t.b,c.b) in (c.b1,c.b2)
)
select count(distinct b) from t;


改成 N 之后,N=4还是跑不出来,必须另想办法。

使用道具 举报

回复
论坛徽章:
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
285#
发表于 2018-11-23 05:34 来自手机 | 只看该作者
peter的能画出111110000000我就觉得他对了,没想到还有newkid的图

使用道具 举报

回复
论坛徽章:
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
286#
发表于 2018-11-23 06:02 来自手机 | 只看该作者
@newkid 用对称能算n=4吗

使用道具 举报

回复
论坛徽章:
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
287#
发表于 2018-11-23 08:27 | 只看该作者
newkid 发表于 2018-11-23 01:09
我的写法:

VAR N NUMBER;

SQL> VAR N NUMBER;
SQL> EXEC :N:=4;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01
SQL>
SQL> VAR rN NUMBER;
SQL> EXEC :rN:=3;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01
SQL> /

COUNT(DISTINCTB)
----------------
           38910

Elapsed: 00:00:10.60

3*4还是比较快的

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
288#
发表于 2018-11-23 08:43 | 只看该作者
快有什么用,要对
看这图能不能杀死pub


使用道具 举报

回复
论坛徽章:
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
289#
发表于 2018-11-23 08:48 | 只看该作者
lugionline 发表于 2018-11-23 08:43
快有什么用,要对
看这图能不能杀死pub

呵呵,都被你秒了

使用道具 举报

回复
论坛徽章:
8
玉兔
日期:2015-11-16 10:18:00铁扇公主
日期:2015-10-27 21:47:42九尾狐狸
日期:2015-12-11 22:31:15
290#
发表于 2018-11-23 08:49 | 只看该作者
发现我的社区积分竟然是-1,做这个论坛的真是个人才啊

使用道具 举报

回复

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

本版积分规则 发表回复

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