吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1902|回复: 10
收起左侧

[求助] python 简洁代码的写法

[复制链接]
ymhld 发表于 2020-1-26 21:30
本帖最后由 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[m-1]);b=a[m-1];a=a[m:];
        for i in range(len(a)-1,-1,-1):
                if a==b:a.pop(i)
print ("剩余: ",a[0])

运行结果如下:
删除:  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
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[d-1];print ("删除: ",c);a=a[d:];a=a+b
print ("剩余: ",a[0])
自己重写了一下
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规范吧

追求代码行数前面的朋友都说了,我就不重复了

我就这个题目提供一种递归思路解法

[Python] 纯文本查看 复制代码
def func(cur_id, tar_id, l):
    """递归法
    口号从自然数1开始,与数组索引有差异
    :param cur_id: 当前口号
    :param tar_id: 要删除的口号
    :param l: 目标数组
    :return:
    """
    if len(l) == 1:
        print('剩余:', l[0])
        return
    # 数组大小小于删除口号时会涉及循环口号
    # 最终目标口号 = 删除口号除以数组长度取余
    if len(l) < tar_id:
        # 如果余数=0 由于下面递归逻辑都是从1开始 因此必须特殊处理
        # 因为索引 [-1]和[len(l)-1]等价 所以直接取target = len(l)
        target = (tar_id % len(l)) or len(l)
    else:
        target = tar_id
    if cur_id == target:
        print('删除:', l[cur_id - 1])
        return func(1, tar_id, l[cur_id:] + l[:cur_id - 1])
    else:
        return func(cur_id + 1, tar_id, l)


n, m = (6, 4)
a = [i for i in range(1, n + 1)]
func(1, m, a)
 楼主| ymhld 发表于 2020-2-2 03:22
天黑我隐身 发表于 2020-2-1 20:44
贴的代码真的难看,自己能看明白就算了,如果贴给别人,麻烦还是先看看PEP8规范吧

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

谢谢建议,刚学python ,向各位大佬 学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 20:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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