When Is Cheryl's Birthday
大早上起来逛微博,看见@西瓜大丸子汤Po的一个逻辑题,遂点开看之...
原文链接:http://nbviewer.ipython.org/url/norvig.com/ipython/Cheryl.ipynb
然后发现这不是TM的猜卡牌的那个题么,某次面试的时候还跪了来着。。接着就魔性大发,试着用JAVA来学习一下
package cn.edu.bipt.hcol; import java.util.ArrayList;
import java.util.List; /**
* This logic puzzle has been making the rounds:
*
* Albert and Bernard just became friends with Cheryl, and they want to know
* when her birtxhday is. Cheryl gave them a list of 10 possible dates:
*
* May 15 May 16 May 19 June 17 June 18 July 14 July 16 August 14 August 15
* August 17 Cheryl then tells Albert and Bernard separately the month and the
* day of the birthday respectively.
*
* Albert: I don't know when Cheryl's birthday is, but I know that Bernard does
* not know too.
*
* Bernard: At first I don't know when Cheryl's birthday is, but I know now.
*
* Albert: Then I also know when Cheryl's birthday is.
*
* So when is Cheryl's birthday?
*
* @author Colin
*
*/
public class WhenIsCherylsBirthday { public static final String DATES[] = { "May 15", "May 16", "May 19",
"June 17", "June 18", "July 14", "July 16", "August 14",
"August 15", "August 17" }; /**
* Albert : I don't know when Cheryl's birthday is, but I know that Bernard
* does not know too.
*
* That means: Albert : After Cheryl told me the month of her birthdate, I
* didn't know her birthday, I don't know which day Cheryl told Bernard, but
* I know that for all of the possible dates, if Bernard is told that day ,
* he wouldn't know the birthdate.
*
*/
private boolean statement3(String date) {
// When Cheryl told the month to Albert
// Albert : I know if Bernard doesn't knows Cheryl birthday when Cheryl
// told him the day
// that means the day is not unique in DATES
// that means I know the month and I know the days but Bernard doesn't
// konws
boolean temper = true; List<String> possible_dates = tell(getMonth(date)); for (int i = 0; i < possible_dates.size(); i++) {
if (know(tell(getDay(possible_dates.get(i))))) {
temper = false;
break;
}
} return !know(possible_dates) && temper;
} /**
* Bernard: At first I don't know when Cheryl's birthday is, but I know now.
*
* Bernard: At first time Cheryl told me the day,and i didn't know. Then I
* considered just the dates for which Albert's statement3 is true,and now I
* know.
*
* @param date
* @return
*/
private boolean statement4(String date) {
List<String> atFirst = tell(getDay(date)); List<String> filterItem = new ArrayList<String>();
for (String item : atFirst) {
if (statement3(item) == true)
filterItem.add(item);
} return !know(atFirst) && know(filterItem);
} /**
* Albert: Then I also know when Cheryl's birthday is.
*
* @param date
* @return
*/
private boolean statement5(String date) {
List<String> mList = tell(getMonth(date)); List<String> filterItem = new ArrayList<String>();
for (String item : mList) {
if (true == statement4(item))
filterItem.add(item);
} return know(filterItem);
} /**
* filter(statement4 , filter(statement3 , DATES)) filter(statement4 ,
* tell(getMonth(date)))
*
* @param date
* @return
*/
private boolean statement3to5(String date) {
return statement3(date) && statement4(date) && statement5(date);
} private String getCherylsBirthday(String dates[]) {
String birthday = "";
for (String date : dates) {
if (true == statement3to5(date))
birthday = date;
}
return birthday;
} /**
* Cheryl tells a part of birthday to someone; Return a new list of possible
* dates that match the part.
*
* @param part
* @param return
*/
private List<String> tell(String part) {
List<String> mList = new ArrayList<String>();
char c = part.charAt(0); // 匹配“月”
if (c >= 'A' && c <= 'Z') {
for (String date : DATES) {
if (part.equals(getMonth(date))) {
mList.add(date);
}
}
} else {// 匹配“日”
for (String date : DATES) {
if (part.equals(getDay(date))) {
mList.add(date);
}
}
}
return mList;
} /**
* A person knows the birthday if they have exactly one possible date
*
* @return
*/
private boolean know(List<String> mList) {
return mList.size() == 1;
} /**
* 获取data中的“月”的数据
*
* @param data
* getMonth("May 15")
* @return May
*/
private String getMonth(String date) {
return date.split(" ")[0];
} /**
* 获取data中的“日”的数据
*
* @param data
* getMonth("May 15")
* @return 15
*/
private String getDay(String date) {
return date.split(" ")[1];
} public static void main(String[] args) {
WhenIsCherylsBirthday whenIsCherylsBirthday = new WhenIsCherylsBirthday(); System.out.println(whenIsCherylsBirthday.getCherylsBirthday(DATES));
}
}
顺着原文中的思路和Python代码修改的...话说Python还真是叼炸天啊...all()和filter()这俩函数简直叼...膜拜之...
疑惑:还是不太明白statement3的用处。。
When Is Cheryl's Birthday的更多相关文章
- ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...
- DevExpress ComboBoxEdit 添加值
今天在使用ComboBoxEdit 这个控件的时候,不知道怎么添加值. 在官网上找到代码.在这里做个记录 ComboBoxEdit combo = new ComboBoxEdit(); ComboB ...
- sql server中常用方法函数
SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...
- SQL like 模糊查询
SQL 模糊查询 在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: ...
- ACRush 楼天成回忆录
楼教主回忆录: 利用假期空闲之时,将这几年 GCJ , ACM , TopCoder 参加的一些重要比赛作个回顾.首先是 GCJ2006 的回忆. Google Code Jam 2006 一波三折: ...
- hibernate的like用法(用占位符解决)
原本我的写法:Query repeatClientQuery=querysession.createQuery("from ClientInfo as a " +"whe ...
- R提高篇(四): 数据管理二
目录: 数学函数 统计函数 应用示例 控制流 数学函数 ceiling(x): 大于等于 x 的最小整数, 如: ceiling(3.213) --> 4 floor(x): 小 ...
- [SQL]SQL语言入门级教材_SQL数据操作基础(二)
SQL数据操作基础(初级) netnova 于 -- :: 加贴在 数据库探讨: 为了建立交互站点,你需要使用数据库来存储来自访问者的信息.例如,你要建立一个职业介绍服务的站点,你就需要存储诸如个人简 ...
- sql模糊查询
SQL 模糊查询 在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: ...
随机推荐
- JavaWeb核心编程之使用Eclipse开发JavaWEB项目
文章目录 1.eclipse切换到javaee项目 2.创建服务器(如果没有server选项, 怎么做) 3.定制新建面板内容 4.创建动态web工程 1.eclipse切换到javaee项目 如图 ...
- css background-position (图片裁取)
语法:background-position : length || length background-position : position || position 取值:length : 百分 ...
- ajax完成list无刷新返回
ajax完成list无刷新返回 ajax无刷新技术总结,以下是一段我写的ajax应用的js脚本.其中提交的data刚开始我采用的是$('#formId').serialize();但是出现乱码问题,为 ...
- 异步流程控制库GoWithTheFlow
异步流程控制库GoWithTheFlow 一个尾触发方式来控制异步流程的库, 有seq(顺序执行) par(同步执行) 两种方法 博客 http://notes.jetienne.com/2011/0 ...
- python进阶--打包为exe文件
一.Python打包为EXE文件有不少方案,比较常用的有下面两种方式: 1.使用py2exe 详细介绍:http://www.cnblogs.com/jans2002/archive/2006/09/ ...
- Oracle EBS-SQL (SYS-23):用户权限查询.sql
select b.user_name, b.description, b.creation_date, d.responsibility_name from fnd_user b, fnd_use ...
- 转: Apache开启gzip
Apache开启gzip gzip是什么 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度. 这一般是指WWW服务器 ...
- rsyslog start with
startswith Checks if the value is found exactly at the beginning of the property value. For example, ...
- Exec sql/c
Exec sql/c 利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足. 嵌入SQL的高级语言称为主语言或宿主语言. 在混合编程中,SQL语句负责操作数据库,高级语言语句负责控制程序流程 ...
- C#生成PDF
参考书籍 http://wenku.baidu.com/link?url=N2jjf_JNIuKUxkODxePvNTlZNyFQ6qsx_TPKenDqhL9ShKojw95gs38fHihXg2e ...