简单的问题复杂着解决

开发 开发工具
这段时间互联网上火热的流传着一个智力测试题。题目出现的形式有多种,但大多看起来是下文的样子。但是解决方法确让你出乎意料。

这段时间互联网上火热的流传着一个智力测试题。题目出现的形式有多种,但大多看起来是这个样子:

  1. 如果是学龄前儿童,5-10分钟能解决这个问题,普通程序员要1个小时,受过更高教育的人 … :)  
  2.  
  3. 8809=6 
  4.  
  5. 7111=0 
  6.  
  7. 2172=0 
  8.  
  9. 6666=4 
  10.  
  11. 1111=0 
  12.  
  13. 3213=0 
  14.  
  15. 7662=2  
  16.  
  17. 9313=1  
  18.  
  19. 0000=4 
  20.  
  21. 2222=0 
  22.  
  23. 3333=0 
  24.  
  25. 5555=0 
  26.  
  27. 8193=3  
  28.  
  29. 8096=5 
  30.  
  31. 7777=0 
  32.  
  33. 9999=4 
  34.  
  35. 7756=1 
  36.  
  37. 6855=3 
  38.  
  39. 9881=5 
  40.  
  41. 5531=0 
  42.  
  43. 2581=? 

谜底揭示 …

.

.

.

.

.

.

.

.

.

.

答案跟每个数字里有多少个圈圈有关。在形状上,8有2个圈,所以记两次。0是一个大圈,记1次。所以2581=2。很有趣,不是吗?这是一种通过隐含的计算方式得出的另一种数值对应关系。

而困扰着我的却是如何能以一种不基于数字形状的方法来找到这种数值对应关系。我如何能编程让计算机来解决这个问题?我认真思考了一下,因为我喜欢自认为是一个计量经济学家,这道题看起来颇像一个可以通过一个OLS(ordinary least squares)表达式来解决的联立方程式。那么,如何能讲将这个问题和涉及到的数据转化成一个小小的OLS表达式呢?我需要将每行的数字队列转换成一个描述数字出现频率的表格。这样,对于8809=6来说,我需要重构出来的数据应该类似于这样:

1,0,0,0,0,0,0,0,2,1 = 6

在这种形式的公式中,10个数字分别代表着数字0-9在每串数据中出现的次数。我不知道如何得出这张频次表,于是,按照我的习惯,我把这个问题做了一个简洁的描述,张贴在StackOverflow.com上,如我愿的得到了一个极好的方案。一旦我建好了频次表,问题就变成了一个简单的关于10个独立变量的线性表达式。

我的整个运算脚本——如果你十分感兴趣的话——就是下面这些,你可以把它粘贴到R语言解释器里运行。

  1. ## read in the training data  
  2. ## more lines than it should be because of the https requirement in Github  
  3. temporaryFile <- tempfile()  
  4. download.file("https://raw.github.com/gist/2061284/44a4dc9b304249e7ab3add86bc245b6be64d2cdd/problem.csv",destfile=temporaryFile, method="curl")  
  5.  
  6. series <- read.csv(temporaryFile)  
  7.  
  8. ## munge the data to create a frequency table  
  9. freqTable <- as.data.frame( t(apply(series[,1:4], 1, function(X) table(c(X, 0:9))-1)) )  
  10.  
  11. names(freqTable) <- c("zero","one","two","three","four","five","six","seven","eight","nine")  
  12.  
  13. freqTable$dep <- series[,5]  
  14.  
  15. ## now a simple OLS regression with no intercept  
  16. myModel <- lm(dep ~ 0 + zero + one + two + three + four + five + six + seven + eight + nine, data=freqTable)  
  17.  
  18. round(myModel$coefficients) 

Created by Pretty R at inside-R.org

最终的输出结果如下:

  1. > round(myModel$coefficients)  
  2. zero   one   two three  four  five   six seven eight  nine  
  3.  
  4.   1     0     0     0    NA     0     1     0     2     1 

你可以看到,0,6和9对应的值是1,而8对应的值是2。其它数字对应的都是0。而4得出的是NA,这是因为数字序列中没有出现4。

哈哈。我也跟学龄前儿童一样聪明了。而且我还用程序做了验证。

英文原文:Solving easy problems the hard way

原文来自:http://www.aqee.net/solving-easy-problems-the-hard-way/

【编辑推荐】

  1. 致Play Framework开发者们的一封信
  2. 为什么我不再做.NET开发
  3. 8个最棒的.NET开发相关工具
  4. 当.NET爱上Java的时候
  5. 给用户和开发者***的.Net框架部署方案
责任编辑:林师授 来源: 外刊IT评论
相关推荐

2009-03-18 10:01:15

OracleIASNoClassDefF

2022-12-12 09:46:49

Kubernetes容器

2015-04-16 15:06:34

2024-06-11 07:54:53

2023-06-28 06:33:37

2024-11-04 13:17:12

2020-11-11 07:09:05

隔离直播系统

2011-10-13 10:59:44

ADSL猫远程控制网络维护

2009-09-15 17:45:34

Linq多条件

2014-04-18 09:30:49

基于网络的APMAPM应用管理

2010-04-28 18:01:15

Unix系统

2022-09-05 17:26:27

技术

2022-04-18 09:00:00

数据库向量机器学习

2010-05-06 17:24:05

Unix命令

2023-01-04 10:24:42

2022-12-27 08:43:18

系统思维设计思维创新

2024-09-23 10:00:00

代码Python

2009-12-10 16:56:39

Ruby on RaiDHH

2010-12-08 11:33:21

面试

2020-11-04 17:38:34

程序员技术编程
点赞
收藏

51CTO技术栈公众号