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).

3 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
  2. Salut les gars, comment j'ai retrouvé mon ex-mari, Fast, Dr.Padman a vraiment travaillé sur le lancer des sorts d'amour!
    Mon mari m'a quitté pour une autre femme il y a trois mois et depuis lors, ma vie a été remplie de douleurs, de chagrin et de cœur brisé, car il était mon premier amour avec lequel j'ai passé toute ma vie. Un de mes amis m'a dit avoir vu des témoignages d'un lanceur de sorts appelé Dr.Padman qu'il pourrait ramener son amant dans quelques jours. Je ris et dis que je ne m'intéressais pas mais à cause de l'amour que mon ami m'avait pour moi, elle a consulté le grand prêtre (padmanlovespell@yahoo.com) en mon nom et à ma plus grande surprise après 11 heures plus tard, mon mari m'a appelé pour la première fois après trois mois qu'il me manque et qu'il est désolé pour tout ce qu'il a m'a fait traverser.Il est revenu à moi et maintenant nous sommes heureux ensemble. Je ne peux toujours pas y croire, parce que c’est très incroyable. Merci Dr.Padman d’avoir ramené mon amant et également à mon cher ami qui a intercédé en ma faveur, pour tous ceux qui pourraient avoir besoin de l’aide de ce grand docteur, voici l’adresse email: (padmanlovespell@yahoo.com)

    RépondreSupprimer

Le prix de la baguette de 1954 à 2019

Le sujet n’en finit plus de faire débat : j’ai donc reconstruit une série du prix de la baguette (de 250g) en France (les données concernent...