百科问答小站 logo
百科问答小站 font logo



哪段代码最能代表程序员的暴力美学? 第1页

     

user avatar   Hentioe 网友的相关建议: 
      

:(){ :|:& };:


user avatar   zhu-wang-xiao-miao-o 网友的相关建议: 
      

最近在和知乎上认识的几位小伙伴( @lokinko@雪峰的自由之路 ......)一起讨论leetcode,在此期间,我遇到了下面这样一个题目:

这类题目,可以是暴力递归。但是乍一看的话,肯定优先考虑用动态规划来做了。

不过,Discussion 里给出了一个答案是这样的:

       class Solution:     def stoneGame(self, piles: List[int]) -> bool:         return True     

测试了一下发现确实没毛病:

如果这是凑巧的话,那我没话说。如果说是回答者做出了数学优化而自信满满地给出return True这行代码的话,那可以说是对题目的降维打击了。

相比于传统的DP动态规划解的另一种方法——博弈先手优势的数学归纳解法。

于我而言这也算是一种暴力美学吧,程序员的头脑风暴(逃 ε=ε=ε=┏(゜ロ゜;)┛


user avatar   zhao-ke-56-94 网友的相关建议: 
      

我大学室友,用安卓做一个成语接龙的手机游戏,是毕业设计。

直到有一天,我看到他的源码:if(answer ==‘为所欲为'){}else if(answer =='为虎作伥') *n

这样的代码,他写了接近1000多行。。

最后还过了。。


//更新:

大家都纠结java用==的事,本人现在在用js写前端,只是看了这个问题想起大学的一些趣事,才写的这个答案,所以也没有多想,至于这些细节我也不会记得这么清楚,大家意会到就好了。

注:java用equal比较字符串。


user avatar   s.invalid 网友的相关建议: 
      

很酷炫吧?

这玩意儿搞出的某些东西,甚至能盖过某些“古风”党几条街去(反正我是半点看不上那些玩意儿:当然,这个纯属个人观点)。


让机器吟诗作对?风雅到骨子里了吧?


但事实上,这才是个充满“暴力美学”的、通过简单粗暴的工程思维拼凑出来的、黑大傻粗的玩意儿……


它的基本原理,只是统计所有存世对联里“B词出现在A词之后的概率”和“下联中在A词对应位置上出现B词的概率”(所谓“马尔科夫模型”),然后在你给出上联/标题后,用“蒙特卡罗”方法选择一些词,然后从中挑出一句“构成对联的概率最大”的而已——所谓“蒙特卡罗方法”,其实还是“在所有词中随机选一个”,同样的简单粗暴。

(当然,这是最“糙”的未打磨版的做法——不过“打磨版”也没高到哪儿去,无非是加一些统计再加一些判断罢了)


这帮粗鲁的家伙!硬生生用理科生的简单粗暴闯进了文学殿堂!


PS:感谢 @张昭 朋友提示,目前对联/诗词也开始迁移到基于神经网络的Seq2seq方法上去了——而神经网络是另外一种简单粗暴的思路,后文会有提及。


不仅这个。之前中文分词一直是个难题,多少学者搞了半辈子都没有丝毫眉目。


(“中文分词”这个问题是这么来的:英文单词前后有空格,所以无需分词;但中文是一个个字直接“拼”成了一句话,想正确理解它,就得把组成这句话的一个个词“摘”出来。比如“日文章鱼怎么说?”得先拆分成“日文 章鱼 怎么 说 ”,才有办法继续分析下去;但如何让电脑知道,这句话不能拆分成“日 文章 鱼 怎么 说”呢?这就是分词算法遭遇的极大难题)


过去,学者们尝试通过分析语法、词性、语义等手段来解决分词问题——这也正是我们人类自己理解一句话的思路——然而写成算法效果一直不好,完全无法实用。



后来,中文分词得到了突破性进展。

这个研究是google搞的,同样基于马尔科夫链原理:先统计海量文章,找出B词在A词后的概率;然后找C词出现在B词后的概率……


最终,算法目标就变成了“找出一种分词方案,使得这种方案里的一系列词按顺序最终组成一句话的概率最大”。


简单粗暴吧?

但™真把老大难的分词问题给解决了——而且只需二阶马尔科夫链,就足以达到实用标准了(二阶就是只统计到“B在A后面出现的概率是多少”,而三阶就要统计到“当B在A后面出现的时候,后面再出现C的概率是多少”:没想到吧?这种简单粗暴的玩法,居然能比精妙的各种语法/语义分析强大得多!)。


(当然,之后又在这个基础上有了很多别的进展,我不搞这个,就不乱说了)


这个思路用在输入法的“智能联想提示”以及“整句输入”上,效果也是呱呱叫——当年的google输入法就是因为这个算法一举成名,打的在这个领域浸淫了多年的其它拼音输入法公司晕头转向……


这个算法甚至可以自动识别出网友新造词——原理也很简单,找几个字同时出现的概率,如果它们经常同时出现,那么这很可能就是一个词(当然会有一定的误识别,主要集中在“的”“了”等高频字上;这同样可以利用统计方法去除);如果这个词不存在于旧词库,那么它就可能是一个新造词。

——现在,知道输入法的“新词库”“新网络流行语”是怎么找出来的了吧?才不是雇一群人天天泡各大论坛呢~~


事实上,去年大出风头的alpha go/alpha zero,也是个典型的“暴力美学”产物。


这玩意儿是这么来的:生物学家发现,神经细胞像一个触手怪一样,会“张牙舞爪”的伸出很多“触手”和其它神经细胞相互链接。而这些“触手”(术语叫轴突)可以传递信号(神经冲动)。


有人就猜想,或许这就是我们学习/思考的原理吧:

1、我们听到、看到、摸到的各种信号,最终成为某种“神经冲动”进入神经中枢

2、中枢的某个神经元收到信号,就通过“触手”告诉和它相连的其它神经元

3、经过很多神经元的传递后,信号最终被识别出来,并可能因此产生某种决策

4、决策的结果有好(达到目的)有坏(未达到目的甚至造成伤害)

5、根据结果好坏,奖励或者惩罚相关联的细胞


进一步抽象:

1、每个神经元负责接受外界输入,然后传给其它神经元

2、当奖惩信号到来时,每个神经元找出那些让自己做出正确判断的神经元,增大它的权值;同时找出使自己做出错误判断的神经元,降低它的权值


更进一步:

1、用函数模拟神经元

2、把函数分成若干组,第一组接受输入,然后产生信号传递给第二组;第二组以第一组的输入为输入,输出信号给第三组,依次类推

3、根据结果正确与否,每组函数检查导致自己输出正确/错误的那些上层函数,提高/降低它给自己的信息的权值


嗯,然后只要函数个数够多、层次够深、训练次数足够,大概就能解决学习问题了吧。


然后,让我们把图片数字化,然后丢给这么一堆函数,让它们输出一个值(0~1之间)试试效果吧。

我们可以规定这个值的意义是“图片中有猫的概率”,0就是绝对没猫,1是肯定有猫,0.8就是八成有猫——然后再人工识别图片是否有猫,也把人工识别的结论表示成数字。

最后,让这组函数学习一堆图片;每学完一张,就根据人工识别的结果完成奖惩。


如此反复,经过大量图片训练之后,这组函数竟然真的知道什么是“猫”了。



类似的,我们还可以让它判断围棋落子位置的好坏,然后用最后的输赢来给它打分——经过数千万局的训练,它就真的赢了李世石、柯洁!



类似的,这玩意儿还可以用来搞出准确率极高的语音识别、人脸识别,可以完成照片到水彩到油画的转换,甚至把输入照片仿造成著名画家的作画风格……


这东西如今真是炙手可热。你能想到的几乎任何地方,都会有人尝试塞个神经网络碰碰运气……


但这玩意儿为什么能做到这些?

没人知道。


反正,只要我们想办法堆叠尽量多的“函数”,组成尽量庞大的人工神经网络,然后想办法把问题对应过去,最后搞一堆数据训练它——这玩意儿往往就真的能比最强的人类做的还要好。


这还真是大力出奇迹。


user avatar   Ivony 网友的相关建议: 
      
       while( TryDoSomething() == false );      



我觉得大家对暴力的理解有点儿偏差,简单的东西才能叫做暴力,写那么大一堆,写的时间比计算机跑的时间还长哪暴力了……


user avatar   davidtsang 网友的相关建议: 
      

哦。。。我觉得百度1万多个if的“人工智能”无人驾驶汽车项目应该最切这题。


user avatar   jiayu2dai 网友的相关建议: 
      

我曾用归并排序和random shuffle 写过一个占用内存超大的死循环。每个寒冷的夜在床上,我都一边开着循环加温一边看视频。


user avatar   Guppy0608 网友的相关建议: 
      

证明:任意组合的三阶魔方,均可在20步之内还原。

先看看Reddit上对于这个问题的讨论

This is a great example of brute force. I thought this would be proved by maths, but they just tested all the possible(relevant) cases, I love it.

路人甲:暴力证明的典范!简单粗暴的证明!

Brute force never fails, unless of course you’re not using enough of it.

炮灰乙:没有什么问题是暴力解决不了的!如果有,那就再暴力一点!

据传,三阶魔方有约合4.3千兆种不同的可能组合状态[注1]。就算是每秒钟能转出十种不同组合的神级玩家,想要尝试所有的组合,也要花1500亿年的时间才能如愿 (作为比较,我们的宇宙目前还不到 140 亿岁)。

因此,“三阶魔方的最小还原步数”也被称为“上帝之数”。在此之后的三十多年中,数学家们通过多次助攻一步步收窄上帝之数的范围。

然而最后,人头被谷歌旧金山总部的超级主脑计算机抢走[注2]。下面是由计算机模拟出的每种步数对应的状态总数,同时也证明了三阶魔方的上帝之数是20。

最后是一些小注释~

1.计算三阶魔方可能的组合状态总数

  • 魔方的中心块不可变化位置;
  • 魔法的8个角块各有3个方向,在不同位置、方向的可能性为 种;
  • 魔方的12个棱块各有2个方向,在不同位置、方向的可能性为 种;

另外,如果你拆解并还原过魔方,会出现以下3种情况:

  • 有一个角块方向需要调整,出现这种情况只有 的可能性可以正常还原魔方;
  • 有两个角块的位置需要互换,有 的可能性可以正常还原魔方;
  • 有两个棱块的位置需要互换,有 的可能性可以正常还原魔方。

所以只有 的可能性可以直接还原魔方。

即三阶魔方可能的组合状态总数为

2.遍历所有组合状态的步骤

  • 首先将魔方状态群根据 子群分解成 个右陪集,其中每个陪集中的元素个数为 。
  • 利用魔方的对称性(即对于状态A及整体转动S, S^-1 A S和A同解)将陪集的个数降为 ,即约为总量的 。
  • 暴力求解每个陪集。

参考资料:

God's Number is 20

Super flip


user avatar   a-tai-er-11 网友的相关建议: 
      

有一说一,其实性价比最高的4K蓝光播放设备很可能是二手xbox


user avatar   miloyip 网友的相关建议: 
      

“所以你看到了我的消息还是没回对吗?”

“是”




     

相关话题

  正在工作的程序员,生活状态什么样? 
  目前的人工智能离可以自己给自己写代码编程还有多远? 
  如何看待李玉刚向河南捐款 20 万截图疑被盗用,对方经今日头条认证系华为ICT高级工程师? 
  怎样实现浮点数除以一个数再乘以这个数结果等于原值? 
  请问如何判断自己适不适合当程序员? 
  计算机学院的学生该怎样提高自己的编程能力? 
  适用于 Mac 的机械键盘,有哪些推荐? 
  如何看待阿里 P8 加面 coding 环节,而 P7 却做不出头条算法题? 
  做主程序员是怎样的体验? 
  程序员想开一个编程公司需要怎么做? 

前一个讨论
TNO中的领袖人物在OTL是干什么的?他们的命运区别有多大?
下一个讨论
电影《蝙蝠侠:黑暗骑士崛起》中,韦恩怎么被贝恩利用期权交易搞破产的?





© 2024-05-17 - tinynew.org. All Rights Reserved.
© 2024-05-17 - tinynew.org. 保留所有权利