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提供了四种匹配模式: ...
随机推荐
- 移动web开发
在现代网页开发中,新增了一个移动设备网页开发,在这样的需求下,你需要考虑如何将移动web和pc web同步处理 /* * 浏览器如何识别移动设备 * */ var ua = navigator.use ...
- Git存储用户名和密码(明文需谨慎)
当你配置好git后,在C:\Documents and Settings\Administrator\ 目录下有一个 .gitconfig 的文件,里面会有你先前配好的name 和email,只需在下 ...
- 获取IP地址(简单实现)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket ...
- XML实例入门2
工具:notepad++.VS2008(MSXML6.0) 来自msdn的例子(经过修改,因为升级到MSXML6.0,有些关键字不太一样了), 需要文件books.xml,books.vsd(博客只支 ...
- Linux 网络编程基础(4) -- Ping 的C代码实现
1.背景 在进行网络编程的时候,通常使用的协议有TCP协议,UDP协议.这些协议在简历套接字之初需要制定套接字的类型,比如TCP应当设置为 SOCK_STREAM, UDP对应的套接字应当设置为SOC ...
- java 一致性哈希类实例 算法
package com.hash; import java.util.Collection; import java.util.SortedMap; import java.util.TreeMap; ...
- extend vg(pv,lv)use HotPlug Storage PV for VMI(ECC Env)
Preface: 前期存储未规划好,业务快速扩展,数据高安全需求(异地,More one copy),需求多多?NM干着干着活就会时不时的坑爹起来了!particularly Real Product ...
- svn 问题汇总
1.当删除了原来的仓库时,再次新建,更新版本时会出现这个问题:
- 面向对象程序设计-C++_课时13初始化列表
构造函数设置成员初值方法有两种:一种是在函数体内赋值,另一种是采用初始化列表的形式. 初始化列表BETTER 函数体内赋值 类名::类名(形参1,形参2,...形参n) { 数据成员1=形参1; 数据 ...
- bootstrap-dialog的使用
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...