楼主: nyfor

[精华] nyfor 复活节比短代码解题说明

[复制链接]
论坛徽章:
46
凯迪拉克
日期:2013-08-22 10:00:10Jeep
日期:2013-08-10 07:21:13ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:体操
日期:2008-10-24 13:08:31会员2007贡献徽章
日期:2007-09-26 18:42:10马上加薪
日期:2014-04-11 09:34:11秀才
日期:2015-09-06 10:19:32
41#
发表于 2011-4-30 09:07 | 只看该作者
原帖由 nyfor 于 2011-4-29 22:10 发表
s := (11 * s + 4 - trunc((7 * s + 1) / 19)) mod 29;
x := 25 - s - (y - 2344 + trunc(y / 4) - s) mod 7;
s 值最大的可能取值为28,而我们已知 y>=1900
故而 (y - 2344 + trunc(y / 4) -s ) 这部分可以推知,必定 〉0,因此 mod 7 的结果也必定 >=0
故而,我们可以将 (y -2344 + trunc(c / y) -s )加上7的正整数倍后 mod 7 结果将不变。
由此我们加上 7*334 = 2338 继而变成 (y - 6 + trunc(c / y) - s). 最终就是:
s := (11 * s + 4 - trunc((7 * s + 1) / 19)) mod 29;
x := 25 - s - (y - 6 + trunc(y / 4) - s) mod 7;

这样又可以节省 3 个字节,减少为 1192 字节

再次重申,这种推理变换应该不属于出题者禁止的中间结果吧 ?



这才是精髓所在。

算法的恒等变换。

使用道具 举报

回复
论坛徽章:
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
42#
发表于 2011-4-30 15:49 | 只看该作者
原帖由 nyfor 于 11-4-29 22:10 发表
s := (11 * s + 4 - trunc((7 * s + 1) / 19)) mod 29;
x := 25 - s - (y - 2344 + trunc(y / 4) - s) mod 7;
s 值最大的可能取值为28,而我们已知 y>=1900
故而 (y - 2344 + trunc(y / 4) -s ) 这部分可以推知,必定 〉0,因此 mod 7 的结果也必定 >=0
故而,我们可以将 (y -2344 + trunc(c / y) -s )加上7的正整数倍后 mod 7 结果将不变。
由此我们加上 7*334 = 2338 继而变成 (y - 6 + trunc(c / y) - s). 最终就是:
s := (11 * s + 4 - trunc((7 * s + 1) / 19)) mod 29;
x := 25 - s - (y - 6 + trunc(y / 4) - s) mod 7;

这样又可以节省 3 个字节,减少为 1192 字节

再次重申,这种推理变换应该不属于出题者禁止的中间结果吧 ?


算法是可以变换的,毕竟题目给出的仅仅是一种算法,不是唯一的算法
即便是原算法,对原算法的等价变换,通过编程是很难做到的,人工变换并无不妥

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
43#
发表于 2011-5-2 10:48 | 只看该作者
强。

使用道具 举报

回复
论坛徽章:
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
44#
发表于 2011-5-2 11:09 | 只看该作者
原帖由 rollingpig 于 2011-5-2 10:48 发表
强。

大师可否提供下,你那压缩文件的解压密码。
想学习下!

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
45#
发表于 2011-5-3 10:43 | 只看该作者
我的密码是rpg

使用道具 举报

回复
论坛徽章:
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
46#
发表于 2011-5-3 10:44 | 只看该作者
原帖由 rollingpig 于 2011-5-3 10:43 发表
我的密码是rpg

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
47#
发表于 2011-5-3 10:47 | 只看该作者
showLeapEasterDay是最容易出问题的。
Nyfor似乎在这里垮了,如果4/24是复活节而4/25不是复活节,代码不能输出4/25
根据二楼的代码
把2099替换成2013

  exec easter.showAllEasterDay

YEAR DAY
2011 04-24
2012 04-08
2013 03-31


exec easter.showLeapEasterDay
ABSENT_START ABSENT_END
03-22   03-30   
04-01   04-07   
04-09   04-23

使用道具 举报

回复
论坛徽章:
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
48#
 楼主| 发表于 2011-5-3 14:05 | 只看该作者
原帖由 rollingpig 于 2011-5-3 10:47 发表
showLeapEasterDay是最容易出问题的。
Nyfor似乎在这里垮了,如果4/24是复活节而4/25不是复活节,代码不能输出4/25

〇〇已经发现这个问题了,只需要把里边的 s<x 修改成 s=s 即可. 疏忽了.

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
49#
发表于 2011-5-4 15:12 | 只看该作者
参考你的做法后,把你的精髓和我的做法合作,最后出来 1159 byte。

http://www.itpub.net/thread-1425942-1-1.html

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
50#
发表于 2011-5-4 15:14 | 只看该作者
呵呵
这个简化是标准简化步骤。
mod 内不应该出现比除数还大的常数。
原帖由 nyfor 于 2011-4-29 22:10 发表
s := (11 * s + 4 - trunc((7 * s + 1) / 19)) mod 29;
x := 25 - s - (y - 2344 + trunc(y / 4) - s) mod 7;
s 值最大的可能取值为28,而我们已知 y>=1900
故而 (y - 2344 + trunc(y / 4) -s ) 这部分可以推知,必定 〉0,因此 mod 7 的结果也必定 >=0
故而,我们可以将 (y -2344 + trunc(c / y) -s )加上7的正整数倍后 mod 7 结果将不变。
由此我们加上 7*334 = 2338 继而变成 (y - 6 + trunc(c / y) - s). 最终就是:
s := (11 * s + 4 - trunc((7 * s + 1) / 19)) mod 29;
x := 25 - s - (y - 6 + trunc(y / 4) - s) mod 7;

这样又可以节省 3 个字节,减少为 1192 字节

再次重申,这种推理变换应该不属于出题者禁止的中间结果吧 ?

使用道具 举报

回复

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

本版积分规则 发表回复

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