【小甲鱼】【七夕特供】一行流原理看法
希望来看的各位留个言{:10_330:}昨天小甲鱼发了一行流用python打印出爱心
print('\n'.join([''.join(['ilovefishc'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' 'for x in range(-40,40)])for y in range(20,-20,-1)]))
这是小甲鱼的代码
这段代码中重要的就是关于x,y的不等式了
((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0
于是我就将它输入在Desmos中,得到以下图像:
果不其然,是一个心形
通过观察我们可以得出结论:
1. x,y 的取值一定在红心里,也就在红色方框内(只要(x,y)这个点在红心上即可)
2. x一定满足(-40<x<40):因为红色方框左右两端也就±20出头,y也一定满足(-20<y<20)
所以这一行代码就是这么来的
for x in range(-40,40)])for y in range(20,-20,-1)
不过仔细观察上面的代码可以发现两个for 循环不是一起的
如果是一起的,那(x,y)顺序打印出来应该是
(-40,20),(-40,19),(-40,18)......
#这样的话其实是不行的
为什么?我们可以把画面想象成一个80*40的空白画面,(0,0)是这个画面的中心点
那么我们想一下如果是像上面这段代码便利的话,有两个漏洞
1.他是从左往右一列一列遍历每个点(而我们需要的是从上往下一行一行遍历,这样才能打印出正确图案)
2.由于for循环位置不对,在join时导致不能正确地换行,也就是本来该在一行的数据应当组成一个列表
否则效果就是这样
l
o
v
e
f
i
s
i
#省略
.
.
.
#足足有80*40=3200行
所以就要向小甲鱼一样正确摆放好位置,源代码正确的遍历顺序就是(-40,20)#这就是80*40画面的最左上角那个点,(-39,20),(-38,20)......
这样就是从上到下一行一行遍历了
所以还可以把数据改一下
见下图
如果要改变爱心里的文字的,就要注意不要out of range了,%8是为了保证得到的数字在0~7之间(不过小甲鱼这里就因为%8,导致最后的'shc'三个没打印出来,改成%10就可以了)
其他的没什么说的了
以上是个人理解,我是一个新手,有些地方可能有错误,希望大佬萌指出{:10_266:}
厉害厉害{:10_254:}膜拜 这个可以,不过要小很多 学习一下 7夕快乐 分析的很到位{:10_256:} {:10_275:} 不二如是 发表于 2022-8-5 13:34
分析的很到位
这一行流是谁写的{:10_297:} {:10_256:} {:5_106:} ! 太强了 {:10_279:} 赞一个~ {:10_275:}赞~ {:5_108:} 厉害 赞{:10_257:}
页:
[1]