楼主: 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
411#
 楼主| 发表于 2008-5-27 09:04 | 只看该作者
原帖由 leniz 于 2008-5-26 19:30 发表
nyfor   記得要 將每個人的都加到首貼 連接中

没问题, 目前还有一些网友的代码没有贴上来, 我也不着急, 毕竟还要忙工作
稍后做个整理.

使用道具 举报

回复
论坛徽章:
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
412#
发表于 2008-5-27 09:22 | 只看该作者
我盘算一下, 这次能捞多少外快??

使用道具 举报

回复
论坛徽章:
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
413#
发表于 2008-5-27 09:23 | 只看该作者
等nyfor整理完毕后再讲解.


现在自己慢慢看, 慢慢推算

使用道具 举报

回复
论坛徽章:
14
生肖徽章2007版:蛇
日期:2008-03-24 17:16:29生肖徽章2007版:猴
日期:2009-02-09 15:03:45生肖徽章2007版:猪
日期:2009-03-16 10:15:58生肖徽章2007版:龙
日期:2009-03-27 12:02:52生肖徽章2007版:虎
日期:2009-04-15 17:44:55
414#
发表于 2008-5-27 09:38 | 只看该作者
告一段落了?

使用道具 举报

回复
论坛徽章:
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
415#
发表于 2008-5-27 10:18 | 只看该作者
更新至 318 Byte, 但该方法存在一个小Bug
如果允许0年{0,1}月这种格式存在的话, 该 Function 存在错误
注意我红色标出的地方, 用了 Z < 2 作判断
常规情况下, Y * 12 + M + p_months(即Z的初始值), 应该是一定大于1的,
但如果出现下列情况:
p_date_string = 16000101, p_months = -19200(或是-19201, -19202, etc.)
那么就会出现程序错误.
但是反过来考虑, 如果出现以上的情况,
就意味着最后得出的年月一定为0(或者是负数)年{0,1}月, 这种格式事实上是不存在的.

就本题给出的种种规则来看, 我认为这种写法是可行的


--Congratulation ... Code Length: 318 Bytes. Times: 00:00:08
create or replace function my_add_months(p_date_string varchar2,
                                         p_months      number)
  return varchar2
AS
   C INT := p_date_string;
   H INT := 100;
   Y INT := C/H/H;
   M INT := C/H - Y * H;
   D INT := C MOD H;
   Z INT := Y * 12 + M + p_months;
BEGIN
   LOOP
      C := 27 + SUBSTR(43434434341 + 0 ** (Y MOD (4 + 12 * 0 ** (Y MOD H))), 1 - M, 1);
      EXIT WHEN Z < 2;
      Y := (Z - 7) / 12;
      M := Z - Y * 12;
      Z := D/C/2;
   END LOOP;

   RETURN Y * H * H + M * H + LEAST(C, Z || D);
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
416#
发表于 2008-5-27 10:23 | 只看该作者
原帖由 DragonBill 于 2008-5-25 21:12 发表
想到了一个不用Procedure压缩在346Byte的办法
不过这个办法不够完善(你的Test Case有漏洞)



这里所说的漏洞就是指这个LOOP.

使用道具 举报

回复
论坛徽章:
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
417#
发表于 2008-5-27 10:26 | 只看该作者
我最初用的是GOTO + LABEL的实现手法

使用道具 举报

回复
论坛徽章:
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
418#
 楼主| 发表于 2008-5-27 11:37 | 只看该作者
原帖由 DragonBill 于 2008-5-27 10:18 发表
更新至 318 Byte, 但该方法存在一个小Bug
如果允许0年{0,1}月这种格式存在的话, 该 Function 存在错误
注意我红色标出的地方, 用了 Z < 2 作判断
常规情况下, Y * 12 + M + p_months(即Z的初始值), 应该是一定大于1的,
但如果出现下列情况:
p_date_string = 16000101, p_months = -19200(或是-19201, -19202, etc.)
那么就会出现程序错误.
但是反过来考虑, 如果出现以上的情况,
就意味着最后得出的年月一定为0(或者是负数)年{0,1}月, 这种格式事实上是不存在的.

就本题给出的种种规则来看, 我认为这种写法是可行的


--Congratulation ... Code Length: 318 Bytes. Times: 00:00:08
create or replace function my_add_months(p_date_string varchar2,
                                         p_months      number)
  return varchar2
AS
   C INT := p_date_string;
   H INT := 100;
   Y INT := C/H/H;
   M INT := C/H - Y * H;
   D INT := C MOD H;
   Z INT := Y * 12 + M + p_months;
BEGIN
   LOOP
      C := 27 + SUBSTR(43434434341 + 0 ** (Y MOD (4 + 12 * 0 ** (Y MOD H))), 1 - M, 1);
      EXIT WHEN Z < 2;
      Y := (Z - 7) / 12;
      M := Z - Y * 12;
      Z := D/C/2;
   END LOOP;

   RETURN Y * H * H + M * H + LEAST(C, Z || D);
END;
/

真是PF得不行了....

使用道具 举报

回复
论坛徽章:
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
419#
发表于 2008-5-27 11:56 | 只看该作者
还是早点了结了吧,
我估计有的人睡觉的时候都在想这个问题
各位高手:
记住发个红包给我这个看热闹的

使用道具 举报

回复
论坛徽章:
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
420#
发表于 2008-5-28 09:24 | 只看该作者
原帖由 DragonBill 于 2008-5-27 00:14 发表
对了 hotiice  , 能请你解释一下 mod(floor(330/power(2,12-m)),2) 的思路吗?
看不大明白?



想明白了, 位移

使用道具 举报

回复

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

本版积分规则 发表回复

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