你看过/写过哪些有意思的代码?
你看过/写过哪些有意思的代码?
-----
网友解答:
-----
设计模式的艺术:用状态模式告别if-else
面对判断分支异常多、状态变化异常复杂的业务逻辑代码,在大量if-else中遨游往往会犯恶心,甚至怀疑起了人生。
例如“手写一个判断函数,确认字符串是否是一个合法的科学数字表达式”这种常见的业务逻辑问题。
如果用if-else写,就会变成如下丑陋的代码:
每次维护这种代码,总是都要从头阅读一遍,确认自己要在哪里修改,仿佛在修补一个破旧的大棉袄。
但我们如果使用了设计模式中的状态机模式来进行重构,整块代码就会非常精妙。
首先要画出一副如下所示的状态演变图:
图源来自leetcode
状态图绘制完成之后,就可以根据状态变化的合理性,确认状态是否符合要求。
代码如下所示:
从下面的代码可以看到,未来只需要维护transferMap 即可,非常方便,代码的优秀设计模式是一门造福懒人程序员们的艺术,重构出一个易于维护的代码也是程序员的成就感来源之一。
并发编程的艺术:诡异的Java代码揭示了cpu缓存的原理
著名的Java并发编程大师Doug lea在JDK 7的并发包里新增一个队列集合类Linked-TransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能。LinkedTransferQueue的代码如下,着重关注p0~pe的定义:
追加字节能优化性能?这种方式看起来很神奇,但如果深入理解处理器架构就能理解其中的奥秘:(以下的解释来自《Java并发编程的艺术一书》 )
“因为对于英特尔酷睿i7、酷睿、Atom和NetBurst,以及Core Solo和Pentium M处理器的L1、L2或L3缓存的高速缓存行是64个字节宽,不支持部分填充缓存行。
这意味着,如果队列的头节点和尾节点都不足64字节的话,处理器会将它们都读到同一个高速缓存行中,在多处理器下每个处理器都会缓存同样的头、尾节点。
当一个处理器试图修改头节点时,会将整个缓存行锁定,那么在缓存一致性机制的作用下,会导致其他处理器不能访问自己高速缓存中的尾节点,而队列的入队和出队操作则需要不停修改头节点和尾节点,所以在多处理器的情况下将会严重影响到队列的入队和出队效率。
因此Doug lea使用追加到64字节的方式来填满高速缓冲区的缓存行,避免头节点和尾节点加载到同一个缓存行,使头、尾节点在修改时不会互相锁定。
可以看到,在java的并发代码中能够体现底层缓存的设计。虽然这代码不太符合java希望屏蔽底层实现细节的设计理念,但是Doug lea大师对细节的考虑仍然让人赞叹不已。
算法的艺术:用搜索解决迷宫问题
学习数据结构时,相信“深度优先搜索”和“广度优先搜索”对初学者来说一度是一个噩梦,做练习题时也是用各种姿势遍历去二叉树,无法感受到乐趣所在。
但是当你用搜索来解决比较简单的迷宫寻路问题时,便会感到算法的魅力。
想起小时候玩一些RPG游戏,往往会有各种迷宫,每次自己探索出口时,其实就是用的深度搜索,找不到会回溯,然而这样费时间也费脑子,当地图过大,大脑的缓存不足,或者思考深度不足时,解决起来就很困难。
但如果有计算机的帮忙,对于每次的移动,给定地图输入,使用搜索算法、A*等算法,便能够快速找到迷宫的离开路线。
下面给出一个伪代码,来简单解释搜索问题是怎么解决问题的:
所以当你学习完搜索算法,却还对其应用感到困惑时,不妨来做一道迷宫寻路题.(例如http://poj.org/problem?id=3984)
或者自己写一个五子棋对战程序与自己对战。对战程序除了搜索算法,还要考虑博弈论的思想,通过alpha-beta算法来处理敌对双方对结果的选择,编写评估函数来定义对局面好坏的判断, 整个编写过程会更加复杂而有趣,不妨作为自己对搜索算法更深层次的学习时尝试一番。
二进制的艺术:用数学节省了空间
“给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素,而且不能用额外空间”
甚至还有升级版:
“给你一个整数数组 ,除某个元素仅出现一次外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。”
第一想法肯定是维护一个哈希表或者数组。但是问题要求不能用额外空间,这一般都是为了在有成本限制的环境下考虑和设计的,例如内存有限的某些硬件设备中。
因此在最佳解法中,选择借助了二进制来解决这个问题。通过同位异或得0,不同位异或得1的特性,快速过滤掉相同的数字:
是不是感觉非常巧妙有趣,利用数学的二进制特性,简单的异或就搞定了本来需要大量内存的问题,不禁令人拍案叫绝。
本文分享自华为云社区《【云驻共创】用4种代码中的艺术试图唤回你对编程的兴趣-云社区-华为云》,作者:breakDawn。
-----
网友解答:
-----
都说程序员木讷无趣,今天就借机让大家领略一下什么叫隐藏在代码里的有趣灵魂。
话不多说,follow me!
1.离职彩蛋——会自杀的文件
离职时电脑里的文件带不走,又不想被别人捡漏?不妨给文件下一个“自杀”指令。直白地说就是在Excel文件的VBA里编制一段“自杀”代码,只要有人启用该文件的宏,文件就会神奇的消失,是不是有点奇幻色彩?
这还不是最牛的,更厉害的地方在于你可以为文件设定一个“自杀”期限或者限制一定的“自杀”次数。比如,为了避免影响工作交接,你可以把启动“自杀”的时间设置在交接完成之后,只要有人再打开你的工作簿启用宏,文件就会忠诚的“死去”;设定次数的方式比较适合于炫技场景,例如设定了5次“自杀”机会,你大可以把前5次机会让给别人,事实上无论是谁打开都会发生文件“自杀”事件,而到第6次的时候一定要亲自上阵,向大家展示什么是“天选之子”。
2. 小霸王代码
不知道程序员们有没有玩过小霸王486?据说有人曾在第一次接触到这种“电脑”的时候,怀着无比激动的心情,在它的GBASIC程序下面敲下了自己人生中的第一行代码“what is your name?”即便是一行跑不通的代码,也让人兴奋不已。
3.手机的隐藏代码
买了新手机却忘记了手机序列号?别急,其实除了看手机的包装盒外,直接用手机中“关于手机”也能查到手机序列号。不过今天要说的是大部分手机在出厂之前就被安装了一组神奇的代码,只需要在手机的拨号界面,输入“*#06#”就会出现手机的IMEI码,部分手机可以通过该序列号查询到手机的真伪以及激活保修等信息。不用担心买到假手机了,开森~
4.PHP一行代码的巨大威力
不得不说PHP是“全世界最好的编程语言”,因为你只需要在编辑器里输入书上的示例代码
刷新浏览器的页面就会出现奇迹!
惊不惊喜?服不服气?开不开森?PHP是世界上最好的语言没有错吧,一行代码就输出了这么一大页东西!
5.Python控制程序操纵浏览器
什么?Python才是王道?那就学起来吧!打开IDLE,输入下面的代码:
再按一下回车键,意外之喜!程序竟然可以操纵我的浏览器了!
6.会跳舞的图片
闲来无聊娱乐一下,你可以在浏览器地址栏里输入一段代码,让网页里的图片在屏幕上飞舞起来,有没有很神奇?
javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; var DI= document.getElementsByTagName("img"); DIL=DI.length; function A(){for(i=0; i<DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5+"px"; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5+"px"}R++}tag=setInterval('A()',5 );document.onmousedown=function(){clearInterval(tag);for(i=0; i<DIL; i++){DI[i].style.position="static";}}; void(0)
Ps.有时粘贴时浏览器会自动吃掉“javascript:”这几个字符,手动敲上就可以~
7.编辑页面文字
在浏览页面的时候想要复制一段文字,却发现文字不能被编辑?其实方法很简单,按F12快键打开控制台,在控制台里面输入
你就会发现页面中的所有文字都可以编辑了,而且绝大部分网页界面都可以这么用。
8.用PHP代码作画
代码能作画,不到20行PHP代码也可以绘制一个复杂美丽的图像,而你只需要敲出下面这些代码:
看,作品成功出炉了。
9.制作无法关闭的对话框
工作的时候最烦电脑不听指挥,但其实有些也可能是人为恶搞的小把戏,例如在浏览器的地址栏里输入一段神奇的代码,你将得到一个无法关闭的对话框。
10.黑客帝国代码雨效果
将这段代码用记事本保存为一个bat批处理文件,比如yu.bat,按WIN+R打开运行对话框,输入CMD,在CMD里面运行该文件,就会出现黑客帝国代码雨的效果了。
@echo off
color 02
:start
echo %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% goto start
11.“调皮”的光驱
不要在安装有光驱的LINUX电脑运行下列程序,否则打赌你的光驱总是会自动弹开。
12.一行“累死”CPU的代码
看吧,码农的世界丰富多彩,黑夜给了码农黑色的眼睛,我们却用它来寻找代码里的光明……希望这些小代码能激起你学习编程的兴趣哦~
程序员学习交流请添加慕课网官方客服微信:mukewang666
回复暗号“前端面试”可进前端交流群
回复暗号“Java”可进Java交流群
回复暗号“专栏”可进程序员交流群
-----
网友解答:
-----
while(true){
}
有意思的不行,机器都挂了,公司破产了,老板在抹泪...
-----
网友解答:
-----
-----
网友解答:
-----
<a href="javascript:alert('缓存清除成功!') >清除缓存</a>
------------------
推荐阅读:
老父亲在九六年借给朋友500元钱有借条,一年后朋友死了他家人不承认,父亲感觉气死了,应该怎么办?
上一篇:食用油什么牌子最好?