Hjælp til låge #2 i Vertica Dev Xmas 2019-julekalender

Rigtig mange af jer forsøger at lokalisere julemanden, og nogle af jer er virkelig tæt på! Der er endda blevet skrevet ud til nogle få af jer, fordi I er mindre end én meter fra julemandens position i jeres beregning.

Som følge af dét, har CSAR (Cloud Search And Rescue) besluttet at justere følsomheden af deres beregningsalgoritme, så den nu matcher nogle generelle retningslinjer for nøjagtigheden af at kunne identificere objekter. Der er derfor nu foretaget en afrunding af længde- og breddegrad, ned til 6 decimaler, som svarer til at kunne identificere et menneske (se forrige link for flere informationer).

Samtidig er det rigtig vigtigt at følge følgende algoritme, når den nye position beregnes:

  1. Sæt x_meters = 0
  2. Sæt y_meters = 0
  3. For hver bevægelse i julemandens bevægelser
    1. Hvis bevægelse er “up”, læg distancen i meter til y_meters
    2. Ellers hvis bevægelse er “down”, træk distancen i meter fra y_meters
    3. Ellers hvis bevægelse er “right”, læg distancen i meter til x_meters
    4. Ellers hvis bevægelse er “left”, træk distancen i meter fra x_meters
  4. Anvend formlerne fra låge 2 til at beregne ny længdegrad og ny breddegrad vha. kanens position (cane_latitude / cane_longitude) samt y_meters og x_meters:
    1. santa_latitude = new_latitude(cane_latitude, y_meters)
      santa_longitude = new_longitude(cane_longitude, x_meters, cane_latitude)

Der er flere af der løbende beregner/justerer længde- og breddegrad – dét skal man ikke 🙂 – beregn først x/y i meter, og dernæst juster den nye position.

I alle beregninger er det vigtigt at anvende en Double (64-bit) data-type – og man skal ikke foretage afrunding nogle steder.

Hvis man er ny i forhold til Elasticsearch, kommer her lidt hjælp, hvis man altså koder løsningen i .NET/C#:

  1. Install-Package NEST
  2. var settings = new ConnectionSettings("<<cloud-id-fra-låge-2>>",
      new BasicAuthenticationCredentials(
         response.username, 
         response.password)); 
    
    // hvor response.username og response.password er en del af 
    // det JSON data du modtager i kaldet til /api/participate (låge 1)
    
    var elasticClient = new ElasticClient(settings);
    
    SantaTracking document = elasticClient.Get<SantaTracking>(
       response.id, 
       selector => selector.Index("santa-trackings")).Source;
    
    // hvor response.id er en del af det JSON data du modtager
  3. Og hvor klassen “SantaTracking”, med tilhørende klasser, kan defineres ligesom vist her:
    1. public class SantaTracking
      {
         public GeoPoint CanePosition { get; set; }
         public Movement[] SantaMovements { get; set; }
      }
      
      public class GeoPoint
      {
         public double Lat { get; set; }
         public double Lon { get; set; }
      }
      
      public class Movement
      {
         public string Direction { get; set; }
         public double Value { get; set; }
         public string Unit { get; set; } 
      }
kibana-failed-attempts

Lidt statistik fra julekalenderen – 2 af jer har allerede fundet julemanden

God jagt!

P.S. Hvis du vil have helt vildt meget hjælp til at løse opgaven, hvilket selvfølgelig er helt okay, så klik dig ind på dette GitHub repository, som indeholder en reference implementering til løsning af lågerne.

Skriv et svar

Udfyld dine oplysninger nedenfor eller klik på et ikon for at logge ind:

WordPress.com Logo

Du kommenterer med din WordPress.com konto. Log Out /  Skift )

Google photo

Du kommenterer med din Google konto. Log Out /  Skift )

Twitter picture

Du kommenterer med din Twitter konto. Log Out /  Skift )

Facebook photo

Du kommenterer med din Facebook konto. Log Out /  Skift )

Connecting to %s