楼主: nyfor

[精华] nyfor 复活节比短代码解题说明

[复制链接]
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
21#
 楼主| 发表于 2011-4-28 11:00 | 只看该作者
暂时不想了. 贴上 1200 bytes 的代码:
create or replace package easter is
  procedure showAllEasterDay;
  procedure showMaxOccurenceEasterDay;
  procedure showLeapEasterDay;
  procedure showFoolEasterDay;
end;
/
create or replace package body easter is
  c dbms_sql.varchar2s;
  subtype w is varchar(999);

  s w;
  x w;
  v date := date '1-3-31';

  procedure p(t w) is
  begin
    dbms_output.put_line(t);
  
    for i in -30 .. 50 loop
      c(i) := 0;
    end loop;
  
    for y in 2011 .. 2099 loop
      s := y mod 19;
      s := (11 * s + 4 - trunc((7 * s + 1) / 19)) mod 29;
      x := 25 - s - (y - 2344 + trunc(y / 4) - s) mod 7;
   
      c(y) := to_char(v + x, ' mm-dd');
   
      c(x) := c(x) - 1;
   
      s := sign(x - 1) + 40;
      c(s) := least(+c(x), c(s));
    end loop;
    s := '';
  end;

  procedure showAllEasterDay is
  begin
    p('YEAR DAY');
    for y in 2011 .. 2099 loop
      p(y || c(y));
    end loop;
  end;
  procedure z(w w, n w := 30, m w := -30) is
  begin
    for f in m .. n loop
      if c(f) = w then
        s := s || to_char(v + f, 'mm-dd/');
      end if;
    end loop;
    s := rtrim(s, '/') || ' ' || -w || ' ';
  end;
  procedure showMaxOccurenceEasterDay is
  begin
    p('MAXOCC                               MO_CNT MAXOCC_3 MO3_CNT    MAXOCC_4          MO4_CNT');
  
    x := least(+c(40), c(41));
    z(least(+x, c(39)));
    z(c(39), 0);
    z(x, 30, 1);
  
    p(s);
  end;
  procedure showLeapEasterDay is
  begin
    p('ABSENT_START ABSENT_END');
    for i in 22 - 31 .. 25 loop
      x := to_char(v + i, 'mm-dd   ');
      if c(i) = 0 then
        s := nvl(s, x);
      end if;
      if s < x and (i = 25 or c(i + 1) < 0) then
        p(s || x);
      end if;
    end loop;
  end;
  procedure showFoolEasterDay is
  begin
    p('YEAR TOTAL');
    for y in 2011 .. 2099 loop
      if substr(c(y), -2) = 1 then
        p(y || ' ' || -c(40));
      end if;
    end loop;
  end;
end;
/

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
22#
发表于 2011-4-28 11:21 | 只看该作者
1200 bytes 了。
牛!

使用道具 举报

回复
论坛徽章:
68
沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31妮可·罗宾
日期:2016-08-13 17:30:51
23#
发表于 2011-4-28 13:29 | 只看该作者
厉害

使用道具 举报

回复
论坛徽章:
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
24#
发表于 2011-4-28 13:35 | 只看该作者
if s < x and (i = 25 or c(i + 1) < 0)
如何处理
4-25 4-25这样的输出?如果把2011-2099变成变量

使用道具 举报

回复
论坛徽章:
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
25#
发表于 2011-4-28 13:48 | 只看该作者
比如把2011-〉2091
SQL> exec easter.showAlLEasterDay
YEAR DAY
2091 04-08
2092 03-30
2093 04-12
2094 04-04
2095 04-24
2096 04-15
2097 03-31
2098 04-20
2099 04-12

PL/SQL 过程已成功完成。

如果把s<x改为s<=x
SQL> exec easter.showLeapEasterDay
ABSENT_START ABSENT_END
03-22   03-29
04-01   04-03
04-05   04-07
04-09   04-11
04-13   04-14
04-16   04-19
04-21   04-23
04-25   04-25

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
26#
 楼主| 发表于 2011-4-28 14:18 | 只看该作者
原帖由 〇〇 于 2011-4-28 13:35 发表
if s < x and (i = 25 or c(i + 1) < 0)
如何处理
4-25 4-25这样的输出?如果把2011-2099变成变量

真是火眼金星啊. s < x 原本是 s is not null 想利用一个 比较运算符来替代 is not null 的, 结构漏考虑了 s和x相等的情况.
如你所说 改成 s <= x 即可. 多一个字节.

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
27#
 楼主| 发表于 2011-4-28 14:23 | 只看该作者
改成 s = s 即可, 字节数不变.

使用道具 举报

回复
论坛徽章:
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
28#
发表于 2011-4-28 16:58 | 只看该作者
原帖由 nyfor 于 2011-4-28 14:23 发表
改成 s = s 即可, 字节数不变.

真是充分利用null的特性,是否将来可以把is not null取代了

使用道具 举报

回复
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
29#
发表于 2011-4-28 18:57 | 只看该作者
牛逼!

使用道具 举报

回复
论坛徽章:
10000
绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2016-02-22 15:43:08绿钻
日期:2016-03-01 18:19:01绿钻
日期:2015-12-16 18:42:35绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-12-11 00:18:01绿钻
日期:2015-09-10 13:05:08绿钻
日期:2015-09-10 13:05:08
30#
发表于 2011-4-28 19:36 | 只看该作者
牛!
老大,干脆把这个
subtype w is varchar(999)
改成
subtype w is long算了吧,虽然意义不大。
土点就土点,应该不会出错吧
突破2000b

[ 本帖最后由 jboracle1981 于 2011-4-28 19:47 编辑 ]

使用道具 举报

回复

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

本版积分规则 发表回复

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