ChallengeR #4

Bon, vous êtes non seulement forts mais vous êtes en plus de grands malades. Votre dernière mission consistait à trouver une fonction R qui renvoie la suite de Syracuse de n'importe quel entier x jusqu'à ce qu'elle atteigne 1. Il y a deux façons de faire ça :

En passant par une fonction récursive :

syracuse = function(x) {
 a <- tail(x, 1)
 if(a == 1) {
  return(x)
 } else {
  syracuse(c(x, ifelse(a%%2, a*3+1, a/2)))
 }
}

Ou en passant par une fonction récursive anonyme :

syracuse = function(x) {
 a <- tail(x, 1)
 if(a == 1) {
  return(x)
 } else {
  Recall(c(x, ifelse(a%%2, a*3+1, a/2)))
 }
}

Je dis que vous êtes des grands malades parce que, sur Twitter, vous avez assez rapidement décidé de trouver la fonction la plus condensée possible (sans parler de celui qui voulait faire ça sans if ni else). Du coup, je vous donne la version la plus courte, trouvée par @AlekVladNevski :

syracuse = function(x) {
 c(x, if(x>1) Recall(if(x%%2) x*3+1 else x/2 ))
}

Bravo à @_antoineb, @_pvictorr, @After_Eight, @AlekVladNevski, @bZ1O91, @ClementinC, @dickoah, @francois_ls, @mac_picsou, @NicolasBenezet, @PierreRinder, @privefl, @StephaneOrlins et @thedudeparis.

Nous allons donc pouvoir passer à l'étape 4.

Considérez le vecteur x suivant :

x <- 10:20
x[5:6] <- NA

Votre mission, si vous l’acceptez, consiste à coder trouver la fonction locf (pour Last Observation Copied Forward) qui, comme son nom le suggère, remplace les NA par la dernière observation connue :

> locf(x)
 [1] 10 11 12 13 13 13 16 17 18 19 20
>

Le gagnant sera celui qui proposera la fonction qui utilise le moins de caractères possibles (étant entendu que les espaces, les indentations et autres retours à la ligne ne son *pas* considérés comme des caractères).

2 commentaires:

  1. Comment on fait quand la première valeur est un NA? Doit-on prendre en compte ce cas ?

    RépondreSupprimer
    Réponses
    1. Pardon, j'arrive un peu tard. Effectivement, c'est une faille de mon énoncé :/

      Supprimer

ChallengeR #8 - Solutions

Votre mission consistait donc à trouver un moyen de faire en sorte que : > x == 0 [1] TRUE > x + 1 == 2 [1] TRUE > x / 2 == 1 [1...