楼主: 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
311#
 楼主| 发表于 2008-5-25 22:53 | 只看该作者
原帖由 DragonBill 于 2008-5-25 21:12 发表
想到了一个不用Procedure压缩在346Byte的办法
不过这个办法不够完善(你的Test Case有漏洞)

真是太厉害了!
测试用例的确是有漏洞, 大家都发现了.

使用道具 举报

回复
论坛徽章:
5
奥运会纪念徽章:摔跤
日期:2008-07-02 08:48:392009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2013-12-18 09:29:11SQL数据库编程大师
日期:2016-01-13 10:30:43SQL大赛参与纪念
日期:2016-01-13 10:32:19
312#
发表于 2008-5-26 00:18 | 只看该作者
CREATE        OR        REPLACE        FUNCTION        MY_ADD_MONTHS(P_DATE_STRING        VARCHAR2,        P_MONTHS        NUMBER)
RETURN        VARCHAR2        AS                                       
SUBTYPE        I        IS        INT;                               
N        I:=P_DATE_STRING;                                               
C        I:=100;                                               
D        I:=MOD(N,C);                                               
Y        I:=N/C/C;                                               
M        I:=MOD(N/C,C);                                               
Z        I:=M+P_MONTHS;                                               
FUNCTION        F(Y        I,M        I)        RETURN        I               
AS                                                       
BEGIN                                                       
RETURN        31-CASE        WHEN        M        IN(4,6,9,11)        THEN        1       
WHEN        M!=2        THEN        0                               
WHEN        MOD(Y,16)=0        OR        MOD(Y,4)=0        AND        MOD(Y,C)>0        THEN        2
ELSE        3                                               
END;                                                       
END;                                                       
BEGIN                                                       
N:=MOD(MOD(Z,12)+11,12)+1;                                                       
Z:=Y+(Z-N)/12;                                                       
IF        D=F(Y,M)        OR        D>F(Z,N)        THEN                       
D:=F(Z,N);                                                       
END        IF;                                               
RETURN        Z*C*C+N*C+D;                                               
END;                                                       
/                                                       
                                                       

SQL> /
Congratulation ... Code Length: 411 Bytes. Times: 00:00:16


帮yangtingkun节省一个字节

使用道具 举报

回复
论坛徽章:
5
奥运会纪念徽章:摔跤
日期:2008-07-02 08:48:392009日食纪念
日期:2009-07-22 09:30:00优秀写手
日期:2013-12-18 09:29:11SQL数据库编程大师
日期:2016-01-13 10:30:43SQL大赛参与纪念
日期:2016-01-13 10:32:19
313#
发表于 2008-5-26 00:21 | 只看该作者
其实我觉得这个擂台赛的目标有些偏离
应该定为最优算法,标准就是正确的结果+最小的耗时

其实是可以想见的,能达到上述目标的
字节数不见得最少,但肯定不会多 ^_^

使用道具 举报

回复
论坛徽章:
47
马上加薪
日期:2014-02-19 11:55:142011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:012010新春纪念徽章
日期:2010-03-01 11:20:512010年世界杯参赛球队:日本
日期:2010-02-26 11:04:222010新春纪念徽章
日期:2010-01-04 08:33:08祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:牛
日期:2009-09-10 11:14:59
314#
发表于 2008-5-26 07:13 | 只看该作者
create or replace function my_add_months(p_date_string varchar2,
                     p_months   number)
return varchar2
as
x char(8):=p_date_string;
y int:=0;
m int;
n int:=substr(x,5,2);
p int:=x/10000;
d int:=mod(x,100);
l int:=0;
type t is table of int;
a t:=t(31,28,31,30,31,30,31,31,30,31,30,31);
begin
if n<>2 and a(n)=d then
l:=1;
elsif mod(p,4)=0 and mod (p,25)>0 or mod(p,16)=0 then
y:=1;
end if;
if n||d-y=228 then
l:=1;
end if;
n:=n+p_months;
m:=mod(p*12+n-1,12)+1;
y:=p+(n-m)/12;
if mod(y,4)=0 and mod (y,25)>0 or mod(y,16)=0 then
a(2):=29;
end if;
if d>a(m) or l=1 then
d:=a(m);
end if;
return y*10000+m*100+d;
end;

使用道具 举报

回复
论坛徽章:
47
马上加薪
日期:2014-02-19 11:55:142011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:012010新春纪念徽章
日期:2010-03-01 11:20:512010年世界杯参赛球队:日本
日期:2010-02-26 11:04:222010新春纪念徽章
日期:2010-01-04 08:33:08祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:牛
日期:2009-09-10 11:14:59
315#
发表于 2008-5-26 08:31 | 只看该作者

比314修改了14,20,很有趣

SQL> CREATE OR REPLACE FUNCTION MY_ADD_MONTHS(P_DATE_STRING VARCHAR2, P_MONTHS NUMBER)
  2  RETURN VARCHAR2 AS
  3  SUBTYPE I IS INT;
  4  N I:=P_DATE_STRING;
  5  C I:=100;
  6  D I:=MOD(N,C);
  7  Y I:=N/C/C;
  8  M I:=MOD(N/C,C);
  9  Z I:=M+P_MONTHS;
10  FUNCTION F(Y I,M I) RETURN I
11  AS
12  BEGIN
13  RETURN 31-CASE
14  WHEN M!=2 THEN mod(floor(330/power(2,12-m)),2)
15  WHEN MOD(Y,16)=0 OR MOD(Y,4)=0 AND MOD(Y,C)>0 THEN 2
16  ELSE 3
17  END;
18  END;
19  BEGIN
20  N:=mod(y*12+z-1,12)+1;
21  Z:=Y+(Z-N)/12;
22  IF D=F(Y,M) OR D>F(Z,N) THEN
23  D:=F(Z,N);
24  END IF;
25  RETURN Z*C*C+N*C+D;
26  END;
27  /

函数已创建。

SQL> exec test_add
Congratulation ... Code Length: 415 Bytes. Times: 00:00:08

使用道具 举报

回复
论坛徽章:
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
316#
发表于 2008-5-26 09:06 | 只看该作者
昨夜本人看完"同行杀机"后, 想到了一个办法, 可以缩短到339, 如下:

Congratulation ... Code Length: 339 Bytes. Times: 00:00:08

无奈已到2008-05-26 0: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
317#
发表于 2008-5-26 09:07 | 只看该作者
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
318#
 楼主| 发表于 2008-5-26 09:15 | 只看该作者
原帖由 DragonBill 于 2008-5-26 09:07 发表
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
319#
 楼主| 发表于 2008-5-26 09:16 | 只看该作者
原帖由 DragonBill 于 2008-5-26 09:06 发表
昨夜本人看完"同行杀机"后, 想到了一个办法, 可以缩短到339, 如下:

Congratulation ... Code Length: 339 Bytes. Times: 00:00:08

无奈已到2008-05-26 0: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
320#
发表于 2008-5-26 09:20 | 只看该作者
不等飞机男(sdxiong)了?, 那我就把Codes贴上来.

使用道具 举报

回复

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

本版积分规则 发表回复

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