鱼C论坛

 找回密码
 立即注册
查看: 3418|回复: 13

[技术交流] Python:每日一题 99

[复制链接]
发表于 2017-9-11 18:44:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2017-9-13 07:40 编辑

首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 为了让大家独立思考,跟帖改为“回帖仅作者可见”。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
在屏幕上用字符显示一个实心圆。
要求编写函数circle(d): d为直径,以行数计算,为方便编程,d使用偶数。考虑到实际显示中字符行间距大于字间距,横向的字符数可设为纵向的2倍。
1.jpg

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-11 22:27:17 | 显示全部楼层
  1. def circle(d):
  2.     list_x = [(int((d**2 - y**2)**0.5+0.5))*2 for y in range(0,d,2)]
  3.     list_x = sorted(list_x) + list_x
  4.     for i in list_x:
  5.         print(('*'*i).center(d*2))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 00:23:59 | 显示全部楼层
今天没时间去想了,直接进来学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 09:54:50 | 显示全部楼层
本帖最后由 bush牛 于 2017-9-12 09:55 编辑
  1. import math

  2. def circle(d):
  3.     x = []
  4.     for y in range(d):
  5.         x.append(round(2*math.sqrt((d)**2 - (y)**2)))

  6.     for i in x[::-1]:
  7.         print(' '*(2*d-i)+'*'*i*2)

  8.     for i in x:
  9.         print(' '*(2*d-i)+'*'*i*2)
复制代码

点评

打印的行数是d的两倍  发表于 2017-9-12 20:29

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 11:10:37 From FishC Mobile | 显示全部楼层
def circle(d):
    a=0.5
    for i in range(d):
        c=int((((d/2)**2-(d/2-a)**2)**(1/2))*2+0.4)
        x=" "*int((d-c))
        y="*"*c*2
        a+=1
        print("   ",x,y)

circle(14)

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 13:22:34 | 显示全部楼层
  1. import math

  2. def circle(d):
  3.     r = d//2

  4.     # top semi-circl
  5.     for i in range(1,r + 1):
  6.         ns = int(math.sqrt(2 * r * i - i * i))
  7.         stars = '*' * (ns * 2 + 1) * 2
  8.         nb = 2* (2 * r - ns)
  9.         blanks = ' ' * nb
  10.         print(blanks + stars)

  11.     #bottom semi-circl
  12.     for i in range(r + 1,0,-1):
  13.         ns = int(math.sqrt(2 * r * i - i * i))
  14.         stars = '*' * (ns * 2 + 1) * 2
  15.         nb = 2* (2 * r - ns)
  16.         blanks = ' ' * nb
  17.         print(blanks + stars)
  18.    
  19. circle(40)
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 21:14:51 | 显示全部楼层
给楼主提个建议:
要不改成多少时间后或者多少楼后公布答案,或者公开大家的回帖,不再奖励

这样没有答案,又看不见别人的想法,根本不知道自己的想法有没有绕弯路啊
考完试不讲试卷,没有进步的啊
我直接建二维数组,然后用圆的方程画的
  1. import numpy as np

  2. def circle(d):
  3.     a = np.fromfunction(lambda x,y: np.hypot(x-d//2, y-d//2), (d,d))
  4.     [print(*i) for i in np.where(a >= d/2, " ", "*")]
复制代码

这里刚好利用了print()打印隔开字符的空格,
如果要做成楼主那种实心的,就在打印上动手脚
  1. import numpy as np

  2. def circle(d):
  3.     a = np.fromfunction(lambda x,y: np.hypot(x-d//2, y-d//2), (d+1,d+1))
  4.     for i in np.where(a > d/2, " ", "*"):
  5.         for j in i:
  6.             print(2*j, sep="", end="")
  7.         print()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-12 22:40:16 | 显示全部楼层
本帖最后由 醉挽丶南风 于 2017-9-12 22:42 编辑
  1. import math
  2. def fun(n):
  3.     content = []
  4.     n=n//2
  5.     for y in range(1,n+1):
  6.         lenght=int(math.sqrt(n**2-(n-y)**2))
  7.         subcontent = []
  8.         for a in range(2*(n-lenght)):
  9.             subcontent.append(' ')
  10.         for b in range(4*lenght):
  11.             subcontent.append('*')
  12.         for a in range(2*(n-lenght)):
  13.             subcontent.append(' ')
  14.         content.append(''.join(subcontent))
  15.         content.append('\n')

  16.     for y in range(n+1,1,-1):
  17.         lenght=int(math.sqrt(n**2-(n-y)**2))
  18.         subcontent = []
  19.         for a in range(2*(n-lenght)):
  20.             subcontent.append(' ')
  21.         for b in range(4*lenght):
  22.             subcontent.append('*')
  23.         for a in range(2*(n-lenght)):
  24.             subcontent.append(' ')
  25.         content.append(''.join(subcontent))
  26.         content.append('\n')
  27.         
  28.     print(''.join(content))

  29. fun(40)
复制代码


微信图片_20170912224207.png

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 22:59:52 | 显示全部楼层
我用IDLE打印过,没问题啊。
横向的字符数可设为纵向的2倍。 我是2倍的。
我的参数d是半径。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-13 07:43:12 | 显示全部楼层
solomonxian 发表于 2017-9-12 21:14
给楼主提个建议:
要不改成多少时间后或者多少楼后公布答案,或者公开大家的回帖,不再奖励

在大家答题后一段时间会公开回帖。如果比较复杂的问题会加上讲评,谢谢你的建议。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-13 07:44:24 | 显示全部楼层
bush牛 发表于 2017-9-12 22:59
我用IDLE打印过,没问题啊。
横向的字符数可设为纵向的2倍。 我是2倍的。
我的参数d是半径。

明白了,我是按直径考虑的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-5 10:12:07 | 显示全部楼层
  1. def circle(d):  # d为直径,以行数计算
  2.     for y in range(0, d):
  3.         x = int(4 * int(((d//2)**2 - (y-d//2)**2)**0.5 + 0.5)) # *个数
  4.         x1 = d - x//2 #空格数
  5.         print(' '*x1 + '*'*x)

  6. circle(40)

  7. #  没有别人画的圆呀。
复制代码

wxid_mlhj1sszbna021_1512433933021_32.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-19 17:43:37 From FishC Mobile | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 14:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表