鱼C论坛

 找回密码
 立即注册
查看: 2457|回复: 21

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

[复制链接]
发表于 2018-2-6 11:30:47 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-2-10 19:29 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
大家都做过约瑟夫环的练习:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
现在稍作改变,一队人(共10个,编号为0~9),先从前往后报数,当数到3时出列,继续往后,他的下一个人又从1开始报数,同样数到3时出列。当达到末尾时反过来数,即从后往前,按此规则反复进行,直至剩下一人,求此人的编号。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-2-6 14:50:42 | 显示全部楼层
  1. list1=[0,1,2,3,4,5,6,7,8,9]
  2. list2=[]
  3. num=1
  4. i=0

  5. while len(list1)>1:
  6.     num+=1
  7.     if i==0:
  8.         di=1
  9.     if i ==len(list1)-1:
  10.         di=2
  11.     if di==1:
  12.         i+=1
  13.     if di==2:
  14.         i-=1
  15.    
  16.     if num ==3:
  17.       
  18.         del list1[i]
  19.         
  20.         num=1
  21.         if di==2:
  22.             i=i-1
  23. print(list1)   
  24.    
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-6 17:11:09 | 显示全部楼层
本帖最后由 sukiwhip 于 2018-2-6 17:50 编辑

a = []

for i in range(0,10):
    a.append(i)

b = a.copy()
a.reverse()
c = a + b

for k in range(1,6):
    c = c + c

for j in range(1,10):
    o = c[2]
    for l in(1,3):
        del c[0]
    while o in c:
        c.remove(o)

print('剩下的号码是:' + str(c[0]))

当到达末尾时往回数,我认为首尾两端的人当回头的时候应该再数一次,如果只数一次就回头挂掉几率会减少?

点评

规则不同,结果也会有差别。  发表于 2018-2-10 19:26
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-6 21:12:28 | 显示全部楼层
list1=[i for i in range(10)]
print(list1)
while len(list1)!=1:
    a = len(list1) % 3
    list2=[]
    for i in range(len(list1)):
        if (i+a)%3==0:
            list2.append(list1[i])
    list1 = [item for item in list1 if item not in list2]
    list1.reverse()
    print(list1)
print('最后剩下编号%d'%list1[0])

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-6 21:24:23 | 显示全部楼层
本帖最后由 solomonxian 于 2018-2-8 21:57 编辑

当人数k和间隔m上升到50,40循环的时候,出现了各种情况,没有标准答案判断很麻烦啊

不去管报数和指针,搭一条剩余元素无限循环的列表,不断索引、删除直到剩余1种
  1. def fun(k=10, m=3):
  2.     team = list(range(k))
  3.     chain = []
  4.    
  5.     while len(team) > 1:
  6.         while len(chain) < m:
  7.             chain += team[:] + team[-2:0:-1] # 周期是2*k - 2
  8.             trash = [i for i,(j,k) in enumerate(zip(chain, chain[1:])) if j==k] # 去相邻重复
  9.             for i in trash[::-1]:
  10.                 chain.pop(i)
  11.          
  12.         temp = chain[m-1]
  13.         team.remove(temp)
  14.         chain = chain[m:]
  15.         while temp in chain:
  16.             chain.remove(temp)
  17.             
  18.     return team[0]
复制代码

换个想法,假如我用一个变量记录方向,那就能将k-1作为一个循环周期
  1. def fun2(k=10, m=3):
  2.     team = list(range(k))
  3.     directions = [1, -1]
  4.     count, mod = 0, 0

  5.     while len(team) > 1:
  6.         div, mod = divmod(mod + m-1, len(team)-1)
  7.         if div % 2:
  8.             count = (count + 1) % 2
  9.         team.pop(mod * directions[count] - count)
  10.     return team[0]
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-6 23:23:07 | 显示全部楼层
最后一个是:编号3
出列顺序:[2, 5, 8, 1, 6, 0, 7, 4, 9, 3]
程序:
L = []
for x in range(0, 10):
    L.append(x)

L1 = []
L2 = []
times = 0
while (len(L) > 0):
    for x in range(0,len(L)):
        if ((x+1) % 3 + times) % 3 > 0:
            L1.append(L[x])
        else:
            L2.append(L[x])
    times = (len(L)+times) % 3
    L = []
    L = L1
    L1 = []
print(L2)   
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 00:02:37 | 显示全部楼层
  1. ysf = [0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]*100
  2. while ysf:
  3.     print(ysf[2])
  4.     new = ysf[2:]
  5.     new1 = []
  6.     while new:
  7.         p = new.pop(0)
  8.         if p!=ysf[2]:
  9.             new1.append(p)
  10.     ysf=new1
复制代码

2
5
8
6
1
4
7
3
9
0

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-7 11:56:42 | 显示全部楼层
#初始化列表
list1 = []
for each in range(0,10):
    list1.append(each)

#每次调用pop函数计数
count = 0

def main():
    global count
    global list1

    #用于过渡的中间列表
    list2 = []

    while True:
        temp = list1.pop(0)
        count += 1
        if len(list1) == 1:  #标识到达列表最后一个
            list2.append(list1[0])
            break
        else:
            if count % 3 != 0: #将没有数到3的放到过渡列表里面
                list2.append(temp)
            
    #倒序报数
    list2.reverse()
    #传回给list1,用于递归
    list1 = list2
    #去除倒序而导致最后一个元素连续计数的误差
    count -= 1   
    #递归
    if len(list1) == 1:
        print(list1[0])   
    else:
        main()                         

if __name__ == "__main__":
    main()

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-7 13:45:37 | 显示全部楼层
  1. L=list(range(10))
  2. z=2
  3. while len(L)!=1:
  4.     n=len(L)   
  5.     for i in range(n):
  6.         if i%3==z:
  7.             L[i]=-1
  8.     while -1 in L:
  9.         L.remove(-1)
  10.     L=L[::-1]
  11.     if n%3==2:
  12.         z=1
  13. print(L[0])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 10:22:10 | 显示全部楼层
list = [0,1,2,3,4,5,6,7,8,9]
lenresult = len(list)//3
k=2
n=0
newlist = [0,1,2,3,4,5,6,7,8,9]
while(len(list)>1):
    for i in range(lenresult):
        newlist.remove(list[3*i+k])
    n = (len(list)+n)%3
    list = newlist[:]
    k = 2-n
    lenresult = (len(list)+n)//3
print('最后留下来的数字是:',newlist)

最后留下来的数字是: [3]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 14:53:14 | 显示全部楼层
本帖最后由 天圆突破 于 2018-2-8 14:57 编辑
  1. def cy(u=10, m=3):
  2.     lst = [i for i in range(u)]
  3.     n = 0
  4.     while True:
  5.         if len(lst) == 1:
  6.             break
  7.         else:
  8.             i = 0
  9.             flag = list()
  10.             while True:
  11.                 if n == m - 1:
  12.                     flag.append(lst[i])
  13.                     n = 0
  14.                 else:
  15.                     n += 1
  16.                 i += 1
  17.                 if i == len(lst) - 1:
  18.                     for j in flag:
  19.                         lst.remove(j)
  20.                     lst.reverse()
  21.                     break
  22.     return lst[0]


  23. if __name__ == '__main__':
  24.     print(cy())
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-8 14:54:50 | 显示全部楼层
def Joseph(n ,step):
        global count
        del_list = []
        print(n)
        if len(n) == 1:
                return n[0]
        else:
                for i in n:
                        count += 1
                        #加入需要删除的元素
                        if count % step == 0:
                                del_list.append(i)
                       
                        #末尾数需要删除时,为reverse()重新计数最准备
                        if count % step == 0 and i == n[len(n)-1]:
                                count +=1
                       
                        #迭代完之后统一删除,否则会出现问题
                        if i == n[len(n)-1]:
                                if len(del_list):
                                        for j in del_list:
                                                n.remove(j)
                       
                       
                       
                count -=1
                n.reverse()
                Joseph(n ,step)


count = 0
list1 = [0,1,2,3,4,5,6,7,8,9]

Joseph(list1 , 6)
#print(Joseph(list1 , 6))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 14:58:46 From FishC Mobile | 显示全部楼层
我怎么看不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 12:27:58 | 显示全部楼层
请楼主不要设置仅作者可见。。。
又说要:请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。。。
又看不到其他鱼油的解答。。如何学习提高。。

点评

先独立做题,一段时间后会公开大家的答案。  发表于 2018-2-10 19:29
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-10 16:54:40 | 显示全部楼层
  1. def CountNum(nums,m):
  2.     length = len(nums)
  3.     count = 1
  4.     while length > 1:
  5.         i = 0
  6.         while i < length:
  7.             if count == m:
  8.                 del nums[i]
  9.                 length = len(nums)
  10.                 count = 0
  11.                 i -= 1
  12.             else:
  13.                 count += 1
  14.                 i += 1
  15.         nums.reverse()
  16.         if count > 1:
  17.             count -= 1
  18.         length = len(nums)

  19.     return nums[0]

  20. a = [i for i in range(10)]
  21. b = CountNum(a,3)
  22. print(b)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-13 20:47:06 | 显示全部楼层
  1. array = list(range(10))
  2. count = 1
  3. index = 0
  4. direction = True
  5. while len(array):
  6.     if count == 3:
  7.         print(array[index])
  8.         array.remove(array[index])
  9.         if direction:
  10.             index -= 1
  11.         else:
  12.             index += 1
  13.         count = 0
  14.     count += 1
  15.     if index >= len(array)-1:
  16.         direction = False
  17.     if index == 0:
  18.         direction = True
  19.         
  20.     if direction :
  21.         index += 1
  22.     else:
  23.         index -= 1
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-6 12:42:59 From FishC Mobile | 显示全部楼层
xl=list(range(-1,10))#生成-1到9,减少代码,以内存换代码简洁
xl=(xl[:]+xl[::-1][1:9])*10#重复正序加逆序10次,因为剔除10次,逆序即反向计数
for i in range(10):
    xl=[i for i in xl if i!=xl[0]][2:]#剔除与首位一致的数字,并取第三位
    print(xl[0])
哇,这是我觉得我写的最好一次!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-6 12:45:40 From FishC Mobile | 显示全部楼层
jerryxjr1220 发表于 2018-2-7 00:02
2
5
8

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

使用道具 举报

发表于 2018-5-9 11:28:26 | 显示全部楼层
list1 = [i for i in range(4)]
num = 1
i = 0
#print(list1)
while len(list1) > 1:
    num += 1  
    if i >= len(list1) - 1:
        list1.reverse()
        i = 0
    i += 1
    if num == 3:
        num = 1
        print("i:",i)
        print("list1[i]:",list1[i])
        list1.remove(list1[i])
    print(list1)
    #break
list1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-11 16:44:35 | 显示全部楼层
本帖最后由 咕咕鸡鸽鸽 于 2019-4-11 16:51 编辑
  1. def fun149(n,k,m):
  2.     n_list = list(range(1,n+1))
  3.     m_list = list(range(1,m+1))
  4.     i = k - 1
  5.     j = 0
  6.    
  7.     while len(n_list) > 2:
  8.         print("编号{}报数:{}".format(n_list[i],m_list[j]))
  9.         #判断出列
  10.         if m_list[j] == m:
  11.             print("编号{}出列\n".format(n_list.pop(i)))
  12.             i -= 1
  13.             j = -1
  14.         #尾数反转
  15.         if i == len(n_list) - 1:
  16.             n_list = n_list[::-1]
  17.             i = 0
  18.         i += 1
  19.         j += 1
  20.     #判断获胜
  21.     else:
  22.         print("编号{}获胜".format(n_list[0]))


  23. fun149(10,6,3)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 01:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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