Description

Tout le monde sait qu’un parc de dinosaures a besoin d’un troupeau de dinosaures pour être rentable! Votre application doit donc permettre l’action d’ajouter des dinosaures au troupeau du parc!

Chaque dinosaure a besoin de ressources quotidiennement pour survivre. Un dinosaure dont ses besoins en ressources ne sont pas comblés, a comme conséquence de quitter le troupeau pour un monde meilleur: le paradis des dinosaures.

La consommation de ressources par les dinosaures a comme conséquence de retirer ces ressources du garde-manger.

Dans notre parc, c’est la loi de la jungle! Lorsqu’il n’y a pas assez de ressources pour subvenir aux besoins de tous les dinosaures du troupeau, ce sont les plus forts qui ont priorité sur les ressources. De plus, même si un dinosaure n’a pas assez de ressources pour combler tous ses besoins, il va tout de même consommer autant de ressources qu’il peut avant d’aller au paradis.

Les dinosaures arrivent au parc affamés. Leurs besoins en ressources sont donc deux fois plus élevés, mais seulement pour un tour.

Il est très important de vous assurer que tous les dinosaures du troupeau ont un nom unique sinon nos employés peinent à les identifier.

Espèces de dinosaures

Voici une liste des différentes espèces de dinosaures permises dans notre parc, selon leur préférence de consommation:

Consommation Espèce
Herbivore Ankylosaurus
Herbivore Brachiosaurus
Herbivore Diplodocus
Herbivore Stegosaurus
Herbivore Triceratops
Carnivore Allosaurus
Carnivore Megalosaurus
Carnivore Spinosaurus
Carnivore Tyrannosaurus Rex
Carnivore Velociraptor

Force

Dans notre parc, nous encourageons la survie des plus forts. L’eau et la nourriture sont offerts en priorité aux dinosaures les plus forts du troupeau. Si deux dinosaures ont la même force, alors ont détermine le plus fort par ordre croissant de nom. ex: 1=Adam, 2=Bob, 3=Charlie.

Calcul de Force
Poids × T × S

où les valeurs T et S sont calculées comme suit:

  • T = 1.5 si carnivore et 1 si herbivore.
  • S = 1.5 si femelle et 1 si mâle.

:bulb: Exemple 1: Un dinosaure carnivore femelle de 1000 kilogrammes a une force de:

1000 × 1.5 × 1.5 = 1500 × 1.5 = 2250

:bulb: Exemple 2: Deux dinosaures ont une force de 2250. Le premier se nomme Rex et le deuxième se nomme Regex. Le plus fort est Regex car son nom arrive en premier dans l’ordre croissant (g < x).

:warning: Note: Dans les noms de dinosaures, nous demandons de gérer seulement des lettres. Les chiffres et les caractères spéciaux ne seront pas testés. Ne perdez donc pas de temps là-dessus, car la priorité est la qualité du code et non la gestion de ces nombreux cas d’exception.

Besoin de ressources

Le besoin quotidien de ressources des dinosaures est calculé selon les formules suivantes:

Eau

Calcul du besoin quotidien d’eau (en litre)
Poids × 0.60

:warning: Note: La quantité d’eau requise doit être arrondie vers le haut, AU LITRE PRÈS.

:bulb: Exemple: Un dinosaure de 1000 kilogrammes a besoin de:

1000 × 0.60 = 600 litres d’eau.

Nourriture

Calcul du besoin quotidien de nourriture (en unité)
(Poids × C) ÷ 200

où la valeur de C est 0.5 si le dinosaure est herbivore et 0.2 s’il est carnivore.

:warning: Note: La quantité de nourriture requise doit être arrondie vers le haut. Les fractions ne sont pas gérées. Cependant, lorsque vous devez doubler la consommation d’un dinosaure affamé, assurez-vous d’arrondir APRÈS avoir doublé la quantité et non avant. Ex. Un herbivore avec une consommation normale de 12.25 salades par jour, va manger 25 salades losrqu’il est affamé et pas 26!

:bulb: Exemple: Un dinosaure herbivore de 1000 kilogrammes a besoin de:

(1000 × 0.5) ÷ 200 = 500 ÷ 200 = 2.5 = 3 salades.

Conditions de succès

# Description
1 L’action d’ajouter un nouveau dinosaure est exécutée lors du déroulement du tour.
2 Il est possible d’obtenir les informations concernant un dinosaure.
3 Il est possible d’obtenir la liste de tous les dinosaures vivants.
4 Les ressources sont consommées par les dinosaures du plus fort au moins fort.
5 Les ressources consommées ont comme conséquence d’être retirées du garde-manger.
6 Le besoin de ressources des dinosaures est priorisé du plus fort au moins fort.
7 La quantité de ressources requise par un dinosaure est doublée seulement lors du premier tour de son arrivée.
8 Les dinosaures dont leurs besoins quotidiens de ressources ne sont pas comblés, ont comme conséquence d’aller au paradis des dinosaures.
9 Chaque nom de dinosaure est unique. L’ajout d’un dinosaure doit être rejeté si le nom existe déjà.
10 Lorsqu’un même tour contient plusieurs actions d’ajout de dinosaure avec le même nom, seulement la première de ses actions sera exécutée. Les autres seront ignorées sans avertissement.

Déroulement d’un tour

En plus de pouvoir ajouter des ressources, nous pouvons maintenant ajouter un dinosaure!

Actions possibles
Ajouter des ressources.
Ajouter un dinosaure.

:warning: Note: Ces actions sont accumulées et exécutées, en ordre d’arrivée, lors du déroulement du tour.

Nous avons également deux nouvelles conséquences (3 et 4) qui auront lieu à la conclusion de chaque tour:

Conséquences d’un tour (en ordre)
1. Ajouter 10 kilolitres d’eau, 250 salades et 100 hamburgers.
2. Retirer du garde-manger les ressources périmées.
3. Retirer du garde-manger les ressources consommées.
4. Retirer du troupeau les dinosaures qui ont jeûné.

API

:white_check_mark: Ajout de dinosaures

Requête

POST /dinosaurs

{
  "name": ""::string,
  "weight": 0::int,
  "gender": "f" || "m"::string,
  "species": ""::string
}

Réponses

:arrow_right: HTTP 200 OK

:arrow_right: HTTP 400 Bad Request - Quand le nom spécifié du dinosaure existe déjà dans le parc.

{
  "error": "DUPLICATE_NAME"::string,
  "description": "The specified name already exists and must be unique."::string
} 

:arrow_right: HTTP 400 Bad Request - Quand le genre spécifié du dinosaure est invalide.

{
  "error": "INVALID_GENDER"::string,
  "description": "The specified gender must be \"m\" or \"f\"."::string
} 

:arrow_right: HTTP 400 Bad Request - Quand le poids spécifié du dinosaure est négatif ou égal à 0.

{
  "error": "INVALID_WEIGHT"::string,
  "description": "The specified weight must be greater than 0."::string
} 

:arrow_right: HTTP 400 Bad Request - Quand l’espèce du dinosaure ne fait pas partie de notre liste supportée.

{
  "error": "INVALID_SPECIES"::string,
  "description": "The specified species is not supported."::string
} 

:warning: Note: Considérez que nous ne testerons pas un payload qui contient plus qu’une erreur (ex. un poids négatif et un genre invalide).

:white_check_mark: Affichage d’un dinosaure vivant.

Requête

GET /dinosaurs/{NAME}

Réponses

:arrow_right: HTTP 200 Ok


{
  "name": ""::string,
  "weight": 0::int,
  "gender": f || m::string,
  "species": ""::string
}

:arrow_right: HTTP 404 Not Found - Quand le nom du dinosaure recherché n’existe pas.

{
  "error": "NON_EXISTENT_NAME"::string,
  "description": "The specified name does not exist."::string
} 

:white_check_mark: Affichage de tous les dinosaures vivants.

Requête

GET /dinosaurs

Réponse

:arrow_right: HTTP 200 Ok

[
  {
    "name": ""::string,
    "weight": 0::int,
    "gender": "f" || "m"::string,
    "species":""::string
  },
  ...
  {
    "name": ""::string,
    "weight": 0::int,
    "gender": "f" || "m"::string,
    "species": ""::string
  }
]

:warning: Notes

  • Dans toutes les formules, le poids est en kilogramme.
  • Les dinosaures au paradis ne sont plus gérés.
  • Les dinosaures n’ayant pas assez de ressources disponibles pour subvenir à leurs besoins consomment autant de ressources qu’ils peuvent avant d’aller au paradis des dinosaures.

Précisions/Changements

13 septembre: Nouvelle exception DUPLICATE_NAME lors de l’ajout d’un dinosaure dont le nom existe déjà dans le parc. Ajout également du critère d’acceptation #10.