前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:请拿出一段体现你水平的代码,该如何回答?

面试官:请拿出一段体现你水平的代码,该如何回答?

作者头像
量化投资与机器学习微信公众号
发布2019-02-26 16:24:07
7390
发布2019-02-26 16:24:07
举报

本期作者:Milo Yip | 独家授权

作者介绍:腾讯 · 技术总监/专家工程师

面试官:请拿出一段体现你水平的代码。

候选人:公司写的工程代码不好给你看,平常画的可以么?例如:

面试官:这什么鬼?!

候选人:其实我想画一颗皇后棋子⋯⋯

如何实现?

用 C 实现,只有一行一个语句,连空格 173 个字符:

代码语言:javascript
复制
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;}

编译执行:

代码语言:javascript
复制
$ gcc -w -include stdio.h a.c && ./a.out
92

这个解答从@Comzyh的回答 ,只是把迭代改成递归,以及用main()作为递归函数。

更新1:评论@雾雨魔理沙说到标准是不容许 main() 递归的,我再给一个标准一点的,两个语句,连空格 154 个字符:

代码语言:javascript
复制
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 个字符:

代码语言:javascript
复制
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 个字符):

代码语言:javascript
复制
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));}

输出:

代码语言:javascript
复制
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个字符:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 语言的,兼容性一定没问题!

从零开始的 JSON 库教程

https://zhuanlan.zhihu.com/p/22457315

面试官:那个啊,你抄那个没问题吧?

候选人:虽然教程拖了这么久还没写完,但代码已经是完整的,没问题的!

面试官:好吧,那你明天就上班抄这个吧!看你什么都不懂,文体两开花,就六块吧!

候选人:六块时薪?

面试官:六块年薪!

面试官&候选人:乐快年新!

文章来自:

https://www.zhihu.com/question/309675877/answer/587575915

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量化投资与机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何用计算几何模型画一束玫瑰花?
  • 《写生机器人》制作经验分享(上)
  • 《美绿中国象棋》制作过程及算法简介
  • 从零开始的 JSON 库教程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档