楼主:
ddavid (谎言接线生)
2020-07-06 16:03:28※ 引述《hodwaylin (aaboy)》之铭言:
: Hi 各位python 高手们
: 最近在自学python, 请教下面这游戏题目
: 可否有大大愿意分享一下 这题要如何写出简洁的python 语法 供小弟练习参考用
: 感恩喔
: https://i.imgur.com/UeEZHYz.jpg
: https://i.imgur.com/uGLFK5E.jpg
: https://i.imgur.com/Q0GqzhW.jpg
虽然怎么看都是作业题,不过今天我想到某个有趣的事情,所以写了这东西:
def func(n,m,k):return (a:=[*range(1,n+1)],(i:=0),[(a:=a[:(i:=(i+m-1)%
((n:=n-1)+1))]+a[i+1:],i,a[i%n]) for x in range(k)])[-1][-1][-1]
请全部缩成一行才会正确。然后这Code限定Python 3.8以后版本才跑得动。保证
简洁,一行就能完成。
>>> func(5,2,2)
5
>>> func(5,2,4)
3
>>> func(5,3,4)
4
最可怕的是改一下还可以trace每一步骤的状况。
def func(n,m,k):return (b:=(a:=[*range(1,n+1)],(i:=0),[(a:=a[:(i:=(i+m-1)%
((n:=n-1)+1))]+a[i+1:],i,a[i%n]) for x in range(k)])[-1],[(x[0],x[2])
for x in b])[-1]
同样请缩成一行。
>>> func(5,2,2)
[([1, 3, 4, 5], 3), ([1, 3, 5], 5)]
>>> func(5,2,4)
[([1, 3, 4, 5], 3), ([1, 3, 5], 5), ([3, 5], 3), ([3], 3)]
>>> func(5,3,4)
[([1, 2, 4, 5], 4), ([2, 4, 5], 2), ([2, 4], 2), ([4], 4)]
结果是个list,其中每一个元素都是(list, int),前面的list表示每一步后剩
下的编号,后面的int表示该步后的幸运者。
结论是list comprehension + walrus operator有够变态。不少人认为walrus
operator会成为乱源不是没有道理的XDDD