看板 Python 關於我們 聯絡資訊
※ 引述《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