|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
希望来看的各位留个言
昨天小甲鱼发了一行流用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)......
这样就是从上到下一行一行遍历了
所以还可以把数据改一下
见下图
这是x(-60,60),y(30,-20,-1))
如果要改变爱心里的文字的,就要注意不要out of range了,%8是为了保证得到的数字在0~7之间(不过小甲鱼这里就因为%8,导致最后的'shc'三个没打印出来,改成%10就可以了)
其他的没什么说的了
以上是个人理解,我是一个新手,有些地方可能有错误,希望大佬萌指出
这是原数据打印出来的
|
评分
-
参与人数 3 | 荣誉 +7 |
鱼币 +9 |
贡献 +11 |
收起
理由
|
小甲鱼
| + 2 |
+ 3 |
+ 3 |
鱼C有你更精彩^_^ |
青出于蓝
| + 3 |
+ 3 |
+ 5 |
|
不二如是
| + 2 |
+ 3 |
+ 3 |
鱼C有你更精彩^_^ |
查看全部评分
|