ChallengeR #5

Votre dernière mission consistait à trouver la fonction locf (qui remplace les NA par la dernière valeur connue) la plus compacte possible (étant bien entendu, comme d'habitude, que les espaces, les indentations et les retours à la ligne ne sont pas considérés comme des caractères). L’exemple que je vous ai donné était le suivant :

> x <- 10:20
> x[5:6] <- NA
> locf(x)
 [1] 10 11 12 13 13 13 16 17 18 19 20
>

Ce faisant, j’ai commis une petite erreur : j’aurais dû préciser que locf devrait aussi faire ça :

> x <- 10:20
> x[c(1:2, 5:6)] <- NA
> locf(x)
 [1] NA NA 12 13 13 13 16 17 18 19 20
>

En tenant compte de cet oubli de ma part, vous êtes deux à remporter ce 4ème ChallengeR avec un corps de fonction d’à peine 34 caractères.

La première solution est de @dickoah :

locf = function(x) {
 x[cummax((!is.na(x)) * 1:length(x))]
}

La seconde, qui présente l'avantage de traiter les NA en début de vecteur, nous est proposée par @navarre_julien :

locf = function(x) {
 i = !is.na(x)
 c(NA, x[i])[cumsum(i)+1]
}

Notez que, pour répondre strictement à mon énoncé (et donc sans supporter les NA en début de vecteur), on pouvait raccourcir la version de Julien comme suit :

locf = function(x) {
 i = !is.na(x)
 x[i][cumsum(i)]
}

La fonction locf idéale est donc quelque chose du genre :

locf = function(x) {
 if(is.matrix(x)) {
  res <- apply(x, 2, locf)
 } else {
  i <- !is.na(x)
  res <- c(NA, x[i])[cumsum(i)+1]
 }
 res
}

Bravo à tous les deux ! Voici donc ChallengeR, 5ème du nom.

Votre mission, si vous l’acceptez, consiste à coder le tricheur parfait dans mon petit tournois d’algos pour un dilemme du prisonnier répété. Vous devez concevoir une fonction de la forme :

msp = function(p, o, n = 2000) {
 # faire quelque chose...
 return(res)
}

De telle sorte qu’elle pulvérise tous les records en trichant vilement. Edit : Tout le code est accessible sur Github.

Aucun commentaire:

Enregistrer un commentaire

La loi Pompidou-Giscard (encore)

« Un mensonge fera le tour du monde avant que la vérité ait eu le temps de mettre ses bottes. » — Charles Spurgeon « Le Trésor public ne p...