ymhld 发表于 2020-1-26 21:30

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

代码行数少不代表效率一定高,过度追求简洁没啥用。

dongfang155 发表于 2020-1-26 23:35

葫芦炒鸡蛋 发表于 2020-1-26 23:05
代码行数少不代表效率一定高,过度追求简洁没啥用。

同意,代码洁癖可读性会大打折扣

咸某鱼 发表于 2020-1-27 09:13

emmmmmmmmmmmmm

ciker_li 发表于 2020-1-27 09:54

我只选思路最简单的

ymhld 发表于 2020-1-27 11:10

本帖最后由 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

不要一味追求单行简洁,不是专业选手或者能手,时间久了自己读起来都费劲。

ymhld 发表于 2020-1-28 10:38

wkfy 发表于 2020-1-28 10:24
不要一味追求单行简洁,不是专业选手或者能手,时间久了自己读起来都费劲。

确实,只是当个练习

天黑我隐身 发表于 2020-2-1 20:44

本帖最后由 天黑我隐身 于 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)

ymhld 发表于 2020-2-2 03:22

天黑我隐身 发表于 2020-2-1 20:44
贴的代码真的难看,自己能看明白就算了,如果贴给别人,麻烦还是先看看PEP8规范吧

追求代码行数前面的朋 ...

谢谢建议,刚学python ,向各位大佬 学习
页: [1] 2
查看完整版本: python 简洁代码的写法