Nim game

You are encouraged to solve this task according to the task description, using any language you may know.
Nim is a simple game where the second player ─── if they know the trick ─── will always win.



The game has only 3 rules:

   start with   12   tokens
   each player takes   1,  2,  or  3   tokens in turn
  the player who takes the last token wins.


To win every time,   the second player simply takes 4 minus the number the first player took.   So if the first player takes 1,   the second takes 3 ─── if the first player takes 2,   the second should take 2 ─── and if the first player takes 3,   the second player will take 1.



Task

Design a simple Nim game where the human player goes first, and the computer always wins. The game should enforce the rules.




import Data.Char (isDigit, digitToInt)
import System.IO
 
prompt :: String
prompt = "How many do you take? 1, 2 or 3? "
 
getPlayerSelection :: IO Int
getPlayerSelection = do 
  hSetBuffering stdin NoBuffering
  c <- getChar
  putChar '\n'
  if isDigit c && digitToInt c <= 3 then 
    pure (digitToInt c)
  else do
    putStrLn "Invalid input"
    putStr prompt
    getPlayerSelection
 
play :: Int -> IO ()
play n = do
  putStrLn $ show n ++ token n ++ " remain."
  if n == 0 then putStrLn "Computer Wins!" 
  else do
    putStr prompt
    playerSelection <- getPlayerSelection
    let computerSelection
          | playerSelection > 4 = playerSelection - 4
          | otherwise = 4 - playerSelection
    putStrLn $ "Computer takes " ++ show computerSelection ++ token computerSelection ++ ".\n"
    play (n - computerSelection - playerSelection)
  where token 1 = " token"
        token _ = " tokens"
 
main :: IO ()
main = play 12