From 91a65cdb60dcaacb051e2457910f424f84fee864 Mon Sep 17 00:00:00 2001 From: wi11-holdsworth <83637728+wi11-holdsworth@users.noreply.github.com> Date: Fri, 3 Oct 2025 12:58:05 +1000 Subject: [PATCH] feat: initial minimax implementation (quite slow!) --- Proj2.hs | 18 ++++++++++++++++-- guesses.txt | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 guesses.txt diff --git a/Proj2.hs b/Proj2.hs index d4b01f8..af2e64d 100644 --- a/Proj2.hs +++ b/Proj2.hs @@ -49,8 +49,10 @@ module Proj2 where import Data.List +import Data.Ord (comparing) import Data.Set qualified as S import Debug.Trace +import Text.XHtml (target) -- ==== DATA STRUCTURES ======================================================= @@ -174,10 +176,22 @@ initialGuess = (bestFirstGuess, allChords) -- 2. TODO: mini-max? -- nextGuess :: ([Pitch], GameState) -> (Int, Int, Int) -> ([Pitch], GameState) +-- nextGuess (prevGuess, chords) answer | trace ("calling nextGuess with: " ++ show prevGuess ++ show chords ++ show answer) False = undefined nextGuess (prevGuess, chords) answer = (guess, consistentChords) where - guess : consistentChords = filter consistentWithAnswer chords - consistentWithAnswer chord = answer == feedback prevGuess chord + consistentChords = filter (consistentWith answer) chords + scoredGuesses = map (\x -> (x, averageNumTargets x)) consistentChords + guess = fst $ minimumBy (comparing snd) scoredGuesses + + -- helper functions + consistentWith answer chord = answer == feedback prevGuess chord + averageNumTargets answer = map (`squaredFreqs` consistentChords) consistentChords + squaredFreqs answer = map ((^ 2) . length) . group . sort . map (feedback answer) + averageFreqs answer chords = sum freqs `div` length freqs + where + freqs = squaredFreqs answer chords + +-- TODO: implement me -- ==== HELPER FUNCTIONS ====================================================== diff --git a/guesses.txt b/guesses.txt new file mode 100644 index 0000000..0972f4a --- /dev/null +++ b/guesses.txt @@ -0,0 +1 @@ +[[""A1"","A3","B2"],["A1","B2","B3"],["A1","B2","D3"],["A1","B2","E3"],["A1","B2","F3"],["A1","B2","G3"],["A1","C2","C3"],["A1","C3","D2"],["A1","C3","E2"],["A1","C3","F2"],["A1","C3","G2"],["B1","B2","C3"],["B2","C1","C3"],["B2","C3","D1"],["B2","C3","E1"],["B2","C3","F1"],["B2","C3","G1"]]