T: / Corrigés des challenges / TypeScript
Manipulation de données textuelles en TypeScript : dictionnaire, expression régulière, etc.
Pour ce 3ème challenge de Top Code 2025, il fallait découper des chaines de caractères pour pouvoir extraire certaines informations clés, et comparer ces informations clés à un référentiel.
On va donc procéder en 3 grandes phases :
On commence par transformer le tableau travels en un objet qu’on appelle dictionnaire.
L’objectif est de passer de :
["2025-09:Bruxelles", "2025-02:Austin", "2025-08:Bangkok"]
// à
{
"2025-09": "Bruxelles",
"2025-02": "Austin",
"2025-08": "Bangkok",
...
}
Voici comment faire :
const travelMap: Record<string, string> = travels.reduce((acc, travel) => {
const [month, city] = travel.split(':');
acc[month] = city;
return acc;
}, {});
Un peu d’explications :
travelMap sera typé Record<string, string>, c’est un type TypeScript qui précise que c’est un objet dont les clés sont des chaînes (string) et les valeurs aussi.reduce permet de transformer un tableau en une seule valeur. Ici, cette valeur est un objet."2025-09:Bruxelles") qu’on découpe avec la .split(':') pour alors récupérer un tableau (comme ["2025-09", "Bruxelles"]).acc : la clé est le mois ("2025-09"), la valeur est la ville ("Bruxelles").Ce format va être très pratique pour retrouver rapidement une ville selon le mois donné, sans devoir parcourir le tableau à chaque fois.
La première fonction consiste à extraire les informations d’une photo pour pouvoir les manipuler plus efficacement. Comme les photos ont toutes une structure similaire, on peut utiliser une expression régulière (regex). La syntaxe des expressions régulières est assez complexe à maitriser mais plusieurs outils en ligne sont disponibles pour nous aider dans leur conception. A l’usage, c’est plus efficace qu’un enchainement de découpage avec split ou autre.
Voici l’expression régulière utilisée :
/(\d{4}-\d{2})-\d{2}:file_(.+)_(\d+)\.JPG/
Un peu d’explications :
(\d{4}-\d{2}) permet de récupérer la date partielle au format YYYY-MM-\d{2} correspond au jour DD, non récupéré (pas de parenthèses):file_ est une partie fixe de la chaine de caractères(.+) permet de récupérer la ville_(\d+) permet de récupérer le nom de la photo\.JPG est l’extension, échappée, fixe également dans la chaine de caractèresEt intégrée dans une fonction :
function extractPhotoData(photo: string): { date: string; city: string; number: string } | null {
const match = photo.match(/(\d{4}-\d{2})-\d{2}:file_(.+)_(\d+)\.JPG/);
if (!match) return null;
const [, date, city, number] = match;
return { date, city, number };
}
Un peu d’explications :
date, city et numberphotoLa deuxième fonction sert à savoir si une photo est fake ou non
function isTruePhoto(photo: string, travelMap: Record<string, string>): boolean {
const data = extractPhotoData(photo);
if (!data) return false;
return travelMap[data.date] == data.city;
}
Un peu d’explications :
travelMap qui correspond au dictionnaire créé lors de la première étape.photo dans data
travelMap
function findFakePhotos(photos: string[], travelMap: Record<string, string>): string {
let result = "";
for (const photo of photos) {
const data = extractPhotoData(photo);
if (data && !isTruePhoto(photo, travelMap)) {
result += data.number;
}
}
return result;
}
// Exécution
const result = findFakePhotos(photos, travelMap);
console.log(result);
Un peu d’explications :
travelMapresult videphoto de photosresultresultCe challenge met en avant un aspect important de la programmation : savoir découper les informations, puis séquencer intelligemment les opérations.
Dans un flot de données brutes comme des noms de fichiers ou des logs, tout commence par l’extraction rigoureuse des éléments utiles. Ici, l’utilisation d’une expression régulière précise, intégrée dans une fonction dédiée (extractPhotoData), permet de poser une base claire et isolée du reste de la logique.
Ensuite vient la phase d’analyse : on encapsule le raisonnement métier dans une fonction simple (isTruePhoto), ce qui rend le code plus lisible, plus testable, et surtout réutilisable. Enfin, la résolution s’appuie sur un enchaînement logique et lisible, sans jamais mélanger les responsabilités : extraire, évaluer, accumuler.
Other content to discover