Category Archives: 程序开发

Javascript Array sort 在不同浏览器中的不同表现

昨晚发现了一个让我无法理解事情, 看下面的代码:

var x = [{id:1, val:1}, {id:1, val:32}, {id:1, val:42}];
x.sort(function(a, b){
  console.log(a.val, b.val, a.id <= b.id)
  if (a.id <= b.id){
    return 1;
  }else if (a.id > b.id){
    return -1;
  }
});
console.log(x.map(function(obj){return obj.val;}).join(','));

在IE已经Edge, 1.9.8版本的phantomjs里给出来的结果是: 1,32,42
而在Firefox, Chrome, Nodejs 下给出的是: 42,32,1
在比较函数里插入了一行代码发现了问题所在:

var x = [{id:1, val:1}, {id:1, val:32}, {id:1, val:42}];
x.sort(function(a, b){
  console.log(a.val, b.val, a.id <= b.id)
  if (a.id <= b.id){
    return 1;
  }else if (a.id > b.id){
    return -1;
  }
});
console.log(x.map(function(obj){return obj.val;}).join(','));

c

明显看出IE里a跟b的顺序与其他浏览器里不一样, IE里面是反的, 导致在这种特殊情况下结果的不一致, 看一下msdn与mdn上对于这个的不同描述:
mdn
m

感觉还是mdn上的更好理解, 而且Chrome跟Firefox参数的传入顺序似乎也更符合我们的心理预期.
如果排序过程中打印数值长度, 微软系列的竟然是0. 这也很特别.

Ubuntu 过期版本更新

Ubuntu 如果某个版本的生命周期已经结束, 更新就没法进行了, 会出现类似下面的错误:

mohd-arafat-hossain@TUD:~$ sudo apt-get update
[sudo] password for mohd-arafat-hossain:
Ign http://bd.archive.ubuntu.com precise InRelease
Ign http://bd.archive.ubuntu.com precise-updates InRelease                     
Ign http://bd.archive.ubuntu.com precise-backports InRelease                   
Ign http://bd.archive.ubuntu.com precise Release.gpg                           
Ign http://bd.archive.ubuntu.com precise-updates Release.gpg                   
Ign http://bd.archive.ubuntu.com precise-backports Release.gpg                 
Ign http://bd.archive.ubuntu.com precise Release                               
Ign http://bd.archive.ubuntu.com precise-updates Release                       
Ign http://bd.archive.ubuntu.com precise-backports Release                     
Ign http://extras.ubuntu.com precise InRelease                                 
Ign http://ppa.launchpad.net precise InRelease                                 
Hit http://extras.ubuntu.com precise Release.gpg                     
Hit http://ppa.launchpad.net precise Release.gpg                     
Hit http://extras.ubuntu.com precise Release                         
Hit http://ppa.launchpad.net precise Release                                   
Hit http://extras.ubuntu.com precise/main Sources                              
Hit http://bd.archive.ubuntu.com precise/main TranslationIndex                 
Hit http://ppa.launchpad.net precise/main Sources                              
Hit http://bd.archive.ubuntu.com precise/multiverse TranslationIndex           
Hit http://bd.archive.ubuntu.com precise/restricted TranslationIndex           
Hit http://extras.ubuntu.com precise/main i386 Packages              
Ign http://extras.ubuntu.com precise/main TranslationIndex                     
Hit http://bd.archive.ubuntu.com precise/universe TranslationIndex             
Hit http://ppa.launchpad.net precise/main i386 Packages                        
Ign http://ppa.launchpad.net precise/main TranslationIndex                     
Ign http://security.ubuntu.com precise-security InRelease                      
Hit http://security.ubuntu.com precise-security Release.gpg                    
Hit http://bd.archive.ubuntu.com precise-updates/main TranslationIndex         
Hit http://security.ubuntu.com precise-security Release                        
Hit http://bd.archive.ubuntu.com precise-updates/multiverse TranslationIndex   
Hit http://bd.archive.ubuntu.com precise-updates/restricted TranslationIndex   
Hit http://bd.archive.ubuntu.com precise-updates/universe TranslationIndex
Hit http://security.ubuntu.com precise-security/main Sources         
Ign http://extras.ubuntu.com precise/main Translation-en_US                    
Ign http://ppa.launchpad.net precise/main Translation-en_US                    
Ign http://extras.ubuntu.com precise/main Translation-en             
Hit http://bd.archive.ubuntu.com precise-backports/main TranslationIndex
Hit http://bd.archive.ubuntu.com precise-backports/multiverse TranslationIndex
Hit http://bd.archive.ubuntu.com precise-backports/restricted TranslationIndex
Ign http://ppa.launchpad.net precise/main Translation-en
Hit http://bd.archive.ubuntu.com precise-backports/universe TranslationIndex   
Hit http://bd.archive.ubuntu.com precise/main Translation-en                   
Hit http://bd.archive.ubuntu.com precise/multiverse Translation-en             
Hit http://bd.archive.ubuntu.com precise/restricted Translation-en
Hit http://bd.archive.ubuntu.com precise/universe Translation-en
Hit http://security.ubuntu.com precise-security/restricted Sources             
Hit http://security.ubuntu.com precise-security/universe Sources               
Hit http://security.ubuntu.com precise-security/multiverse Sources             
Hit http://security.ubuntu.com precise-security/main i386 Packages             
Hit http://security.ubuntu.com precise-security/restricted i386 Packages
Hit http://bd.archive.ubuntu.com precise-updates/main Translation-en           
Hit http://bd.archive.ubuntu.com precise-updates/multiverse Translation-en     
Hit http://security.ubuntu.com precise-security/universe i386 Packages
Hit http://security.ubuntu.com precise-security/multiverse i386 Packages
Hit http://security.ubuntu.com precise-security/main TranslationIndex
Hit http://security.ubuntu.com precise-security/multiverse TranslationIndex    
Hit http://security.ubuntu.com precise-security/restricted TranslationIndex    
Hit http://security.ubuntu.com precise-security/universe TranslationIndex      
Hit http://bd.archive.ubuntu.com precise-updates/restricted Translation-en     
Hit http://bd.archive.ubuntu.com precise-updates/universe Translation-en       
Hit http://security.ubuntu.com precise-security/main Translation-en
Hit http://security.ubuntu.com precise-security/multiverse Translation-en      
Hit http://security.ubuntu.com precise-security/restricted Translation-en      
Hit http://security.ubuntu.com precise-security/universe Translation-en        
Hit http://bd.archive.ubuntu.com precise-backports/main Translation-en         
Hit http://bd.archive.ubuntu.com precise-backports/multiverse Translation-en
Hit http://bd.archive.ubuntu.com precise-backports/restricted Translation-en
Hit http://bd.archive.ubuntu.com precise-backports/universe Translation-en
Err http://bd.archive.ubuntu.com precise/main Sources     
  404  Not Found
Err http://bd.archive.ubuntu.com precise/restricted Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise/universe Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise/multiverse Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise/main i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise/restricted i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise/universe i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise/multiverse i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise-updates/main Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise-updates/restricted Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise-updates/universe Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise-updates/multiverse Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise-updates/main i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise-updates/restricted i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise-updates/universe i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise-updates/multiverse i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise-backports/main Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise-backports/restricted Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise-backports/universe Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise-backports/multiverse Sources
  404  Not Found
Err http://bd.archive.ubuntu.com precise-backports/main i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise-backports/restricted i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise-backports/universe i386 Packages
  404  Not Found
Err http://bd.archive.ubuntu.com precise-backports/multiverse i386 Packages
  404  Not Found
W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise/main/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise/restricted/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise/universe/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise/multiverse/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise/main/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise/restricted/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise/universe/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise/multiverse/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-updates/main/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-updates/restricted/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-updates/universe/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-updates/multiverse/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-updates/main/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-updates/restricted/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-updates/universe/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-updates/multiverse/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-backports/main/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-backports/restricted/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-backports/universe/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-backports/multiverse/source/Sources  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-backports/main/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-backports/restricted/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-backports/universe/binary-i386/Packages  404  Not Found

W: Failed to fetch http://bd.archive.ubuntu.com/ubuntu/dists/precise-backports/multiverse/binary-i386/Packages  404  Not Found

E: Some index files failed to download. They have been ignored, or old ones used instead.

可以用如下的方法解决:

  • 备份先有的配置文件:
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
  • 替换源地址:
    sudo sed -i -e 's/ca.archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

    这里的 ca.archive.ubuntu.com 就是之前在更新时提示错误的 url 里的一部分, 根据实际情况替换.

  • 运行更新命令:
    sudo apt-get update

go语言中string、int、int64互相转换

GO语言里面的函数名称的命名都挺。。。那个。。。让人难以理解。。。以至于很简单的事情却不知道如何下手。。。

转载自: http://www.marswj.com/post/53/Go-language-string-int-Int64-conversion

#string到int
int,err:=strconv.Atoi(string)
#string到int64
int64, err := strconv.ParseInt(string, 10, 64)
#int到string
string:=strconv.Itoa(int)
#int64到string
string:=strconv.FormatInt(int64,10)

比AngularJS 更简单好用的前端框架Aurelia

AugularJS我用得并不多,但是,我的感觉是学习曲线挺陡峭的,需要理解他的那一堆的概念。在试图解决一个问题时引入了太多更复杂的东西,有点让人怀疑这样做是否值得。另外,Angular自己不包含模块加载的功能,需要依赖其他的库,比如requirejs。不过这样一来,angular的代码就更不清晰了,一层套一层,到处都是花括号,哪边要写错了,就头大了。
相比AngularJS,这个由前AngularJS开发团队成员开发的新的前端框架Aurelia就显示出很多优势:
1. 使用Typescript或者ES6/ES7的语法,这样让代码的可读性简洁度都有明显的提高;
2. 通过SystemJS等库提供默认的模块加载支持,比起requirejs等,这种加载模式更简单;
3. 省去了AngularJS的很多概念,很容易上手,一切代码都显得那么得优雅;
4. 对其他JS库的支持非常好, 尤其是很多nodejs下的库也可以拿过来用。

当然也有一些劣势:
1. 社区还没有AngularJS的大;
2. 由于使用了很多html5新的特性,导致对浏览器的兼容性支持较差。

Aurelia官网:http://aurelia.io/

为了性能,请用Canvas而不是IMG

前些日子做了一个网站,是自适应式的网站(也有人叫响应式),带视差效果,大量的使用图片,并且我们做的网站一般考虑屏幕大小达到1920,以保证大屏浏览者依然能够看到清晰的图片。

于是问题就来了,自适应暂不说,只说这视差效果,要求在滚动页面时,页面里面绝大多数的图片能有一个位移或者旋转这样的动画,意味着要想浏览器达到60帧的帧频,程序必须质量够高,浏览器渲染页面的性能也要够高。

几个浏览器下测试做出来的页面,出人意料,一直认为性能最高的Chrome出现了问题,在滚动页面时帧频降到了10FPS以下,反而IE9+的性能相当高,尤其是IE10,非常流畅。问题出在了哪?在经过反复的测试后,终于发现Chrome下性能低的原因。

下面是在Chrome的调试工具里的看到了,很明显在我滚动页面时,IMG标签被多次解码,而这对性能的影响是非常明显的,尤其是页面中存在大量大尺寸图片时。

chrome devtools

 

在我使用了Canvas代替了IMG之后,这种图片重复解码的问题就不存在了,而且性能提升非常明显,基本上能达到最大帧频。不过IE下Canvas似乎难以做自动等比缩放,所以IE下我继续使用IMG,正好IE下图片不存在这样的问题。

 

避免网页中直接使用IMG标签

为什么要在网页中避免网页中直接使用IMG标签?我总结一下有以下几个原因:

1、无法控制图片加载的时间,比如我做一个有大量图片的网站,而网站中的图片可能还有CSS动画什么的,我们需要像以往Flash网站一样的加载进度条,在所有图片加载完后才能正常让网页动起来。如果不是这样,可能动画就达不到预期的效果,像CSS动画有可能就会出现衔接的问题,因为浏览器是在某图片加载完后对它做动画,而并不是在所有图片加载完后做动画,这就会导致动画不同步的问题。

2、无法在某些时候换用其他的显示图片的方式,比如有时我们想用前景的方式显示图片,有时我们想用Canvas的方式显示图片,如果写死用IMG标签,那会导致这样的功能就难以实现了。

3、这个问题跟第一个问题有几分相似,如今很多网站已经采用自适应(响应式)的设计,对于这种设计,会出现某些资源在某些设备上并不想显示,不仅是不想显示,甚至是不能加载,想象一下DESKTOP下的页面用的大图我们万一用手机访问,这张图依然被加载,那轻则网页打开缓慢,重则浏览器崩溃,万一浏览者不是用的WIFI,那。。。他死定了。但是正如第一点所说,没办法直接控制IMG标签,当然有人可能会说了,我用JS来判断,然后用JS来插入这些图片进页面不也可以么,嗯。。。是可以,不过你可以试试看,看这种写法会浪费你多少时间,万一要后期要修改呢?不仅这种方式不直观,而且还会浪费大量的时间。

4、性能问题,某些浏览器(比如Chrome)对于图片处理或许会存在一定的性能问题,在滚动页面或者重新渲染页面时,某些图片会存在即时解码的问题,也就是即便之前已经解码了也渲染了,当页面有改动或者滚动需要重新渲染时,这张图片会被重新解码,之后是RESIZE,之后再显示,如果对页面性能要求高,比如在做动画时,那这是致命的性能问题。

好吧,暂时我也就发现这多问题了,那么解决方法是什么?这是我现在常用的方法:

1、使用DIV来代替图片,比如我们可以这样写:<div class=”picture” data-src=”a.jpg”></div>。这里我们使用一个固定的Class名称来代表这是一张图片,之后使用HTML的DATASET,设置一个自定义的属性data-src来指明图片的路径。

2、使用JS来获取页面中的带picture标签的DIV,之后加载相应的图片,然后可以在这些图片都加载完后插入到相应的DIV中,之后显示页面。这样可以灵活解决图片加载的问题。

3、对于上面据说的可能像Chrome这样的浏览器存在的性能问题,我们可以使用Canvas来代替IMG标签,这样性能问题也解决了。

[转]Windows Plesk I cannot connect to the MySQL database as root/admin

Windows Plesk I cannot connect to the MySQL database as root/admin
Solution Regretfully, MySQL is pre-installed by Plesk without the old-passwords functionality set true.

But the Plesk installer populates the admin user with a password encrypted in the old style!

To fix this you will need to enter your server with Remote Desktop and edit the follwoing file:

C:\SWSoft\Plesk\Databases\MySQL\Data\my.ini

There is a section in that file [mysqld]

Under the line starting “[mysqld]” add the following line:

old_passwords=1

so it looks like this:

[mysqld]
old_passwords=1

Now restart the MySQL service in the services manager.

You should now be able to manage MySQL with the user “admin” and the password is the same as your Plesk login. In some cases the password may still be set to the original password which is “setup”.

If you still cannot log into the MySQL server then you will need to start the MySQL server with skip-grant-tables enabled.

Stop the MySQL service in the services manager.

Edit the my.ini file:

C:\SWSoft\Plesk\Databases\MySQL\Data\my.ini

Add “skip-grant-tables” to the [mysqld] section like so:

[mysqld]
old_passwords=1
skip-grant-tables

Now restart the MySQL service.

Now log into MySQL with the following command:

C:\SWSoft\Plesk\Databases\MySQL\bin\mysql “mysql”

At the MySQL prompt set the admin password:

mysql> select mysql
mysql> update user set password=password(‘new_password’) where user=’admin’;

Where “new_password” is the password of the PLESK admin login.

type “exit” at the MySQL prompt and then edit the my.ini file again and remove the line: skip-grant-tables

Now restart the MySQL service.

Your MySQL admin password has now been re-set.

Ubuntu 下修改 Mysql 默认数据库路径

首先自然要安装好Mysql数据库啦,打开 Terminal 输入下面命令:
sudo apt-get install mysql-server mysql-client

停止当前的 mysql 服务:
sudo stop mysql

将默认的数据目录(/var/lib/mysql) 移至你想要存放的目录路径下,比如我的是 /home/chris/Databases/mysql
mv /var/lib/mysql /home/chris/Databases/mysql

在新目录与旧目录位置建立链接:
sudo ln -s ~/Databases/mysql /var/lib/mysql

不要修改/etc/mysql/my.cnf,之前看某些文章介绍修改这个里的 datadir,但是我试的结果是修改后不能正常启动,看log日志里写着无权限访问这个新的数据目录。

修改apparmor下的关于mysql的安全配置文件:
sudo gksu gedit /etc/apparmor.d/usr.sbin.mysqld

将里面与之前的 /var/lib/mysql 相关的条目复制一份,把路径全部改成新设置的路径,原来的保留,比如我的配置:
/home/chris/Databases/mysql/ r,
/home/chris/Databases/mysql/** rwk,

重启 apparmor:
sudo /etc/init.d/apparmor restart

重启 mysql:
sudo start mysql

现在应该一切正常了。

[转]难死人不偿命!苹果8大笔试题及答案

苹果公司在招聘员工时,会向求职者问一些“可汗学院”(Khan Academy)提出的考验智商的谜题。

你可能没听说过“可汗学院”,但“可汗学院”的谜题被苹果采用一定是有其道理的。可汗学院由孟加拉裔美国人萨尔曼·可汗(Salman Kahan)创立,是一家由谷歌和比尔&梅琳达·盖茨基金会背后支持的教育性非营利组织,主旨在于利用网络影片进行免费授课,目前已经有关于数学、历史、金融、物理、化学、生物、天文学等科目的内容。

苹果在面试过程中随时都有可能向求职者抛出这些考验智商与逻辑的问题,因此如果你向往进入苹果工作,这些艰涩的问题在面试前必须谨慎对待仔细研究,因为苹果的原则是——不能出错,哪怕你已经级别很高,是冲着苹果的高级软件工程师职位而来也不例外。

幸运的是,这些问题虽然刁钻,但却都有唯一的答案,所以你只要有备而来,还是可以应对自如的,下面是 8 个苹果面试过程中求职者可能遇到的问题,以及已经被各路聪明的求职者破解的答案。

问题一:

“你面前有两扇门,其中一扇门内藏着宝藏,但如果你不小心闯入另一扇门,只能痛苦地慢慢死掉……”

这一听就是那种经典的最令人头痛的一类问题,但其实与其他问题相比,这只是个热身。在这两扇门后面,有两个人,这两个人都知道哪扇门后有宝藏,哪扇门擅闯者死,而这两个人呢,一个人只说真话,一个人只说假话。

谁说真话谁说假话?那就要看你有没有智慧自己找出来了,游戏规则是,你只能问这两个人每人一个问题。

那么,你问什么问题?问哪个人?根据他们的回答,你又该怎么做?

求职者的最佳答案:

随便问其中一个人:“如果我问另一个人,他会跟我说哪扇门后是宝藏?

如果你问的恰好是讲真话的那个人,那他指给你的答案就是那扇通向死亡的门,因为他会诚实地告诉你那个说谎的人会怎么说。

如果你问的是那个只说谎话的,你得到的也是错误的答案,因为另一个人是讲真话的,说谎话的人会告诉你与讲真话的人相反的答案。

所以你只要随便问一个人上述问题,然后选择与他们说的相反的门就行了。

问题二:

“你前面站了 5 个人,他们中间只有一个人讲真话……”

这个问题比上个问题难就难在,你只知道他们五个中有一个只讲真话,但其余四个,他们有时候讲真话,有时候讲假话,只有一点可以确定,这四个人将真话和假话有个规律:如果这次讲了真话,下次就会讲假话,如果这次讲假话,下次就讲真话。你的任务是,把五个人中那个只讲真话的人找出来。

你可以问两个问题,两个问题可以向同一个人发问,也可以分别问两个人。

你该问什么问题?

小提示:你可以这样安排两个问题承担的任务:首先你可以先问一个问题,不管得到的答案是什么,你都能从中知道下一个问题你将得到的答案是真是假。

求职者的最佳答案:

随便找一个人,首先问:“你是那个只讲真话的吗?”如果答案是肯定的,你再问这个人:“谁是只讲真话的?”;如果第一个问题你得到的答案是否定的,你就再问对方“谁不是只讲真话的?”

正如这个问题给出的提示,第一个问题的价值在于,如果你得到的答案是“我是”,那么你问的人要么是那个只讲真话的,要么是那个这一轮讲假话的“半真话半假话”者,不管是谁,他下一轮一定会说真话。所以你可以继续问这个人:“谁是只讲真话的?”对方的答案就是正确答案。

如果对第一个问题你得到的答案是“我不是”,那么回答者不可能是只讲真话的那个人,只能是一个此轮讲真话的“半真话半假话”者。此人下一轮将会说假话,所以你应该问他:“谁不是只讲真话的?”同样他告诉你的,只能是那个只讲真话的。

问题三:

“外星人打算将地球用来种蘑菇,并且已经抓了十个人类……”

外星人用这十个人代表地球 60 亿人口,将通过外星人的方式来测试这十个人,决定地球是不是有资格加入跨星际委员会,如果没有,就把地球变成一个蘑菇农场。

明天,这十个人将被关在一间漆黑的屋子里前后排成一队,外星人将给每个人戴一顶帽子,帽子为紫色或者绿色,然后外星人会将灯打开,这十个人每个人都无法看见自己头上的帽子是什么颜色,但可以看见排在你前面的每个人头上帽子的颜色。

帽子的颜色是随机的,可能全是紫的,也可能全是绿的,或者是任意的组合。

外星人会从后往前问每一个人:“你头上的帽子是什么颜色?”如果这个人答对了,这个人就安然无事,他所代表的地球上 6 亿人口也将获救。否则,这个人将被爆头,外星人将把他所代表的 6 亿人口变成蘑菇的肥料。每个人的答案屋子里所有人都可以听到。

现在,人类的命运在你手上,你可以设计一个方案,使这十个人提前制定一个计划,这个计划必须拯救尽可能多的人。

提示:有个方案可以让你拯救其中至少九个人。

求职者的最佳答案:

第十个人计算排在前面的所有人的绿帽子是奇数还是偶数并向前面的人发出一个信号,这样排在前面人就可以再通过排在更前面的所有人的绿帽子的奇偶数是否变化来判断自己帽子的颜色,因为如果绿帽子奇偶发生变化,那自己就是那个导致变化的“绿帽子”,如果没变化,自己就是“紫帽子”。

因为所有的人除了回答外星人的问题不能说话,所以第十个人的“信号”只能包含在自己的答案里,比如如果排在前面的九个人有奇数顶绿帽子,这个人类就告诉外星人自己的帽子是“绿色”,如果是偶数,就猜自己的帽子是“紫色”。这样等于给他前面的人一个暗号,排在他前面的这个人,可以通过计算自己前面的所有人的绿帽子的奇偶变化来判断自己的帽子是绿还是紫。

排在最后的那个人为了大众利益没有选择,根据前面的人的帽子情况告诉外星人自己是“绿帽子”还是“紫帽子”,他的答案有1/2的几率正确,但他前面的人一定都能答对。

还没懂?比如第十个人看到前面有奇数个绿帽子,他就告诉外星人自己的是绿色,这是他前面的人就知道他的意思是前面九个人中有奇数个绿帽子,这是第九个人再数前面八个人的,如果前面八个人中也有奇数个,那自己就是紫色帽子。第九个人告诉外星人自己是紫色帽子,第八个人就知道绿帽子没有减少还是奇数个,再数数前面七个人绿帽子数的奇偶,就可以判断自己帽子的颜色;反之,如果第九个人告诉外星人自己是绿色帽子,那第八个人就应该知道绿色帽子减少了一个由奇数变成了偶数,再看看前面所有的绿帽子情况作出判断。这样一个接一个,只要每个人都认真听后面的人的答案并在心里计算所剩绿帽子的奇偶变化,前面九个人都能获救。

当然,你也可以计算紫色帽子的奇偶。

问题四:

“100个完美的逻辑学家坐在一个房间里……”

这是一个电视真人秀节目,节目里 100 个拥有完美无瑕逻辑思维能力的人围成一圈坐在一个房间里。在进入房间前,这 100 个人被告知,100个人中至少有一个人的额头是蓝色的。你可以看见别人额头的颜色,但无法看到自己的,你需要对自己额头是不是蓝色进行猜测,在房间的灯被关掉时,如果你推测出你的额头是蓝色的,你需要站起来离开房间。

然后房间的灯被再次打开,那些认为自己额头是蓝色的人已经不在屋内。接下来灯会再次被关掉,剩下的人中推测自己额头是蓝色的离开房间,如此重复。

问题来了,假设这 100 个人的额头都是蓝色的,将会发生什么情况?注意,这 100 个人都有完美无瑕的逻辑推理能力,他们会根据其他人的额头颜色对自己进行合理的推理和猜测。

提示:想想看,如果 100 个人不全是蓝色额头,又会发生什么情况?

求职者的最佳答案:

将会出现的情况是:灯关了又开,开了又关,重复到第一百次时,所有人都同时离开。

这是为什么呢?想想看,每个人都看见其他 99 个人额头是蓝色的,灯关掉后再打开,发现这 99 个蓝色额头的同伴都没有离开,然后灯再次关掉后打开,如此重复 100 遍后,所有人同时离开了房间。

这么理解吧,假设只有一个人的额头是蓝色的,由于这 100 个人事先被告知至少有一个人额头是蓝色,所以这个人如果看到其他 99 个人额头都不是蓝色,立马就知道自己是蓝色,所以灯一关掉,这个人就会离开房间。

如果有两个人额头是蓝色呢?

其中一个蓝色额头的人会想:我的额头可能是蓝色也可能不是蓝色,现在其他 99 个人中有一个蓝色额头的人,如果我不是蓝色,那么就只有这一个人是,那么他看到我们都不是蓝色额头就能推断出他是,那么灯一关他就会离开,我先等一下,灯再打开如果他已经走了,那就证明我的额头不是蓝色的。

反之,如果我的额头是蓝色的,那个蓝色额头的人的想法会和我刚才的想法一样先等一等,第一次关灯他不会离开,这样如果灯开了那个蓝色额头的人还在,就证明我的额头也是蓝色的。这样第二次关灯我们俩会一起离开。

以此类推,如果有三个人额头是蓝色,你看到另外两个人额头是蓝色,应该推算出如果自己的额头不是蓝色的话,那么灯第二次关的时候他们俩会同时离开,如果他们俩没有同时离开,那就证明我的额头是蓝色的,我应该在第三次关灯的时候离开。结果是,三个蓝色额头的人在第三次关灯的时候同时离开。

把上述逻辑重复一百遍,你就得到了最上面的正确答案。

问题五:

“你有一个横 6 竖 6 的方格……”

你现在在左上第一个格子里,你的任务是移动到最右下脚的格子里,你每次只能向右或者向下移动,不能斜向移动,也不能后退。

你能找出几种方法移动到最右下脚的格子?

求职者的最佳答案:

252种。

从对称的角度思考这个问题。

随便挑选一个格子,假设你从出发点有n种方法从到达与所选格子上边相邻的格子,m种方法到达与它左边相邻的格子。

想想看,从出发点到达一个格子的方法与到达它左边和上边的格子的方法有什么关系?说对了,由于你只能向右和向下移动,到达一个格子,不是从它左边来,就是从它上边来。所以你从出发点到达一个格子的方法等于到达它上边格子的方法好到达它左边格子的方法的和相同,也就是n+m。

这样,参照上图,你就可以算出从出发点到达每一个格子的方法了。

问题六:

“逻辑学家们围成一圈坐着,他们的额头上面画有数字……”

又来一个逻辑学家围成一圈的问题,这次是这样的,三个拥有完美逻辑推理能力的人围成一圈坐在一个房间里,每个人的额头上都画着一个大于 0 的数字,三个人的数字各不相同,每个人都看得见其他两个人的数字,看不见自己的。

这三个数字的情况是,其中一个数字是其他两个数字的和,已知的情况还有,其中一个逻辑学家的数字是 20,一个是 30。

游戏组织者从这三个逻辑学家后面走过,并问三个人各自额头上的数字是什么。但第一轮每个逻辑学家都回答他们无法推测自己的数字是什么。游戏组织者只好进行第二轮的发问,这是为什么?你能据此猜出三个逻辑学家的数字吗?

求职者的最佳答案:

结果由第三个逻辑学家的答案而定。他们三个的数字分别是 20,30和 50。

假设第二个和第三个逻辑学家额头上的数字是 20 和 30,这时候如果第一个逻辑学家的数字是 10,那么第二个逻辑学家看到其他两个人一个是 10,一个是 30,会想:“我要么是 20,要么是 40。”

第三个逻辑学家看到其他两个人一个是 10,一个是 20,会想:“我要么是 30,要么是 10,但我不会是 10,因为每个数字都不一样,所以我应该是 30。”

这样第三个逻辑学家就会猜出自己的数字是 30 了,但他没有,第一轮谁也没有准确推测出自己的数字,这说明我们的前提不正确,第一个逻辑学家的数字不是 10,那么他只能是 50。

问题七:

“你面前有一百个灯泡,排成一排……”

一百个灯泡排成一排,第一轮你把他们全都打开亮着,然后第二轮,你每隔一个灯泡关掉一个,这样所有排在偶数的灯泡都被关掉了。

然后第三轮,你每隔两个灯泡,将开着的灯泡关掉,关掉的灯泡打开(也就是说将所有排在 3 的倍数的灯泡的开关状态改变)。

以此类推,你将所有排在 4 的倍数的灯泡的开关状态改变,然后将排在 5 的倍数的灯泡开关状态改变……

第 100 轮的时候,还有几盏灯泡亮着?

提示:如果你是第n轮(n大于 1 小于 100),排在n的倍数位置的灯泡的开关状态就发生转变。

反过来,比如第 8 个灯泡,当你在 8 的因子轮(即第1,2,4和 8 轮)的时候,它就会改变开关状态。所以对于第m个灯泡,如果m有奇数个因子,你的开关状态就发生奇数次变化。

求职者的最佳答案:

10盏灯泡亮着,这 10 盏灯泡排位数都是平方数。

根据提示已经可以看出,这个问题的实质就是找出有多少个灯泡的排位数拥有奇数个因子。每拥有一个因子,到这个因子数的那一轮时,这个灯泡就会被转换开关状态。

比如第 1 轮,因为所有 100 个数字都有因数1,所以全部被打开;第 2 轮,只有那些拥有 2 这个因子、能被 2 整除的数字的灯泡转换状态被关掉;第 3 轮,只有那些拥有 3 这个因子、能被 3 整除的数字的灯泡被转换状态。以此类推,如果灯泡排位数拥有奇数个因子,意味着它被打开和关上奇数次,那它就最终还是被打开的状态,如果灯泡排位数拥有偶数个因子,那它最终就是被关上的状态。

比如第 1 个灯泡有奇数个因子,第 2 个有偶数个(1,2),第 3 个有偶数个(1,3)第 4 个有奇数个(1,2,4),所以第 4 个灯泡最后还是亮着的。

最终计算得出,所有排位数为平方数的灯泡最终还是亮着的,因为这些数都拥有奇数个因子,1,4,9,16……

在 100 以内,共有 10 个平方数,分别是1,4,9,16,25,36,49,64,81,100。这 10 个排位数的灯泡,最终都还是亮着。

问题八:

“你有一个立方体,立方体的边长是3……”

这个问题比前面那个从左上格子走到右下格子的问题难,因为那毕竟是个平面问题。如图所示,这次的任务是从立方体的背面左上的小立方体走到完全相对的正面右下小立方体。

你可以往上移,也可以往下移,还可以往前移。You can move toward the front, you can move down, or you can move upward。

问题还是,你共有几种走法?

求职者的最佳答案:

90种,思路是将这个立方体分成“三层”。

上面平面图的那道题的思路就是个最好的提示。你可以将这个立方体分成“三层”,粉红色代表最上面那层,紫色代表中间那层,橘红色代表下面那层。

现在,我们把问题变成了:从左边、右边和上边到达目标小立方体的走法共有多少(如图所示,即到达紫色中间层最右下脚方块以及橘红色最右下脚左边以及上边相邻方块的方法)?假设从起点小立方体到达终点小立方体左边相邻小立方体共有m种方法,到达右边相邻小立方体共有n种方法,到达上边相邻小立方体有r种方法,那我们需要求出来的,就是n+m+r。

按照前面那道平面题的思路和方法,你就可以一点一点计算出来我们的正确答案。