我想計算第一個玩家贏得比賽的次數。任何人都可以幫我解決它嗎?
data RPS = Rock | Paper | Scissors deriving (Eq)
beats :: RPS -> RPS
beats rps = case rps of
Rock -> Scissors
Paper -> Rock
Scissors -> Paper
firstBeats :: [RPS] -> [RPS] -> Int
firstBeats (a:ax) (b:bx)
| a==Rock && b==Scissors = 1 (firstBeats ax) : (firstBeats bx)
| a==Scissors && b==Paper = 1 (firstBeats ax) : (firstBeats bx)
| a==Paper && b==Rock = 1 (firstBeats ax) : (firstBeats bx)
| otherwise = (a: firstBeats ax) (b : firstBeats bx)
Examples:
firstBeats [Rock] [Paper] == 0
firstBeats [Rock] [Scissors] == 1
firstBeats [Paper, Scissors] [Rock, Paper] == 2
firstBeats [Paper, Scissors, Paper] [Rock, Paper, Scissors] == 2
firstBeats (replicate 20 Paper) (replicate 20 Rock) == 20
uj5u.com熱心網友回復:
主要問題是它firstBeats需要兩個引數,所以你應該傳遞兩個串列的尾部。此外,您應該涵蓋兩個串列之一或兩者都為空的情況,因此:
firstBeats :: [RPS] -> [RPS] -> Int
firstBeats (a:ax) (b:bx)
| a == Rock && b == Scissors = 1 firstBeats ax bx
| a == Scissors && b == Paper = 1 firstBeats ax bx
| a == Paper && b == Rock = 1 firstBeats ax bx
| otherwise = firstBeats ax bx
firstBeats _ _ = 0
但這并不優雅,需要大量重復。您可以定義一個函式來檢查第一項是否超過了第二項:
hasBeaten :: RPS -> RPS -> Bool
hasBeaten Rock Scissors = True
hasBeaten Scissors Paper = True
hasBeaten Paper Rock = True
hasBeaten _ _ = False
然后您可以將其實作為:
firstBeats :: [RPS] -> [RPS] -> Int
firstBeats (a:as) (b:bs)
| hasBeaten a b = 1 firstBeats ax bx
| otherwise = firstBeats ax bx
firstBeats _ _ = 0
但是造型也不是很好。人們會期望使用RPSs 的 2 元組串列,這樣就不可能傳遞兩個具有不同數量專案的串列。然后是:
firstBeats :: [(RPS, RPS)] -> Int
firstBeats = length . filter (uncurry hasBeaten)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/468448.html
標籤:哈斯克尔
上一篇:有沒有辦法自動通勤單子?
下一篇:python如何處理空白中的迭代
