本期作者:Milo Yip | 独家授权
作者介绍:腾讯 · 技术总监/专家工程师
一
面试官:请拿出一段体现你水平的代码。
候选人:公司写的工程代码不好给你看,平常画的可以么?例如:
面试官:这什么鬼?!
候选人:其实我想画一颗皇后棋子⋯⋯
如何实现?
用 C 实现,只有一行一个语句,连空格 173 个字符:
main(a,l,r,m,i,j,k){return a?printf("%d",main(0,0,0,0,0,0,8)):j?i?main(0,l,r,m,i&i-1,1,k)+main(0,(l|i&-i)*2,(r|i&-i)/2,m|i&-i,0,0,k-1):0:k?main(0,l,r,m,~(l|r|m)&255,1,k):1;}
编译执行:
$ gcc -w -include stdio.h a.c && ./a.out
92
这个解答从@Comzyh的回答 ,只是把迭代改成递归,以及用main()作为递归函数。
更新1:评论@雾雨魔理沙说到标准是不容许 main() 递归的,我再给一个标准一点的,两个语句,连空格 154 个字符:
q(l,r,m,i,j,k){return j?i?q(l,r,m,i&i-1,1,k)+q((l|i&-i)*2,(r|i&-i)/2,m|i&-i,0,0,k-1):0:k?q(l,r,m,~(l|r|m)&255,1,k):1;}main(){printf("%d",q(0,0,0,0,0,8));}
放不进一条 tweet。 更新2:去掉 k,147 个字符:
q(l,r,m,i,j){return j?i?q(l,r,m,i&i-1,1)+q((l|i&-i)*2,(r|i&-i)/2,m|i&-i,0,0):0:m==255?1:q(l,r,m,~(l|r|m)&255,1);}main(){printf("%d",q(0,0,0,0,0));}
改为 n-queen,函数本身 117个字符,再加上打印 n=1...15(额外 61 个字符):
q(l,r,m,n,i,j){return j?i?q(l,r,m,n,i&i-1,1)+q((l|i&-i)*2,(r|i&-i)/2,m|i&-i,n,0,0):0:m-n?q(l,r,m,n,~(l|r|m)&n,1):1;}
main(n){for(n=0;n++<15;)printf("%d ",q(0,0,0,(1<<n)-1,0,0));}
输出:
1 0 0 2 10 4 40 92 352 724 2680 14200 73712 365596 2279184
答案符合 A000170 - OEIS
(https://oeis.org/A000170)
更新3:一行或 10 行都不好看,来个 20 行的。
更新4:把 m==n?a:b 改成 m-n?b:a,省一个字符,116个字符:
q(l,r,m,n,i,j){return j?i?q(l,r,m,n,i&i-1,1)+q((l|i&-i)*2,(r|i&-i)/2,m|i&-i,n,0,0):0:m-n?q(l,r,m,n,~(l|r|m)&n,1):1;}
main(n){for(n=0;n++<15;)printf("%d ",q(0,0,0,(1<<n)-1,0,0));}
二
面试官:一堆乱码就当代码!有别的吗?
候选人:有的有的,不如看看这个网站⋯⋯(https://www.shadertoy.com/view/XsdyWr)
面试官:怎么给我看视频网站了?
候选人:这是我上年情人节画的玫瑰花⋯⋯
C 语言版本的源文件在 rose.c 。
https://github.com/miloyip/misc/blob/master/rose/rose.c
一些注意的地方如下:
1、生成的文本是 160x80 个字符,如命令行不能显示这么多字符,可重定向到文件(如 ),用编辑器打开。
2、要加入名字等字符,修改 146 行,如插入 "milo"(这里接入"olim" 会好看一些),并把最后的 12.0f 改成 16.0f:
putchar(" .,-:;+=olim*#@@"[(int)(f(make2((x / 160.0f - 0.5f) * 2.0f, (y / 80.0f - 0.5f) * -2.0f)) * 16.0f)]);
3、第 143 行用ANSI转义序列 改变文本颜色,需要终端支持。可按需修改颜色。
4、第 128、129 行是摄影机的位置和方向,建议修改。可在 ShaderToy 里试好才改 C 文件。
三
面试官:够了!你以为我们请画家吗?
候选人:其实我还真准备了一幅画⋯⋯ (从包里淘出一张A3纸)
面试官:素描吗?唉⋯⋯我们是请程序员啊。话说,Leon 是谁?你不是叫 Leon 吧?
候选人:Leon 是我做的机器人,这是他帮我画的。
地址:https://zhuanlan.zhihu.com/p/32084037
面试官:这是人工智能么?
候选人:不是不是,只是些图像处理和图形学的小玩意,几百块的材料⋯⋯
面试官:我就知道你不会人工智能,就会玩玩具。但不要紧,你会编程吧?你听说过 VC 六吗?
候选人:Microsoft Visual C plus plus six?
面试官:我说「V-C-六」啊。
候选人:啊,以前念大二的时候有用过「V-C-六」来做人工智能的功课。
http://miloyip.com/2010/milo-chinese-chess/
面试官:厉害啊,你下了个游戏来当功课啊。
候选人:不是啊,UI 都是自己用 OpenGL 画的。
面试官:啥芝欸路,你不知道「V-C-六」有 「M-F-C」 吗?
候选人:以前没怎么用⋯⋯
面试官:算了算了,其实我们也只是需要程序员处理一下数据,不太需要 MFC。不过啊,他们说想换用一个比较快的「J-S-O-N」库,VC6 编译不了,那个叫什么 「拉屁 J-S-O-N」。你觉得能搞得定吗?
候选人:RapidJSON 吗?嗯⋯⋯有点难啊「V-C-六」的模板支持不太好。但我写过一个 C 语言的,兼容性一定没问题!
https://zhuanlan.zhihu.com/p/22457315
面试官:那个啊,你抄那个没问题吧?
候选人:虽然教程拖了这么久还没写完,但代码已经是完整的,没问题的!
面试官:好吧,那你明天就上班抄这个吧!看你什么都不懂,文体两开花,就六块吧!
候选人:六块时薪?
面试官:六块年薪!
面试官&候选人:乐快年新!
文章来自:
https://www.zhihu.com/question/309675877/answer/587575915