ChallengeR #7

Vous deviez donc coder une fonction nbchar qui compte le nombre de caractères (hors espaces, indentations et retours à la ligne) du corps d'une autre fonction R sachant que le gagnant serait celui pour qui nbchar(nbchar) serait le plus petit possible.

Et le gagnant de ce ChallengeR #6 est @_ColinFay qui nous propose :

nbchar <- function(f){
 sum(nchar(gsub("[[:blank:]]+", "", body(f)))[-1])
}

Ce qui donne donc :

> nbchar(nbchar)
[1] 47
>

Colin me fait remarquer, à juste titre, que je n'ai pas précisé que vous n'aviez pas le droit d'utiliser une fonction externe. Auquel cas il propose :

x <- function(f){
 sum(nchar(gsub("[[:blank:]]+", "", body(f)))[-1])
}

nbchar <- function(f){
 x(f)
}

Soit 4 caractères. Nous allons quand même retenir la première version :)

Notez aussi celle de @navarre_julien :

nbchar <- function(f) {
 sum(nchar(gsub("\\s", "", deparse(body(f)))))
}

Elle présente l'inconvénient de compter les accolades au début et à la fin du corps mais utilise une expression régulière bien plus courte (\\s). En mixant les deux, vous pouviez faire :

nbchar <- function(f) {
 sum(nchar(gsub("\\s", "", body(f)[-1])))
}

Et je ne crois pas qu'on puisse espérer faire plus court.

Challenger #7

Votre mission, si vous l’acceptez consiste à trouver une fonction month.end qui, comme son nom le suggère, renvoie le dernier jour du mois de toutes les dates passées en argument. Par exemple :

> x <- seq(as.Date("1999-01-01"), by = 22, len = 10)
> month.end(x)
 [1] "1999-01-31" "1999-01-31" "1999-02-28" "1999-03-31" "1999-03-31"
 [6] "1999-04-30" "1999-05-31" "1999-06-30" "1999-06-30" "1999-07-31"
>

Sera déclaré vainqueur celui ou celle qui produira la fonction la plus minimaliste (au sens de nbchar) sachant que (i) vous n’avez droit qu’aux packages par défaut de R et (ii) vous ne pouvez pas faire appel à des fonctions externes (poke Colin).

Postez vos réponses ci-dessous ; vous avez jusqu’à vendredi prochain. Update : votre fonction doit impérativement retourner un objet Date. Les meilleurs sont en dessous de 50 caractères !

Votre @username sur Twitter :


Coller votre code ici :


Validez pour enregistrer votre réponse.

Aucun commentaire:

Enregistrer un commentaire

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