简单的问题复杂着解决

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

成都创新互联公司专业为企业提供播州网站建设、播州做网站、播州网站设计、播州网站制作等企业网站建设、网页设计与制作、播州企业网站模板建站服务,十多年播州做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

 
 
 
  1. 如果是学龄前儿童,5-10分钟能解决这个问题,普通程序员要1个小时,受过更高教育的人 … :)
  2. 8809=6
  3. 7111=0
  4. 2172=0
  5. 6666=4
  6. 1111=0
  7. 3213=0
  8. 7662=2
  9. 9313=1
  10. 0000=4
  11. 2222=0
  12. 3333=0
  13. 5555=0
  14. 8193=3
  15. 8096=5
  16. 7777=0
  17. 9999=4
  18. 7756=1
  19. 6855=3
  20. 9881=5
  21. 5531=0
  22. 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. series <- read.csv(temporaryFile)
  6. ## munge the data to create a frequency table
  7. freqTable <- as.data.frame( t(apply(series[,1:4], 1, function(X) table(c(X, 0:9))-1)) )
  8. names(freqTable) <- c("zero","one","two","three","four","five","six","seven","eight","nine")
  9. freqTable$dep <- series[,5]
  10. ## now a simple OLS regression with no intercept
  11. myModel <- lm(dep ~ 0 + zero + one + two + three + four + five + six + seven + eight + nine, data=freqTable)
  12. 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.   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/

分享题目:简单的问题复杂着解决
网站地址:http://www.gawzjz.com/qtweb/news43/181643.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联