all_cards = { rooms = ['Library' 'Kitchen' 'Conservatory'] suspects = ['White' 'Green' 'Scarlett'] weapons = ['Rope' 'Lead_Pipe' 'Knife'] } is_ready_to_solve <(map) -> bool> = fn |cards| { ((length cards:suspects) == 1) && ((length cards:rooms) == 1) && ((length cards:weapons) == 1) } take_turn <(map str str) -> map> = fn |cards opponent_card current_room| { cards = (remove_card opponent_card cards) cards = (make_guess current_room cards) cards } remove_card <(map str) -> map> = fn |cards opponent_card| { cards:rooms -= opponent_card cards:suspects -= opponent_card cards:weapons -= opponent_card cards } make_guess <(map str)> = fn |cards current_room| { if (is_ready_to_solve cards) { (output 'It was ' + cards:suspects:0 + ' in the ' + cards:rooms:0 + ' with the ' + cards:weapons:0 + '!') } else { (output 'I accuse ' + (random cards:suspects) + ' in the ' + current_room + ' with the ' + (random cards:weapons) + '.') } cards } all_cards -> (take_turn 'Rope' 'Kitchen') -> (take_turn 'Library' 'Kitchen') -> (take_turn 'Conservatory' 'Kitchen') -> (take_turn 'White' 'Kitchen') -> (take_turn 'Green' 'Kitchen') -> (take_turn 'Knife' 'Kitchen')