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.




let rec player_turn () =
  print_string "How many tokens would you like to take? ";
  let n = read_int_opt () |> Option.value ~default:0 in
  if n >= 1 && n <= 3 then n
  else (
    print_endline "Number must be between 1 and 3";
    player_turn ())
 
let computer_turn tokens = tokens mod 4
 
let plural_suffix = function 1 -> "" | _ -> "s"
 
let turn_report prefix taken tokens =
  Printf.printf "%s %d token%s.\n%d token%s remaining.\n%!" prefix taken
    (plural_suffix taken) tokens (plural_suffix tokens)
 
let rec play_game tokens =
  let player_tokens = player_turn () in
  let tokens = tokens - player_tokens in
  turn_report "You take" player_tokens tokens;
  let computer_tokens = computer_turn tokens in
  let tokens = tokens - computer_tokens in
  turn_report "Computer takes" computer_tokens tokens;
  if tokens = 0 then print_endline "Computer wins!" else play_game tokens
 
let () = play_game 12