大早上起来逛微博,看见@西瓜大丸子汤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的更多相关文章

  1. ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由

    原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...

  2. DevExpress ComboBoxEdit 添加值

    今天在使用ComboBoxEdit 这个控件的时候,不知道怎么添加值. 在官网上找到代码.在这里做个记录 ComboBoxEdit combo = new ComboBoxEdit(); ComboB ...

  3. sql server中常用方法函数

    SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...

  4. SQL like 模糊查询

    SQL 模糊查询 在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: ...

  5. ACRush 楼天成回忆录

    楼教主回忆录: 利用假期空闲之时,将这几年 GCJ , ACM , TopCoder 参加的一些重要比赛作个回顾.首先是 GCJ2006 的回忆. Google Code Jam 2006 一波三折: ...

  6. hibernate的like用法(用占位符解决)

    原本我的写法:Query repeatClientQuery=querysession.createQuery("from ClientInfo as a " +"whe ...

  7. R提高篇(四): 数据管理二

    目录: 数学函数 统计函数 应用示例 控制流 数学函数 ceiling(x):  大于等于 x  的最小整数, 如:  ceiling(3.213)  --> 4 floor(x):     小 ...

  8. [SQL]SQL语言入门级教材_SQL数据操作基础(二)

    SQL数据操作基础(初级) netnova 于 -- :: 加贴在 数据库探讨: 为了建立交互站点,你需要使用数据库来存储来自访问者的信息.例如,你要建立一个职业介绍服务的站点,你就需要存储诸如个人简 ...

  9. sql模糊查询

    SQL 模糊查询 在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: ...

随机推荐

  1. QF——iOS沙盒机制

    iOS沙盒机制: 什么是沙盒机制?  点击进入  点击进入 沙盒机制(SandBox)是一种安全体系,它规定了APP的所有文件数据都必须存储在这片区域.所有非代码文件的数据都保存在这片区域. 沙盒里有 ...

  2. SUBSTRING_INDEX ——网上的解释

    SUBSTRING_INDEX(str,delim,count)    Returns the substring from string str before count occurrences o ...

  3. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  4. jquery中validate插件表单验证

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  5. FIDO联盟:我们将杀死密码

    前不久发布的三星S5与iPhone 5S一样,配备了指纹识别技术.但更为重要的是,这一识别器可以与PayPal关连,进而与多种支付系统相连.通过这一过程,你很可能会摆脱密码,用指纹就可以畅游网络.当然 ...

  6. [置顶] ProcessOn:划时代性的在线作图工具

    ProcessOn是一款专业作图人员的社交网络,这里汇聚很多业界专家.学者,同时他们分享的作品又形成一个庞大的知识图库,你在学习专业知识的同时还可以结交一些志同道合的新朋友. ProcessOn核心设 ...

  7. android:configChanges 屏幕横竖屏切换

    出处:http://blog.csdn.net/djy1992/article/details/9378195 --->  android:screenOrientation="por ...

  8. 在 Windows Azure 虚拟机中如何备份和还原 Windows 系统磁盘

    备份和还原对于操作真实的系统来说至关重要.对于 Windows Azure 虚拟机环境中的 Windows Server,可以根据自身的需求选择多种不同的工具或将这些工具结合使用来实现备份.下面将对这 ...

  9. tomcat oracle 连接池配置

    <?xml version='1.0' encoding='utf-8'?> <Context displayName="zcgl" docBase=" ...

  10. #include <map>

    //tuple多元数组,必须是静态数组,类似结构体 //配合array,vector使用 //std::tuple<数组元素类型>数组变量名(数组元素变量名); #include < ...