Digiloikka ja korona-ajan GPS-kisat - gpx-reittiin vauhtia R-kielen avulla

Categories: R

Korona-aika on tuonut mukanaan uusia innovaatioita myös urheilukilpailujen järjestämiseen. Suunnistus on yksi lajeista, joissa on siirrytty omatoimikilpailuihin: HS: Mittari näyttää löytyikö rasti ja kuka oli nopein: korona-aika kasvatti gps-kisojen suosiota.

Helsingin suunnistajien keväisin ja syksyisin järjestämä firmaliiga on myös joutunut sopeuttamaan toimintaansa ja parhaillaan kevätkauden kilpailuja käydään gps-kisojen muodossa - reilun pelin hengessä, tottakai!

Korona-aikana on puhuttu myös paljon kotona, kouluissa ja työpaikoilla otetuista digiloikista. Jotta se ei jäisi pelkäksi videoneuvottelujen opettelemiseksi, yritän tällä esimerkillä (jälleen!) motivoida ihmisiä innostumaan ohjelmoinnista. Ja mikäpä olisikaan konkreettisempi digiloikka kuin oman suorituksen gps-jäljen manipuloiminen loppuajan parantamiseksi.

GPS-kisoissa suoritus ladataan jollekin alustalle useimmiten gpx-tiedostoformaatissa, joka on avoin xml-pohjainen tiedostomuoto piste- ja reittimuotoisten gps-jälkien siirtämiseen. gpx on tekstipohjainen tiedosto, jonka manipuloiminen ohjelmallisesti on melko yksinkertaista. Alla on ota_digiloikka()-nimisen funktion lähdekoodi avoimella R-kielellä. Funktiolle annetaan polku suorituksen .gpx-tiedostoon (infile), nimi manipuloidulle tiedostolle (outfile) sekä ns. huijausprosentti (cheat_pros) eli haluttu ajan parannus prosentteina.

ota_digiloikka <- function(infile, outfile, cheat_pros){
  
  require(dplyr)
  require(glue)
  lns <- readLines(infile)
  
  dat <- tibble(orig = grep("^<time>", lns, value = TRUE)) %>% 
    mutate(time = sub("Z", "", 
                      sub("T", " ", gsub("<time>|</time>", "", orig)))
    ) %>% 
    mutate(time = as.POSIXct(time),
           duration = as.numeric(time - time[1]),
           new_duration = round(duration * (1-cheat_pros/100)),
           dur_diff = duration - new_duration,
           new_time = time - lubridate::seconds(dur_diff),
           trimmed = as.character(glue("<time>{sub(' ', 'T', new_time)}Z</time>"))
    ) %>% 
    select(orig,trimmed)
  
  replace_with_new_time <- function(string, patterns, replacements) {
    for (i in seq_along(patterns))
      string <- gsub(patterns[i], replacements[i], string, perl=TRUE)
    string
  }
  
  lns2 <- replace_with_new_time(lns, dat$orig, dat$trimmed)
  writeLines(lns2, outfile)
}

Kävin perjantaina juoksemassa Firmaliigan ensimmäisen osakilpailun Nuuksiossa ja kokeilin miltä vaatimaton 45 prosentin ajan parannus saisi menon näyttämään. Eli kutsuin funktiota seuraavasti:

ota_digiloikka(infile = "2020-05-15_132316.gpx", 
            outfile = "newfile.gpx", 
            cheat_pros = 45)

ja lopputulos näkyy rastit.fi-palvelussa alla. Oma suoritukseni on Kalle Kuntosuunnistaja, johon digiloikan ottanut Elmo tekee surutta eroa.

Ja lopuksi vielä muistutus että tällaisia vippaskonsteja ei saa käyttää vaikkei niitä säännöissä suoraan kielletä. Se on sitä reilun pelin henkeä! Tässä linkki 1. osakilpailun reittipalveluun

See also