复活节最短源代码比赛

create or replace package easter is
  function f(y number) return varchar2;
  procedure showAllEasterDay;
  procedure showMaxOccurenceEasterDay;
  procedure showLeapEasterDay;
  procedure showFoolEasterDay;
end easter;
/
create or replace package body easter is
  function f(y number) return varchar2 is
    n number;
    m number;
  begin
    n := y - 1900;
    m := mod(11 * mod(n, 19) + 4 - floor((7 * mod(n, 19) + 1) / 19), 29);
    return to_char(to_date('0425', 'mmdd') - m -
                   mod(n + floor(n / 4) + 31 - m, 7),
                   'mm-dd');
  end;
  procedure p(v varchar2) is
  begin
    dbms_output.put_line(v);
  end;
  procedure showAllEasterDay is
    i number;
  begin
    p('YEAR DAY');
    for i in 2011 .. 2099 loop
      p(i || ' ' || f(i));
    end loop;
  end;
  function q(u varchar2, v varchar2) return varchar2 is
    r varchar2(200);
    i number;
  begin
    r := '';
    for x in (with q as (select d, count(*) c
                   from (select f(2010 + level) d
                           from dual
                         connect by level < 90)
                  where substr(d, 1, 2) in (u, v)
                  group by d)select *
                from q
               where c = (select max(c) from q)
               order by 1) loop
      i := x.c;
      r := r || '/' || x.d;
    end loop;
    return substr(r, 2) || ' ' || i || ' ';
  end;
  procedure showMaxOccurenceEasterDay is
  begin
    p('MAXOCC MO_CNT MAXOCC_3 MO3_CNT MAXOCC_4 MO4_CNT');
    p(q('03', '04') || q('03', '') || q('', '04'));
  end;
  procedure showLeapEasterDay is
  begin
    p('ABSENT_START ABSENT_END');
    for x in (select min(d) s, max(d) e
                from (select d, l - rownum g
                        from (select level l,
                                     to_char(to_date('0321', 'mmdd') + level,
                                             'mm-dd') d
                                from dual
                              connect by level < 36)
                       where d not in (select f(2010 + level)
                                         from dual
                                       connect by level < 90))
               group by g
               order by 1) loop
      p(x.s || ' ' || x.e);
    end loop;
  end;
  procedure showFoolEasterDay is
  begin
    p('YEAR TOTAL');
    for x in (select 2010 + level y, count(*) over() d
                from dual
               where f(2010 + level) = '04-01'
              connect by level < 90) loop
      p(x.y || ' ' || x.d);
    end loop;
  end;
end easter;
/
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/81227/viewspace-693627/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/81227/viewspace-693627/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值