商汤2017笔试编程题——绘制函数图像

商汤2017年笔试有道编程题:


乍一看,一脸懵逼,仔细分析一下,这道题还是挺有意思的。下面是对这道题的分析思路和代码实现。

(1)题目要求绘制函数在一个矩形区域内的图像,而给出的是一个不等式,那么绘制出来的应该是一个区域(例如,x^2 + y^2 < 1,在-1 <= x <= 1, -1 <= y <= 1内的图像是一个圆形区域)。

另外,我们可以看到,不等式中的x和y都有向下取整符号,那么,我们只需要考察坐标为整数的点是否满足不等式。也就是说,如果x = 1, y = 2的点满足(或不满足)不等式,那么1<= x < 2, 2 <= y < 3的点都满足(或不满足)不等式。这么看来,图像应该是由一个个“小方块”(边长为1)拼成的,要用控制台绘图的话,可以用空格表示不满足不等式的方块,用*号表示满足不等式的方块。

(2)接下来就是观察不等式本身。里面-19[x]-mod([y], 19)是一个整数(我这里就用[]来代表取整符号了),而一个数乘以2的负整数次幂就意味着对这个数进行右移运算!

再来看外层的取模运算。一个数对2取模,结果在区间[0, 2)内,再向下取整,得到0或1,只有1才大于1/2,即满足不等式。也就是说,对2取模后结果在[1, 2)内的才满足不等式,进一步说,右移运算后得到的那个值(二进制表示)的整数部分最低位是1时,才满足不等式。

这样,通过上面的分析,我们可以把核心问题归结为:判断[y / 19]这个整数的对应位置是否为1。听上去是不是很简单?

(3)关于大整数。n是一个很大的整数,已经超过了double所能表示的最大值。幸好,python直接提供对大整数的支持,Java也有BigInteger类,要用C/C++就麻烦了,得自己处理大整数。

下面的代码用Python实现。

w = 97					
h = 19
n = int('''25387662323153653783389137694654064904150135920
56064557569641060747189874210878905363207558373
46195363091636978822497466217817576537857063550
84416489616596554262026933535534365168331135604
84210322892796105514939244220458052911612908333
49037686692346426586107121909264855797085960367
01283287657733734321406181224263623480076385304
89778905365788162479028206169787790029221460600
67249896636596289194588006404727115460185404696
49492581691166206586469327401379659745626318993
17196851861003084529749350306176130305655599170
991203354819952640'''.replace('\n', ''))

im = [list(' ' * w) for _ in range(h)]			#创建一个二维数组,所有元素为空格
for x in range(0, w):
	for y in range(0, h):
		if ((n+y)//h) & (1 << (x * h + (n+y) % h)):
			im[y][x] = '*'

for row in reversed(im):				#将y轴翻转一下
	print(''.join(row))
	

结果很震撼,商汤科技的英文名称:

猜你喜欢

转载自blog.csdn.net/csdnqixiaoxin/article/details/78012314