Re: [問題] 針對題目 看否幫忙想出簡潔的python 感恩
※ 引述《hodwaylin (aaboy)》之銘言:
: Hi 各位python 高手們
: 最近在自學python, 請教下面這遊戲題目
: 可否有大大願意分享一下 這題要如何寫出簡潔的python 語法 供小弟練習參考用
: 感恩喔
: https://i.imgur.com/UeEZHYz.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
推
07/06 19:38,
3年前
, 1F
07/06 19:38, 1F
→
07/06 20:17,
3年前
, 2F
07/06 20:17, 2F
→
07/06 22:12,
3年前
, 3F
07/06 22:12, 3F
推
07/06 23:20,
3年前
, 4F
07/06 23:20, 4F
其實這裡面就幾個技巧:
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
推
07/07 10:42,
3年前
, 5F
07/07 10:42, 5F
:=是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
推
07/07 14:05,
3年前
, 6F
07/07 14:05, 6F
※ 編輯: ddavid (1.169.77.203 臺灣), 07/07/2020 18:34:21
→
07/08 01:06,
3年前
, 7F
07/08 01:06, 7F
推
07/08 10:41,
3年前
, 8F
07/08 10:41, 8F
其實我仔細回頭審視,發現好像還有一兩個小地方寫法是相對累贅,應該還能再
精簡一點XD
※ 編輯: ddavid (1.169.77.203 臺灣), 07/08/2020 16:26:46
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):