楼主: DragonBill

[精华] (酱油)关于复活节最短源码的尝试

[复制链接]
论坛徽章:
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
11#
发表于 2011-4-27 20:56 | 只看该作者
又见神人

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期: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
12#
发表于 2011-4-27 22:49 | 只看该作者
很好的开端,请继续!

使用道具 举报

回复
论坛徽章:
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
13#
发表于 2011-4-28 07:25 | 只看该作者
原帖由 lastwinner 于 2011-4-27 19:40 发表
大牛出马了,有好戏看了,哈哈

后继还在继续研究的是否应该再设个啥奖项?

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
14#
 楼主| 发表于 2011-4-28 10:20 | 只看该作者

目前 1311 好数字,看今天能不能压到 1200

create or replace package easter is
  PROCEDURE showAllEasterDay;
  PROCEDURE showMaxOccurenceEasterDay;
  PROCEDURE showLeapEasterDay;
  PROCEDURE showFoolEasterDay;
end;
/

create or replace package body easter is

  R     DM_ITEMS := DM_ITEMS();
  D        INT;
  B     INT := 0;
  C     INT := 0;
  E     INT;
  S     VARCHAR(999);

  PROCEDURE O(L VARCHAR, F INT := 999) IS
  BEGIN
        DBMS_OUTPUT.PUT_LINE(L);

            FOR I IN 301+F..430 LOOP

                S := 0 || REPLACE(RPAD(I/100, 4, 0),'.','-') || '/';

                E := 0 || R(I);

                IF I < 332 OR I > 400 THEN
                        IF E = 0 AND I < 426 THEN
                                R(2) := R(2) || S;
                        END IF;

                        IF F = 0 THEN

                                IF E = D THEN
                                        R(8) := R(8) || S;
                                END IF;


                                IF I < 332 AND E = B THEN
                                        R(6) := R(6) || S;
                                END IF;

                                IF I > 400 AND E = C THEN
                                        R(7) := R(7) || S;
                                END IF;
                        END IF;

                END IF;

            END LOOP;
  END;

  PROCEDURE showAllEasterDay IS
  BEGIN

    O('YEAR DAY');
    FOR X IN 2011..2099 LOOP
       O(X || R(X));
    END LOOP;

  END;

  PROCEDURE showFoolEasterDay IS
  BEGIN

       O('YEAR TOTAL
' || REPLACE(R(1),'#',LENGTH(R(1))/7));

  END;

  PROCEDURE showLeapEasterDay IS
  BEGIN

        O('ABSENT_START ABSENT_END
' || SUBSTR(R(2),1,5) || '        ' || SUBSTR(R(2),-6,5));


   END;


   PROCEDURE showMaxOccurenceEasterDay IS
   BEGIN

        O('MAXOCC   MO_CNT        MAXOCC_3   MO3_CNT              MAXOCC_4          MO4_CNT
' || REPLACE(R(8) || '     ' || D || '    ' || R(6) || '      ' || B || '    ' || R(7) || '      ' || C, '/ ' , ' '));

   END;

BEGIN

        FOR I IN 2011..2099 LOOP

            R.EXTEND(I);

                D := (234 - 11 * (I MOD 19)) MOD 30 ;
            IF D > 27 THEN
               D := D + 1;
            END IF;

            R(I) := TO_CHAR(DATE'1-3-28' + D - (I + TRUNC(I / 4) + D + 1) MOD 7,' MM-DD');

               D := REPLACE(R(I),'-','');

               IF D = 401 THEN
                R(1) := R(1) || I || ' #
';
            END IF;

            R(D) := 0 || R(D) + 1;
            E := R(D);

            IF D < 332 AND E > B THEN
               B := E;
            END IF;

            IF D > 400 AND E > C THEN
               C := E;
            END IF;

        END LOOP;

        D := GREATEST(B, C);

        O('',21);

        O('',0);

END;
/


set serveroutput on
exec easter.showFoolEasterDay;
exec easter.showLeapEasterDay;
exec easter.showMaxOccurenceEasterDay;
exec easter.showAllEasterDay;

SELECT SUM(length(REPLACE(REPLACE(REPLACE(text, ' '), chr(9)), chr(10)))) bytes  FROM user_source WHERE NAME = 'EASTER';
/

[ 本帖最后由 DragonBill 于 2011-4-28 10:22 编辑 ]

使用道具 举报

回复
论坛徽章:
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
15#
发表于 2011-4-28 10:54 | 只看该作者
原帖由 DragonBill 于 2011-4-28 10:20 发表
目前 1311 好数字,看今天能不能压到 1200


期待...

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
16#
 楼主| 发表于 2011-4-28 15:49 | 只看该作者

1281, 完了,脑子快宕机了

create or replace package easter is
  PROCEDURE showAllEasterDay;
  PROCEDURE showMaxOccurenceEasterDay;
  PROCEDURE showLeapEasterDay;
  PROCEDURE showFoolEasterDay;
end;
/

create or replace package body easter is

  R     DM_ITEMS := DM_ITEMS();
  D        INT;
  B     INT := 0;
  C     INT := 0;
  E     INT;
  S     VARCHAR(999);

  PROCEDURE O(L VARCHAR, F INT := 999) IS
  BEGIN
       
            FOR I IN F..430 LOOP

                S := 0 || REPLACE(RPAD(I/100, 4, 0),'.','-') || '/';

                E := R(I);

                IF  I || E < 332 AND I > 321 OR I || E < 426 AND I > 400 THEN
                        R(2) := R(2) || S;
                END IF;


                IF E = D THEN
                        R(8) := R(8) || S;
                END IF;

                IF I < 332 AND E = B THEN
                        R(6) := R(6) || S;
                END IF;

                IF I > 400 AND E = C THEN
                        R(7) := R(7) || S;
                END IF;

            END LOOP;

        DBMS_OUTPUT.PUT_LINE(L);
  END;

  PROCEDURE showAllEasterDay IS
  BEGIN

    O('YEAR DAY');
    FOR X IN 2011..2099 LOOP
       O(X || R(X));
    END LOOP;

  END;

  PROCEDURE showFoolEasterDay IS
  BEGIN

       O('YEAR TOTAL
' || REPLACE(R(1),'#',LENGTH(R(1))/7));

  END;

  PROCEDURE showLeapEasterDay IS
  BEGIN

        O('ABSENT_START ABSENT_END
' || SUBSTR(R(2),1,5) || '        ' || SUBSTR(R(2),-6,5));

   END;


   PROCEDURE showMaxOccurenceEasterDay IS
   BEGIN

        O('MAXOCC   MO_CNT        MAXOCC_3   MO3_CNT              MAXOCC_4          MO4_CNT
' || REPLACE(R(8) || '     ' || D || '    ' || R(6) || '      ' || B || '    ' || R(7) || '      ' || C, '/ ' , ' '));

   END;

BEGIN

        FOR I IN 2011..2099 LOOP

            R.EXTEND(I);

                D := (234 - 11 * (I MOD 19)) MOD 30 ;
            IF D > 27 THEN
               D := D + 1;
            END IF;

            R(I) := TO_CHAR(DATE'1-3-28' + D - (I + TRUNC(I / 4) + D + 1) MOD 7,' MM-DD');

               D := REPLACE(R(I),'-','');

               IF D = 401 THEN
                R(1) := R(1) || I || ' #
';
            END IF;

            R(D) := 0 || R(D) + 1;
            E := R(D);

            IF D < 332 AND E > B THEN
               B := E;
            END IF;

            IF D > 400 AND E > C THEN
               C := E;
            END IF;

        END LOOP;

        D := GREATEST(B, C);

        O('',301);

END;
/


set serveroutput on
exec easter.showFoolEasterDay;
exec easter.showLeapEasterDay;
exec easter.showMaxOccurenceEasterDay;
exec easter.showAllEasterDay;

SELECT SUM(length(REPLACE(REPLACE(REPLACE(text, ' '), chr(9)), chr(10)))) bytes  FROM user_source WHERE NAME = 'EASTER';
/

[ 本帖最后由 DragonBill 于 2011-4-28 15:50 编辑 ]

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
17#
 楼主| 发表于 2011-4-28 15:52 | 只看该作者
表示很累滴说,先休息一下,毕竟到1300以下了, COME ON....

使用道具 举报

回复
论坛徽章:
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
18#
发表于 2011-4-28 17:00 | 只看该作者
PROCEDURE showFoolEasterDay IS
  BEGIN

       O('YEAR TOTAL
' || REPLACE(R(1),'#',LENGTH(R(1))/7));

  END;

好像和我的思路有点点像

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
19#
 楼主| 发表于 2011-4-29 00:36 | 只看该作者

老牛破车慢悠悠, 1260了, 离1200还差得远

create or replace package easter is
  PROCEDURE showAllEasterDay;
  PROCEDURE showMaxOccurenceEasterDay;
  PROCEDURE showLeapEasterDay;
  PROCEDURE showFoolEasterDay;
end;
/

create or replace package body easter is

  R     DM_ITEMS := DM_ITEMS();
  D        INT;
  B     INT := 0;
  C     INT := 0;
  E     INT;

  PROCEDURE O(L VARCHAR, F INT := 999, X INT := 0) IS
        S     VARCHAR(999);  BEGIN
       
        DBMS_OUTPUT.PUT_LINE(L);

            FOR I IN F..430 LOOP

                IF X = 1 THEN
                        S := 0 || REPLACE(RPAD(I/100, 4, 0),'.','-') || '/';
                END IF;


                E := R(I);

                IF  I || E < 332 AND I > 321 OR I || E < 426 AND I > 400 THEN
                        R(2) := R(2) || S;
                END IF;

                IF E = D THEN
                        R(5) := R(5) || S;
                END IF;

                IF I < 400 AND E >= B THEN
                        B := E;
                        R(3) := R(3) || S;
                END IF;

                IF I > 400 AND E >= C THEN
                        C := E;
                        R(4) := R(4) || S;
                END IF;


            END LOOP;
  END;

  PROCEDURE showAllEasterDay IS
  BEGIN

    O('YEAR DAY');
    FOR X IN 2011..2099 LOOP
       O(X || R(X));
    END LOOP;

  END;

  PROCEDURE showFoolEasterDay IS
  BEGIN

       O('YEAR TOTAL
' || REPLACE(R(1),'#',LENGTH(R(1))/7));

  END;

  PROCEDURE showLeapEasterDay IS
  BEGIN

        O('ABSENT_START ABSENT_END
' || SUBSTR(R(2),1,5) || '        ' || SUBSTR(R(2),-6,5));

   END;


   PROCEDURE showMaxOccurenceEasterDay IS
   BEGIN

        O('MAXOCC   MO_CNT        MAXOCC_3   MO3_CNT              MAXOCC_4          MO4_CNT
' || REPLACE(R(5) || '     ' || D || '    ' || R(3) || '      ' || B || '    ' || R(4) || '      ' || C, '/ ' , ' '));

   END;

BEGIN

        FOR I IN 2011..2099 LOOP

            R.EXTEND(I);

                D := (234 -  I MOD 19 * 11) MOD 30 ;
            D := D + INSTR(27-D,'-');
            R(I) := TO_CHAR(DATE'1-3-28' + D - (I + TRUNC(I / 4) + D + 1) MOD 7,' MM-DD');

               D := REPLACE(R(I),'-','');

               IF D = 401 THEN
                R(1) := R(1) || I || ' #
';
            END IF;

            R(D) := 0 || R(D) + 1;

        END LOOP;

        O('',301);

        D := GREATEST(B, C);

        O('',301, 1);


END;
/


set serveroutput on
exec easter.showFoolEasterDay;
exec easter.showLeapEasterDay;
exec easter.showMaxOccurenceEasterDay;
exec easter.showAllEasterDay;

SELECT SUM(length(REPLACE(REPLACE(REPLACE(text, ' '), chr(9)), chr(10)))) bytes  FROM user_source WHERE NAME = 'EASTER';
/

[ 本帖最后由 DragonBill 于 2011-4-29 00:37 编辑 ]

使用道具 举报

回复
论坛徽章:
18
生肖徽章2007版:虎
日期:2008-04-11 18:37:24奥运会纪念徽章:击剑
日期:2008-07-03 11:38:17迷宫蛋
日期:2011-05-10 13:03:40茶鸡蛋
日期:2011-05-10 13:05:16蜘蛛蛋
日期:2011-05-10 13:07:01灰彻蛋
日期:2012-12-10 11:47:16鲜花蛋
日期:2013-07-07 10:07:20
20#
 楼主| 发表于 2011-4-29 00:39 | 只看该作者

回复 #18 〇〇 的帖子

呵呵,很正常,其实很多技巧殊途同归。

就是不断的对代码进行重构和变换

夜了,洗洗睡,希望明早又有一个new idea

使用道具 举报

回复

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

本版积分规则 发表回复

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