作者ddavid (谎言接线生)
看板Python
标题Re: [问题] 针对题目 看否帮忙想出简洁的python 感恩
时间Mon Jul 6 16:03:28 2020
※ 引述《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
--
「探寻真实与探寻谎言的难度一样,而要忘掉它们的难度也相同,因为你根本无
法预测你探寻到什麽,更无法预测什麽会被你忘掉。也就是说,就机率而言,你脑里
的记忆其实有一半都是骗人的。放心吧,没那一半你反而活不下去的。」
--克尔斯,谎言事务所暂时所长
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.169.77.203 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1594022612.A.D0A.html
※ 编辑: ddavid (1.169.77.203 台湾), 07/06/2020 16:04:20
1F:推 max36067: 水哦 有够简洁 07/06 19:38
2F:→ OrzOGC: 看到这种我都很头痛...QQ 07/06 20:17
3F:→ as30385438: 这个code review大概不会过 07/06 22:12
4F:推 alvinlin: 很简洁但我看不懂。不过谢谢分享。给推 07/06 23:20
其实这里面就几个技巧:
1. 主要就是:=这个3.8的新东西要知道它怎麽拆成不用它的写法。
2. 怎麽用list comprehension来硬当回圈用(副作用是过程都被记录下来了,但反
过来利用这个副作用反而达成trace完整过程的效果),怎麽改写回去for回圈。
3. 有前後依赖性而必须依序执行的工作,利用tuple来组装达成这个顺序。
这三项都了解後,其实排版一下然後按照这三点逆向改写回去就能换成直接看得
懂的东西了XD。不过也不用浪费这个时间就是,这又不是很难的问题,大家正常写也
写得出来,我只是偶然想试:=跟[ for if ]搭配有多邪恶XD
其实应该有某招可以解决2的副作用XD
※ 编辑: ddavid (1.164.176.211 台湾), 07/07/2020 00:07:29
5F:推 benchen0812: 突然有点理解为啥学JAVA的朋友骂我用PYTHON乱源xd 07/07 10:42
:=是3.8才出来的东西啦,而且也很多人反对根本不去使用(我自己其实也不太
去用),是Python之父Guido van Rossum最终决定加入的,他本人也因此风波决定退
出BDFL这决策位置。所以要骂乱源,八成也不会是因为这东西XD
而且要比程式码难看,很依赖缩排的Python可是远远不及C/C++之类天生就不依
赖缩排、而且还有指标的语言呢XD。ioccc大赛(1984)开始时,Python(1991)都
还不存在呢XDDD
※ 编辑: ddavid (1.169.77.203 台湾), 07/07/2020 13:13:35
6F:推 bugbug777: 海象可爱 07/07 14:05
※ 编辑: ddavid (1.169.77.203 台湾), 07/07/2020 18:34:21
7F:→ s860134: 海象这种东西个人只会在 判断式用, e.g. re.match 07/08 01:06
8F:推 HYDE1986: 也太简洁XDDDDD 07/08 10:41
其实我仔细回头审视,发现好像还有一两个小地方写法是相对累赘,应该还能再
精简一点XD
※ 编辑: ddavid (1.169.77.203 台湾), 07/08/2020 16:26:46