楼主: lastwinner

[精华] 2011复活节就要到了,来个最短源代码比赛吧![22日23点59分及之前提交代码都行!]

 关闭 [复制链接]
论坛徽章:
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
261#
发表于 2011-4-23 06:59 | 只看该作者
看了一下,newkid的思路看懂了
除了利用table()和showmax的技巧,我和他基本一样
最像的是
   F VARCHAR(100) :='YEAR        TOTAL
';
   d DATE :=DATE '1-4-25';

PROCEDURE p(s VARCHAR)
AS
BEGIN
    DBMS_OUTPUT.PUT_LINE(s);
END;

使用道具 举报

回复
论坛徽章:
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
262#
发表于 2011-4-23 07:11 | 只看该作者
niuxxf 的算法也看懂了,
我从中学到了返回值可以用char表示变长字符串

花花提供的公式确实不是最短的,尤其是最后一句,什么正负0误导
我过去的解答写法
function o(y INT) return V
as
--使用超过1次的才存入变量
        n INT:=y-1900;
        a INT:=n mod 19;
        m INT:=mod(11 * a + 4-floor((7*a+1)/19),29);
begin
        return to_char(date'1-3-31'+25-m-mod(n+floor(n/4)+31-m,7),f);
end;

最后借用的算法
function o(y INT) return V
as
        D INT:= (((255 - 11 * (y Mod 19)) - 21) Mod 30) + 22;
begin
if d>49 then d:=d+1; end if;
return to_char(date'1-3-1' + d +5 - ((y + trunc(y / 4) + d) mod 7),f);
end;

用了未公开函数wm_concat

使用道具 举报

回复
论坛徽章:
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
263#
发表于 2011-4-23 07:20 | 只看该作者
从老杨的解答学到了
        v KU$_VCNT := KU$_VCNT();

                v(i) := to_char(to_date('03-31', b) + r, b);
算基本和我原先的理解一样,避免了正负0

我们都用了动态语句,但目标不同

但是代码不是以最短为导向

procedure p(s in z) as
的in都保留了

使用道具 举报

回复
论坛徽章:
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
264#
发表于 2011-4-23 07:22 | 只看该作者
等待滚珠的密码....

使用道具 举报

回复
论坛徽章:
32
祖国60周年纪念徽章
日期:2009-10-09 08:28:002013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-06-28 11:09:23ITPUB季度 技术新星
日期:2013-07-30 16:04:58优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09红孩儿
日期:2014-03-04 16:40:38美羊羊
日期:2015-02-16 16:36:28懒羊羊
日期:2015-03-04 14:52:11
265#
发表于 2011-4-23 08:19 | 只看该作者
create or replace package easter as
    procedure showAllEasterDay;
    procedure showMaxOccurenceEasterDay;
    procedure showLeapEasterDay;
    procedure showFoolEasterDay;
end;
/
create or replace package body easter as
    subtype w is varchar2(99);

    type s is table of w index by w;
    u s;
    r s;
    t w;
    q w := 0;
    m w := 0;
    n w := 0;

    procedure p(a w)as begin dbms_output.put_line(a); end;
   
    procedure showAllEasterDay as
        d w;
        a w;
        c w;
        b w;
        e w;
    begin
        u.delete;
        t := 0;
        p('YEAR    DAY');
        for i in 1900 .. 2099 loop
            d := i - 1900;
            a := mod(d,19);
            c := mod(11 * a + 4 - trunc((7 * a + 1)/19), 29);
            b := 25-c-mod(d + trunc(d/4) + 31 - c, 7);
            
            if b > 0
            then a := '04'; c := b;
            else a := '03'; c := 31+b;
            end if;
            c := lpad(c,2,0);
            
            
            b := a||'-'||c;
            p(i || '    ' || b);
            if b = '04-01' then r(t) := i; t := t + 1; end if;
            if u.exists(b) then
                e := u(b) + 1;
                if e > q then
                    q := e;
                end if;
                if b like '03%' then
                    m := greatest(e,m);
                else
                    n := greatest(e,n);
                end if;
            else e := 1;
            end if;
            u(b) := e;
        end loop;
    end;
   
    procedure showMaxOccurenceEasterDay as
        d  w;
        e  w;
        f  w;
        i  w := u.first;
        g  w;
    begin
        while i is not null loop
            g := u(i);
            if g = q then
                d := d || '/' || i;
            end if;
            if i like '03%' and g = m then
                e := e || '/' || i;
            elsif g = n then
                f := f || '/' || i;
            end if;
            i := u.next(i);
        end loop;

        p('MAXOCC             MO_CNT  MAXOCC_3      MO3_CNT    MAXOCC_4     MO4_CNT    ');
        p(ltrim(d,'/') || '  '  || q || '       ' ||
          ltrim(e,'/') || '         '  || m  || '          '  ||
          ltrim(f,'/') || '  '  || n);
    end;

    procedure showLeapEasterDay as
        b     w;
        e     w;
        a     w;
        c     w := 0;
    begin
        p('ABSENT_START  ABSENT_END');
        for i in 0 .. date'1-4-25' - date'1-3-22' + 1 loop
            a := to_char(date'1-3-22' + i, 'mm-dd');
            if u.exists(a) then
                if c = 1 then
                    p(b || '          ' || e);
                end if;
                c := 0;
            else
                e := a;
                if c = 0 then
                    b := a;
                end if;
                if a = '04-25' then
                    p(b || '          ' || e);
                end if;
                c := 1;
            end if;
        end loop;
    end;
   
    procedure showFoolEasterDay as
    begin
        p('YEAR    TOTAL');
        for i in 0 .. r.count-1 loop
            p(r(i) || '     ' || t);
        end loop;
    end;
end;
/

使用道具 举报

回复
论坛徽章:
32
祖国60周年纪念徽章
日期:2009-10-09 08:28:002013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-06-28 11:09:23ITPUB季度 技术新星
日期:2013-07-30 16:04:58优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09红孩儿
日期:2014-03-04 16:40:38美羊羊
日期:2015-02-16 16:36:28懒羊羊
日期:2015-03-04 14:52:11
266#
发表于 2011-4-23 08:19 | 只看该作者
真的啊,原来mod还能这么用

使用道具 举报

回复
论坛徽章:
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
267#
发表于 2011-4-23 08:39 | 只看该作者
昨天忙了大半天, Q2,Q3就想不到好办法
呵呵!
比赛第二,学习第一!

[ 本帖最后由 jboracle1981 于 2011-4-23 14:49 编辑 ]

使用道具 举报

回复
论坛徽章:
32
祖国60周年纪念徽章
日期:2009-10-09 08:28:002013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-06-28 11:09:23ITPUB季度 技术新星
日期:2013-07-30 16:04:58优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09红孩儿
日期:2014-03-04 16:40:38美羊羊
日期:2015-02-16 16:36:28懒羊羊
日期:2015-03-04 14:52:11
268#
发表于 2011-4-23 08:44 | 只看该作者
看了这么多,用纯plsql处理的好像就我啊,嘿嘿

使用道具 举报

回复
论坛徽章:
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
269#
发表于 2011-4-23 08:47 | 只看该作者
学习了学习了

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
270#
 楼主| 发表于 2011-4-23 15:07 | 只看该作者
先锁帖了,周末忙,抽空再看大家的解答。各位1500字节以内的,开新帖说说你们的算法吧!

使用道具 举报

回复

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

本版积分规则 发表回复

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