1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
(*
monopoly.ml
Source: Adapté d'un problème posé lors de la première phase des
Olympiades Brésiliennes d'Informatique 2006, niveau Programmation 1.
Description: Le monopoly est un des jeux les plus populaires au
monde. Lors d'une partie, les joueurs peuvent acheter, vendre ou
louer des propriétés. Trois amis (Daniel, Etienne et François)
veulent jouer au Monopoly, mais les billets ont été cachés par la
petite soeur de Daniel. Ils tiennent leur comptes sur une feuille de
papier. Écrivez un programme pour calculer le montant final du
compte de chaque joueur.
Entrée: L'entrée est lue du dispositif standard et est composé d'un
jeu de test. Un jeu de test est constitué par une première ligne
qui contient deux nombres entiers, I e N. I représente le montant
initial de chaque joueur. N représente le nombre d'opérations.
Après cette première ligne, suivent N lignes; chacune de ces lignes
décrit une opération et possède une des trois formes suivantes
Achat: La lettre A, suivie de la lettre initiale d'un des joueurs J,
et d'un nombre entier X, qui représente la valeur payée par le
joueur J pour cet achat. Vente: La lettre V, suivie de la lettre
initiale d'un des joueurs J, et d'un nombre entier X, qui représente
la valeur reçue par le joueur J pour cette vente. Loyer: La lettre
L, suivie de la lettre initiale d'un des joueurs J qui perçoit le
loyer, suivie de la lettre initiale d'un des joueurs, qui paye le
loyer, et d'un nombre entier X, qui représente le montant du loyer.
Toutes les valeurs intermédiaires sont dans l'intervalle
[0;1_000_000]
Sortie: Le programme doit imprimer sur le dispositif standard de
sortie le montant de chaque joueur à la fin de la partie.
Exemple d'entrée:
10000 5
A D 5000
A E 3000
L D F 1000
V E 4000
L F E 1000
Sortie correspondante:
6000 10000 10000
*)
let update_values (values : int * int * int) (j : char) (amount: int) =
match values, j with
(d, e, f), 'D' -> (d + amount, e, f)
| (d, e, f), 'E' -> (d, e + amount, f)
| (d, e, f), 'F' -> (d, e, f + amount)
let print_values =
function (d, e, f) ->
print_string
((string_of_int d) ^ " " ^
(string_of_int e) ^ " " ^
(string_of_int f) ^ "\n")
let rec process (values: int * int * int) (n : int) =
if n = 0 then
print_values values
else
Scanf.bscanf Scanf.Scanning.stdib "%c "
(fun action ->
match action with
'A' ->
Scanf.bscanf Scanf.Scanning.stdib "%c %i\n"
(fun player amount ->
process (update_values values player (~- amount)) (n - 1))
| 'V' ->
Scanf.bscanf Scanf.Scanning.stdib "%c %i\n"
(fun player amount ->
process (update_values values player amount) (n - 1))
| 'L' ->
Scanf.bscanf Scanf.Scanning.stdib "%c %c %i\n"
(fun receives pays amount ->
process (update_values
(update_values values receives amount)
pays (~- amount)) (n - 1)))
let _ =
Scanf.bscanf Scanf.Scanning.stdib "%i %i\n"
(fun value operacoes ->
process (value, value, value) operacoes) |
Partager