Compare commits

...
Sign in to create a new pull request.

6 commits

4 changed files with 30 additions and 5 deletions

View file

@ -39,7 +39,4 @@ toChord = fromJust . mapM toPitch . words
-- | Prompt for a target and use guessTest to try to guess it.
main :: IO ()
main = do
putStr "Target chord (3 pitches separated by spaces): "
hFlush stdout
text <- getLine
guessTest $ toChord text
putStr $ show avgGuesses

View file

@ -54,6 +54,7 @@ module Proj2
GameState,
initialGuess,
nextGuess,
avgGuesses,
)
where
@ -250,3 +251,22 @@ allChords =
| note <- [minBound .. maxBound],
octave <- [minBound .. maxBound]
]
-- ==== TESTING ===============================================================
guessTest :: [Pitch] -> Int
guessTest target = loop target guess other 1
where
(guess, other) = initialGuess
loop :: [Pitch] -> [Pitch] -> GameState -> Int -> Int
loop target guess other guesses
| answer == (3, 0, 0) = guesses
| otherwise = loop target guess' other' (guesses + 1)
where
answer = feedback target guess
(guess', other') = nextGuess (guess, other) answer
avgGuesses = fromIntegral (sum results) / fromIntegral (length results)
where
results = map guessTest allChords

View file

@ -1,4 +1,12 @@
# Spec
## Best first guess
### All different
[C1, D2, E3]: 4.27
[A1, D2, G3]: 4.25
### Same notes
[D1, D2, D3]: 4.80
### Same octaves
[C2, D2, E2]: 4.34
## Tips to improve `nextGuess`
The best results can be had by carefully choosing each guess so that it is most
likely to leave a small remaining list of possible targets. You can do this by

View file

@ -12,4 +12,4 @@ build:
# run musician
run:
./target/{{exec}}
time ./target/{{exec}}