python 简洁代码的写法
本帖最后由 ymhld 于 2020-1-26 21:32 编辑问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。
我的写法python:
n=6;m=4;a=(list(i for i in range(1,n+1))*3*m);
for j in range(1,n):
print ("删除: ",a);b=a;a=a;
for i in range(len(a)-1,-1,-1):
if a==b:a.pop(i)
print ("剩余: ",a)
运行结果如下:
删除:4
删除:2
删除:1
删除:3
删除:6
剩余:5
说明:
首先建立一个大list,让1到n循环3M次(不是口罩了,都卖脱销了,这里也没有;注:2M次会出错)
然后运行n-1次,从头数M个数,即为要删除的数,在此数前全部不要,后面含此数的也遍历删除,然后再数M个数。。。直到剩余一个数并显示出来。
不会用for循环 和if在一行语句里判断,请高手来指导,争取也能两行完成。 代码行数少不代表效率一定高,过度追求简洁没啥用。 葫芦炒鸡蛋 发表于 2020-1-26 23:05
代码行数少不代表效率一定高,过度追求简洁没啥用。
同意,代码洁癖可读性会大打折扣 emmmmmmmmmmmmm 我只选思路最简单的 本帖最后由 ymhld 于 2020-1-27 11:54 编辑
n=12;m=4;a=(list(i for i in range(1,n+1)))
for j in range(1,n):
d=(m if m<=len(a) else (len(a) if m%len(a)==0 else m%len(a)));b=a[:d-1];c=a;print ("删除: ",c);a=a;a=a+b
print ("剩余: ",a)
自己重写了一下 不要一味追求单行简洁,不是专业选手或者能手,时间久了自己读起来都费劲。 wkfy 发表于 2020-1-28 10:24
不要一味追求单行简洁,不是专业选手或者能手,时间久了自己读起来都费劲。
确实,只是当个练习 本帖最后由 天黑我隐身 于 2020-2-1 20:46 编辑
贴的代码真的难看,自己能看明白就算了,如果贴给别人,麻烦还是先看看PEP8规范吧
追求代码行数前面的朋友都说了,我就不重复了
我就这个题目提供一种递归思路解法
def func(cur_id, tar_id, l):
"""递归法
口号从自然数1开始,与数组索引有差异
:param cur_id: 当前口号
:param tar_id: 要删除的口号
:param l: 目标数组
:return:
"""
if len(l) == 1:
print('剩余:', l)
return
# 数组大小小于删除口号时会涉及循环口号
# 最终目标口号 = 删除口号除以数组长度取余
if len(l) < tar_id:
# 如果余数=0 由于下面递归逻辑都是从1开始 因此必须特殊处理
# 因为索引 [-1]和等价 所以直接取target = len(l)
target = (tar_id % len(l)) or len(l)
else:
target = tar_id
if cur_id == target:
print('删除:', l)
return func(1, tar_id, l + l[:cur_id - 1])
else:
return func(cur_id + 1, tar_id, l)
n, m = (6, 4)
a =
func(1, m, a) 天黑我隐身 发表于 2020-2-1 20:44
贴的代码真的难看,自己能看明白就算了,如果贴给别人,麻烦还是先看看PEP8规范吧
追求代码行数前面的朋 ...
谢谢建议,刚学python ,向各位大佬 学习
页:
[1]
2