作者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://www.ptt.cc/bbs/Python/M.1594022612.A.D0A.html
※ 編輯: ddavid (1.169.77.203 臺灣), 07/06/2020 16:04:20
推 max36067: 水哦 有夠簡潔 07/06 19:38
→ OrzOGC: 看到這種我都很頭痛...QQ 07/06 20:17
→ as30385438: 這個code review大概不會過 07/06 22:12
推 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
推 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
推 bugbug777: 海象可愛 07/07 14:05
※ 編輯: ddavid (1.169.77.203 臺灣), 07/07/2020 18:34:21
→ s860134: 海象這種東西個人只會在 判斷式用, e.g. re.match 07/08 01:06
推 HYDE1986: 也太簡潔XDDDDD 07/08 10:41
其實我仔細回頭審視,發現好像還有一兩個小地方寫法是相對累贅,應該還能再
精簡一點XD
※ 編輯: ddavid (1.169.77.203 臺灣), 07/08/2020 16:26:46