楼主: DragonBill

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

[复制链接]
论坛徽章:
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
31#
 楼主| 发表于 2011-4-30 09:30 | 只看该作者

YES, 1199, 下标的妙用

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

create or replace package body easter is

  R     KU$_VCNT := KU$_VCNT();
  D     INT;
  E     INT;

  PROCEDURE O(L VARCHAR := ' ') IS
        S     CHAR(6);
        X     INT;
  BEGIN
        IF L = ' ' THEN
                   FOR I IN 301..430 LOOP

                        E := R(I);

                        X := TRUNC(I/100);

                        IF D < 99 THEN
                                S := 0 || X || TO_CHAR(-I MOD 100,'09') || '/';
                        END IF;

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

                        IF E >= 0 || R(X) THEN
                                R(X) := E;
                                R(5 + X) := R(5 + X) || S;
                        END IF;


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

                    END LOOP;
        END IF;
        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(802),'#',LENGTH(R(802))/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(8) || '      ' || R(3) || '    ' || R(9) || '      ' || R(4), '/ '));

   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),'-');

            R(D*2) := R(D*2) || I || ' #
';
            R(D) := 0 || R(D) + 1;

        END LOOP;

        O;

        D := GREATEST(R(3), R(4));

        O;
END;
/

[ 本帖最后由 DragonBill 于 2011-4-30 09: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
32#
 楼主| 发表于 2011-4-30 09:35 | 只看该作者
1, 修改了DM_ITEMS不能通过编译的问题, 改用 KU$_VCNT  两者一样。
2, 神奇的脑子, 总能在计穷的时候神来一笔(自我陶醉一下)

使用道具 举报

回复
论坛徽章:
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
33#
发表于 2011-4-30 09:44 | 只看该作者
原帖由 DragonBill 于 2011-4-30 09:35 发表
1, 修改了DM_ITEMS不能通过编译的问题, 改用 KU$_VCNT  两者一样。
2, 神奇的脑子, 总能在计穷的时候神来一笔(自我陶醉一下)

使用道具 举报

回复
论坛徽章:
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
34#
 楼主| 发表于 2011-4-30 12:11 | 只看该作者

继续前进,我被它迷住了:) 1190

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

create or replace package body easter is

  R     KU$_VCNT := KU$_VCNT();
  D     INT;

  PROCEDURE O(L VARCHAR := ' ') IS
        S     CHAR(6);
        X     INT;
        E     INT;
  BEGIN

        IF L = ' ' THEN
                   FOR I IN 301..430 LOOP

                        X := TRUNC(I/100);

                        IF D < 99 THEN
                                S := 0 || X || TO_CHAR(-I MOD 100,'09') || '/';
                        END IF;

                        E := R(I);

                        IF E >= 0 || R(X) THEN
                                R(X) := E;
                                R(5 + X) := R(5 + X) || S;
                                R(9 + E) := R(9 + E) || S;                        END IF;

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

                    END LOOP;
        END IF;

        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(802),'#',LENGTH(R(802))/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(9 + D) || '     ' || D || '    ' || R(8) || '      ' || R(3) || '    ' || R(9) || '      ' || R(4), '/ '));

   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),'-');

            R(D*2) := R(D*2) || I || ' #
';
            R(D) := 0 || R(D) + 1;

        END LOOP;

        O;

        D := GREATEST(R(3), R(4));

        O;
END;
/

使用道具 举报

回复
论坛徽章:
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
35#
发表于 2011-4-30 12:26 | 只看该作者
又是一位神人!

使用道具 举报

回复
论坛徽章:
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
36#
 楼主| 发表于 2011-4-30 12:49 | 只看该作者

1186, 利用输出空字符串的位置控制LOOP

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

create or replace package body easter is

  R     KU$_VCNT := KU$_VCNT();
  D     INT;

  PROCEDURE O(L VARCHAR := ' ') IS
        S     CHAR(6);
        X     INT;
        E     INT;
  BEGIN

        FOR I IN 301*INSTR(L, ' ')..430 LOOP

                X := TRUNC(I/100);

                IF D < 99 THEN
                        S := 0 || X || TO_CHAR(-I MOD 100,'09') || '/';
                END IF;

                E := R(I);

                IF E >= 0 || R(X) THEN
                        R(X) := E;
                        R(5 + X) := R(5 + X) || S;
                        R(9 + E) := R(9 + E) || S;
                END IF;

                IF I || E < 332 AND I > 321 OR I || E < 426 AND I > 400 THEN
                        R(2) := R(2) || 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(802),'#',LENGTH(R(802))/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(9 + D) || '     ' || D || '    ' || R(8) || '      ' || R(3) || '    ' || R(9) || '      ' || R(4), '/ '));

   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),'-');

            R(D*2) := R(D*2) || I || ' #
';
            R(D) := 0 || R(D) + 1;

        END LOOP;

        O;

        D := GREATEST(R(3), R(4));

        O;
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
37#
发表于 2011-4-30 15:03 | 只看该作者
强,快接近我人工wrap的字节数了

使用道具 举报

回复
论坛徽章:
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
38#
 楼主| 发表于 2011-4-30 15:06 | 只看该作者
拿掉了 S, X 变量,并且取消 IF D < 99...语句,改用R(I*3)架构存放日期格式字符串, 压至 1176

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

create or replace package body easter is

  R     KU$_VCNT := KU$_VCNT();
  D     INT;

  PROCEDURE O(L VARCHAR := ' ') IS
        E     INT;
  BEGIN

        FOR I IN 301*INSTR(L, ' ')..430 LOOP

                D := TRUNC(I/100);

                E := R(I);

                IF E >= 0 || R(D) THEN
                        R(D) := E;
                        R(5 + D) := R(5 + D) || R(I * 3);
                        R(9 + E) := R(9 + E) || R(I * 3);
                END IF;

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

                R(I * 3) := 0 || D || TO_CHAR(-I MOD 100,'09') || '/';
        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(802),'#',LENGTH(R(802))/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(9 + D) || '     ' || D || '    ' || R(8) || '      ' || R(3) || '    ' || R(9) || '      ' || R(4), '/ '));

   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),'-');

            R(D*2) := R(D*2) || I || ' #
';
            R(D) := 0 || R(D) + 1;

        END LOOP;

        O;
        O;
        D := GREATEST(R(3), R(4));END;
/

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

使用道具 举报

回复
论坛徽章:
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
39#
 楼主| 发表于 2011-4-30 15:12 | 只看该作者

回复 #37 〇〇 的帖子

你人工是多少?

使用道具 举报

回复
论坛徽章:
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
40#
发表于 2011-4-30 15:20 | 只看该作者
http://www.itpub.net/thread-1419945-6-1.html
254
用196的工具测试
1169

使用道具 举报

回复

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

本版积分规则 发表回复

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