鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 冬雪雪冬

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

[复制链接]
发表于 2018-7-5 21:13:12 | 显示全部楼层
拉了盏灯 发表于 2018-7-4 17:57
啊啊啊,3.6.5的切片性质好奇怪,搞了半天才弄懂。

其实最后一个print少了个缩进。后面才发现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-5 21:20:28 | 显示全部楼层
我的程序:
  1. def fun(n):
  2.     cards1 = [str(i) for i in range(1, n + 1)]
  3.     cards2 = cards1[:]
  4.     count = 1
  5.     while True:
  6.         cards2 = [[cards2[i], cards2[i + n // 2]] for i in range(n // 2)]
  7.         cards2 = sum(cards2, [])
  8.         print(', '.join(cards2))
  9.         if cards2 == cards1:
  10.             break
  11.         count += 1
  12.     print('总的洗牌次数为%d'%count)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-5 22:01:31 | 显示全部楼层

第一个好像没有按要求洗牌啊,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-7-5 22:52:04 | 显示全部楼层
本帖最后由 久疤K 于 2018-7-5 22:54 编辑
塔利班 发表于 2018-7-5 22:01
第一个好像没有按要求洗牌啊,,,


你别说,还真是。。。年轻就是好
  1. def change( k, n2 ):
  2.     return n2+k//2 if k%2 else k//2
  3. '''
  4. 获取次数并显示每次的排序
  5. '''
  6. def fun( n ):
  7.     r = s = list(x+1 for x in range(n))
  8.     c = 0
  9.     n2 = n//2
  10.     while True:
  11.         c += 1
  12.         s = [s[change(i,n2)] for i in range(n)]
  13.         print(s)
  14.         if s==r:
  15.             print("总次数: ",c)
  16.             return c

  17. '''
  18. 只获取次数
  19. '''
  20. def get_n( n ):
  21.     c = 0
  22.     t = 1
  23.     n2 = n//2
  24.     while True:
  25.         c += 1
  26.         t = t*2 if t < n2 else t*2-n+1
  27.         if t==1:
  28.             return c

  29. def main():
  30.     n = 6
  31.     fun( n )
  32.     get_n( n )

  33. if __name__ == "__main__":
  34.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-6 10:28:28 | 显示全部楼层
def wash(card, card_new=None, num = 0):
    count_len = len(card)
    count = 0
    if card_new is None:
        card_new = []
        wash_1 = card[:int(len(card) / 2)]
        wash_2 = card[int(len(card) / 2):]
    else:
        wash_1 = card_new[:int(len(card) / 2)]
        wash_2 = card_new[int(len(card) / 2):]
        card_new = []
    for i in zip(wash_1, wash_2):
        card_new.append(i[0])
        card_new.append(i[1])
    print(card_new)
    for i in zip(card, card_new):
        if i[0] == i[1]:
            count += 1
    if count == count_len:
        num += 1
        return num
    else:
        num += 1
        return wash(card, card_new, num)

card = [1, 2, 3, 4, 5, 6]
result = wash(card)
print('洗牌%d次' % result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-8 15:49:02 | 显示全部楼层
  1. def fun(ls):
  2.     n = len(ls) // 2
  3.     before_ls = ls
  4.     count = 1
  5.     while True:
  6.         after_ls = []
  7.         for i in range(n):
  8.             after_ls.append(before_ls[i])
  9.             after_ls.append(before_ls[i + n])
  10.         if after_ls == ls:
  11.             print(after_ls)
  12.             print("总共洗了%d次" % count)
  13.             break
  14.         else:
  15.             print(after_ls)
  16.             count += 1
  17.             before_ls  = after_ls
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-8 19:10:28 | 显示全部楼层
a = [1, 4, 2, 5, 3, 6,'j','q','k','a']
b = []
c = a.copy()

count = 0
def sort(a):
    for i in range(len(a)):
        if i%2 == 0:
             b.append(a[0])
             a.pop(0)
        else:
            b.append(a[len(a)//2])
            a.pop(len(a)//2)
        
while True:
    sort(a)
    print("洗:",b,"\n原:",c)
    count += 1
    if b == c:
        break
    else:
        a = b.copy()
        b = []
   
print("总洗牌数为",count)
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-9 01:19:15 | 显示全部楼层
def wash(x):
    if x%2==0:
        list1=[]
        for i in range(1,x+1):
            list1.append(i)
        print('初始牌为',list1)
        a=[]
        b=[]
        c=[]
        d=0
        e=0
        f=0
        a=list1[:x//2]
        b=list1[x//2:]
        print('a初始列表为',a)
        print('b初始列表为',b)
        while c!=list1:
            c=[]

            #形成新牌
            for e in range(0,x//2):
                c.append(a[e])
                c.append(b[e])
            print(c)

            #再次分牌
            a=c[:x//2]
            b=c[x//2:]
            f+=1
        print('总共洗牌次数',f)
    else:
        print('应输入偶数')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-9 01:20:19 | 显示全部楼层
def wash(x):
    if x%2==0:
        list1=[]
        for i in range(1,x+1):
            list1.append(i)
        print('初始牌为',list1)
        a=[]
        b=[]
        c=[]
        d=0
        e=0
        f=0
        a=list1[:x//2]
        b=list1[x//2:]
        print('a初始列表为',a)
        print('b初始列表为',b)
        while c!=list1:
            c=[]

            #形成新牌
            for e in range(0,x//2):
                c.append(a[e])
                c.append(b[e])
            print(c)

            #再次分牌
            a=c[:x//2]
            b=c[x//2:]
            f+=1
        print('总共洗牌次数',f)
    else:
        print('应输入偶数')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-10 16:24:39 | 显示全部楼层
def wash(old_list):
    n = len(old_list)
    list1, list2, new_list = old_list[:n//2], old_list[n//2:], []
    for i in range(n//2):
        new_list.append(list1[i])
        new_list.append(list2[i])
    print(new_list)
    return new_list


def poker(n):
    poker_list, count = [x+1 for x in range(n)], 1
    temp_list = wash(poker_list)
    while temp_list != poker_list:
        temp_list = wash(temp_list)
        count += 1
    print('总的洗牌次数为%d' % count)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-11 15:12:56 | 显示全部楼层
过期了继续参与

  1. list1 = list(str(input('输入任意牌面:')))

  2. mid = int(len(list1) / 2)
  3. x = 0
  4. list5 = list1
  5. list4 = []
  6. while list1 != list4:
  7.     list2 = list5[:mid]
  8.     list3 = list5[mid:]
  9.     list4 = []
  10.    
  11.     #平分牌量后将两部分平分的牌按顺序依次加入新合成的牌面中
  12.     for i in range(len(list2)):
  13.         list4.append(list2[i])
  14.         list4.append(list3[i])

  15.     #单数张牌面需每次额外加上最后一张
  16.     if len(list1) / 2 > len(list1) // 2:
  17.         list4.append(list3[i+1])
  18.     print(list4)

  19.     #将待洗牌的牌面替换为现牌面
  20.     list5 = list4

  21.     #计数
  22.     x += 1
  23. print('总的洗牌次数为%d' %x)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-11 15:26:13 | 显示全部楼层
罗同学 发表于 2018-7-4 13:11
代码如下,由于能力有限,没有考虑花色及JKQ牌,全部用数字代替牌,一副牌不算大小王的话,52张通过8次洗牌 ...

嗯,写好代码试了一下之后52张牌确实洗8次就复原了,但是加上大小王的话54张牌就需要洗52次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-11 21:13:03 | 显示全部楼层
#题:将纸牌均分两半交叉混合,循环动作致新纸牌顺序与原来一致。
#思路:将原纸牌看成集合list0,均分两半成集合list1和list2,然后再将他们的元素添加到
#          新空列表list3中,得到list3
#          再将list0赋值为list3,循环洗牌,直到list3等于原来列表 break


def fun(n):
       
        count = 1
        list0 = [x for x in range(1,n+1)]
       
        while True:
                list3 = []
                list1 = list0[0:int(n/2)]
                list2 = list0[int(n/2):n]
               
                for i in range(int(n/2)): # 进行 n/2 次pop()尾删和append()添加元素
                        a = list2.pop()
                        list3.append(a)
                        b = list1.pop()
                        list3.append(b)
                               
                list3.reverse() #因为上面是从后删然后添加,所以与原来顺序倒转
                print("第" + str(count) + "次洗牌结果:" + str(list3))
               
                list0 = list3  
               
                if list3 == [x for x in range(1,n+1)]:
                        break
                count += 1
        print("扑克洗牌次数:",count)
                                       
gg = fun(12)
print(gg)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-11 21:24:16 | 显示全部楼层
  1. def fun181(x):
  2.     list_x = x.split(',')
  3.     list_1 = list_x[:(len(list_x)//2)]
  4.     list_2 = list_x[(len(list_x)//2):]
  5.     list_new = []
  6.     count = 0
  7.     while True:
  8.         count += 1
  9.         for i in range(len(list_1)):
  10.             list_new.extend([list_1[i],list_2[i]])
  11.         print(','.join(list_new))
  12.         if list_new == list_x:
  13.             break
  14.         list_1 = list_new[:(len(list_new)//2)]
  15.         list_2 = list_new[(len(list_new)//2):]
  16.         list_new = []
  17.     print('总的洗牌次数为%s'%(count))

  18. if __name__ == '__main__':
  19.     x = input('请输入一个牌数为偶数的牌组:')
  20.     while len(x.split(','))%2 != 0:
  21.         x = input('牌数为奇数,请输入一个牌数为偶数的牌组:')
  22.     fun181(x)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-17 17:08:06 | 显示全部楼层
  1. def shuffle(n):
  2.     if n % 2 == 0:
  3.         l1 = [i + 1 for i in range(n)]
  4.         h = round(n / 2)

  5.         tmp1 = [l1]
  6.         tmp = []
  7.         d = 0
  8.         while True:
  9.             lf = tmp1[d][:h]
  10.             lb = tmp1[d][h:]
  11.             for i in range(h):
  12.                 tmp.append(lf[i])
  13.                 tmp.append(lb[i])
  14.             tmp1.append(tmp)
  15.             tmp = []
  16.             d += 1
  17.             if tmp1[d] == l1:
  18.                 break

  19.         for each in tmp1[1:]:
  20.             print(each)
  21.         print("总的洗牌次数为:%d" % (len(tmp1)-1))
  22.     else:
  23.         print("请输入偶数!")


  24. shuffle(52)
复制代码


结果:
[1, 27, 2, 28, 3, 29, 4, 30, 5, 31, 6, 32, 7, 33, 8, 34, 9, 35, 10, 36, 11, 37, 12, 38, 13, 39, 14, 40, 15, 41, 16, 42, 17, 43, 18, 44, 19, 45, 20, 46, 21, 47, 22, 48, 23, 49, 24, 50, 25, 51, 26, 52]
[1, 14, 27, 40, 2, 15, 28, 41, 3, 16, 29, 42, 4, 17, 30, 43, 5, 18, 31, 44, 6, 19, 32, 45, 7, 20, 33, 46, 8, 21, 34, 47, 9, 22, 35, 48, 10, 23, 36, 49, 11, 24, 37, 50, 12, 25, 38, 51, 13, 26, 39, 52]
[1, 33, 14, 46, 27, 8, 40, 21, 2, 34, 15, 47, 28, 9, 41, 22, 3, 35, 16, 48, 29, 10, 42, 23, 4, 36, 17, 49, 30, 11, 43, 24, 5, 37, 18, 50, 31, 12, 44, 25, 6, 38, 19, 51, 32, 13, 45, 26, 7, 39, 20, 52]
[1, 17, 33, 49, 14, 30, 46, 11, 27, 43, 8, 24, 40, 5, 21, 37, 2, 18, 34, 50, 15, 31, 47, 12, 28, 44, 9, 25, 41, 6, 22, 38, 3, 19, 35, 51, 16, 32, 48, 13, 29, 45, 10, 26, 42, 7, 23, 39, 4, 20, 36, 52]
[1, 9, 17, 25, 33, 41, 49, 6, 14, 22, 30, 38, 46, 3, 11, 19, 27, 35, 43, 51, 8, 16, 24, 32, 40, 48, 5, 13, 21, 29, 37, 45, 2, 10, 18, 26, 34, 42, 50, 7, 15, 23, 31, 39, 47, 4, 12, 20, 28, 36, 44, 52]
[1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52]
总的洗牌次数为:8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 22:22:49 | 显示全部楼层
根据题目直译
  1. def fun(n):
  2.     aim = lst = list(range(1, n+1))
  3.     temp = []
  4.     count = 0
  5.    
  6.     while temp != aim:
  7.         temp = [j for i in (zip(lst[:n//2], lst[n//2:])) for j in i]
  8.         lst = temp
  9.         count += 1
  10.         print(*temp)
  11.     print("总的洗牌次数为{}".format(count))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-9 15:23:45 | 显示全部楼层
  1. def shuffle(lis):
  2.     n = len(lis)
  3.     lis1 = lis[0 : int(n/2)]
  4.     lis2 = lis[int(n/2) : ]
  5.     m = len(lis1)
  6.     lis3 = []
  7.     while m:
  8.         lis3.append(lis1[0])
  9.         lis3.append(lis2[0])
  10.         del(lis1[0])
  11.         del(lis2[0])
  12.         m -= 1
  13.     return lis3
  14. lis = eval(input("请输入一列整数数组:\n"))
  15. flag = 0
  16. temp = lis
  17. while shuffle(temp) != lis:
  18.     flag += 1
  19.     temp = shuffle(temp)
  20.     print(temp)
  21. print(temp)
  22. flag += 1
  23. print("总的洗牌次数为%d" % flag)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-1 16:47:12 | 显示全部楼层
  1. def fun_181(list1):
  2.     def convert(i,j):
  3.         nonlocal list1
  4.         while i<length:
  5.             list1[i]=list2[j]
  6.             i,j=i+2,j+1
  7.     times,length,list3=0,len(list1),list1[:]
  8.     while True:
  9.         list2=list1[:]
  10.         if length%2==0:
  11.             convert(0,0)
  12.             convert(1,length//2)
  13.             print(list1)
  14.             times+=1
  15.         if list1==list3:
  16.             print('总的洗牌次数为%d'%times)
  17.             break
  18. fun_181([1,2,3,4,5,6])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-5 08:46:50 | 显示全部楼层
  1. def shuffleCard(cardList):
  2.     original = cardList
  3.     cards = len(cardList)
  4.     print('CARDS:', cardList)
  5.     if cards%2 != 0:
  6.         print('Can not Shuffle!')
  7.     else:
  8.         count = 1
  9.         newCardList = []
  10.         while newCardList != cardList:
  11.             for i in range(cards//2):
  12.                 newCardList.append(cardList[i])
  13.                 newCardList.append(cardList[i+cards//2])
  14.             print(count, newCardList)
  15.             count += 1
  16.             cardList = newCardList
  17.             if cardList != original:
  18.                 newCardList = []
  19.             else:
  20.                 break

  21. cardvalue = ('A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K')  # 牌面点数
  22. cardstyle = ('&#9824;', '&#9827;', '&#9829;', '◇')  # 牌面花色
  23. cards = []
  24. for style in cardstyle:
  25.     for value in cardvalue[:4]:
  26.         cards.append(style+value)

  27. shuffleCard(cards)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-7 16:02:53 | 显示全部楼层
  1. def test181(num):
  2.     def repuke(thislist, timenum=1):
  3.         newlist = []
  4.         for i in range(num // 2):
  5.             newlist.append(thislist[i])
  6.             newlist.append(thislist[i + num // 2])
  7.         print('第%d次:' % timenum, newlist)
  8.         if newlist != list1:
  9.             return repuke(newlist, timenum + 1)
  10.         return '总的洗牌次数为%d' % timenum

  11.     list1 = [i + 1 for i in range(num)]
  12.     print(repuke(list1))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 19:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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