Advertisement
MonsterScripter

CodinGame_2023_08_26__11_31_26__long_lat.js

Aug 26th, 2023
1,084
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Objectif
  3.  * La ville de Montpellier a équipé ses rues de défibrillateurs pour permettre de sauver des victimes d'arrêts cardiaques. Les données correspondant à la position de tous les défibrillateurs sont accessibles en ligne.
  4.  *
  5.  * Sur la base des données fournies dans les tests, vous décidez d'écrire un programme qui permettra aux usagers de trouver le défibrillateur le plus proche de là où ils se trouvent, grâce à leur téléphone portable.
  6.  *
  7.  * Règles
  8.  * En entrée de votre programme sont fournies les données dont vous avez besoin, au format texte. Ces données sont notamment composées de lignes dont chacune représente un défibrillateur. Chaque défibrillateur est représenté par les champs suivants :
  9.  * Numéro identifiant le défibrillateur
  10.  * Nom
  11.  * Adresse
  12.  * Numéro de téléphone à joindre
  13.  * Longitude (en degrés)
  14.  * Latitude (en degrés)
  15.  * Ces champs sont séparés par un point-virgule (;)
  16.  *
  17.  * Attention : les nombres décimaux utilisent la virgule (,) comme séparateur pour la partie décimale. Pensez à transformer la virgule (,) en point (.) si nécessaire pour utiliser les données dans votre programme.
  18.  *
  19.  * DISTANCE
  20.  * La distance d entre deux points A et B sera calculée en utilisant la formule suivante :
  21.  *
  22.  * Note : Dans cette formule, les latitudes et longitu​des sont exprimées en radians. 6371 correspond au rayon de la terre en km.
  23.  *
  24.  * Le programme affichera le nom du défibrillateur se trouvant au plus près de la position de l'utilisateur. Cette position est fournie en entrée au programme.
  25.  *
  26.  * Entrées du jeu :
  27.  *
  28.  * Entrée
  29.  * Ligne 1 : la longitude (en degrés) de l'utilisateur
  30.  * Ligne 2 : la latitude (en degrés) de l'utilisateur
  31.  * Ligne 3 : le nombre N de défibrillateurs équipant les rues de Montpellier
  32.  * N lignes suivantes : une description de chaque défibrillateur
  33.  *
  34.  * Sortie
  35.  * Le nom du défibrillateur le plus proche de la position de l'utilisateur.
  36.  *
  37.  * Contraintes
  38.  * 0 < N < 10000
  39.  *
  40.  * Exemple
  41.  * Entrée
  42.  * 3,879483
  43.  * 43,608177
  44.  * 3
  45.  * 1;Maison de la Prevention Sante;6 rue Maguelone 340000 Montpellier;;3,87952263361082;43,6071285339217
  46.  * 2;Hotel de Ville;1 place Georges Freche 34267 Montpellier;;3,89652239197876;43,5987299452849
  47.  * 3;Zoo de Lunaret;50 avenue Agropolis 34090 Mtp;;3,87388031141133;43,6395872778854
  48.  * Sortie
  49.  * Maison de la Prevention Sante
  50.  **/
  51.  
  52. const LON = readline(); // longitude
  53. const LAT = readline(); // latitude
  54. const N = parseInt(readline()); // le nombre N de défibrillateurs
  55. const regexDecimal = /,(?=\d)/g;
  56. const data = Array();
  57. for (let i = 0; i < N; i++) {
  58.     const DEFIB = readline();
  59.     const strDefib = DEFIB.split(';');
  60.     const idDefib = strDefib[0];
  61.     const name = strDefib[1];
  62.     const address = strDefib[2];
  63.     const phoneNumber = strDefib[3];
  64.     const longitude = parseFloat(strDefib[4].replace(regexDecimal, '.'), 10);
  65.     const latitude = parseFloat(strDefib[5].replace(regexDecimal, '.'), 10);
  66.     data.push({
  67.         idDefib: idDefib,
  68.         name: name,
  69.         address: address,
  70.         phoneNumber: phoneNumber,
  71.         longitude: longitude,
  72.         latitude: latitude,
  73.     });
  74. }
  75. const earthRadius = 6371;
  76. let d = Number.MAX_SAFE_INTEGER;
  77. let minData = null;
  78. for (let i = 0; i < N; i++) {
  79.     const longitudeA = parseFloat(LON.replace(regexDecimal, '.'), 10);
  80.     const longitudeB = data[i].longitude;
  81.     const latitudeA = parseFloat(LAT.replace(regexDecimal, '.'), 10);
  82.     const latitudeB = data[i].latitude;
  83.     const x = (longitudeB - longitudeA) * Math.cos((latitudeA + latitudeB) / 2);
  84.     const y = (latitudeB - latitudeA);
  85.     const dTmp = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) * earthRadius;
  86.     if (dTmp < d) {
  87.         d = dTmp;
  88.         minData = data[i];
  89.     }
  90. }
  91. console.log(minData?.name);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement