ChallengeR #2

Je vais poster régulièrement des petits challenges de code sous R. Les résultats du premier sont ci-dessous, la question du second est en fin d’article.

Résultats du premier challenge

Votre mission consistait donc à reproduire la matrice suivante sous R avec le moins de code possible (étant précisé que les espaces, les indentations et les retours à la ligne ne sont pas considérés comme des caractères) :

> a
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    2    4    6    8   10
[3,]    3    6    9   12   15
[4,]    4    8   12   16   20
[5,]    5   10   15   20   25

Avant de vous donner les meilleures réponses, voici quelques unes des nombreuses façons de faire ça ; à commencer par la bonne vieille double boucle :

a <- matrix(NA, 5, 5)
for(i in 1:5) {
 for(j in 1:5) {
  a[i, j] <- i*j
 }
}

On pouvait aussi faire ça avec une seule boucle :

a <- matrix(1:5, 5, 5)
for(i in 1:5) a[, i] <- a[, i]*i

Ou :

a <- matrix(NA, 5, 5)
for(i in 1:5) a[, i] <- 1:5*i

Ou encore :

a <- matrix(1:5, 1, 5)
for(i in 2:5) a <- rbind(a, a[1, ]*i)

Mais sous R, dans la plupart des cas, on n'a pas besoin de boucle. Une alternative classique consiste à utiliser une des fonctions de la famille apply (apply, sapply, lapply, tapply ou rapply) :

sapply(1:5, function(i) i*1:5)

Ou, encore mieux et trouvée par @thedudeparis :

sapply(1:5, "*", 1:5)

On pouvait y arriver aussi avec une simple multiplication. Un certain @realDonaldTrump a proposé :

t(matrix(rep(1:5,5),5))*1:5

Ou, en utilisant l'argument byrow=TRUE dans matrix :

matrix(1:5, 5, 5, T) * 1:5

Ou encore, en transposant (avec t) :

a <- matrix(1:5, 5, 5)
a * t(a)

De là, certains d'entre vous ont pensé à un produit matriciel (avec l'opérateur %*%) ; c'est notamment le cas, encore, de @thedudeparis avec  :

1:5 %*% t(1:5)

Mais la meilleure solution consistait à utiliser la fonction outer ; @ClementinC à été le premier à chercher dans cette voie :

outer(1:5, 1:5, "*")

Ce qui, sachant que "*" est la valeur par défaut de l'argument FUN de outer, pouvait aussi s'écrire :

outer(1:5, 1:5)

Mais c'est @_AntoineB qui a pensé à utiliser l'opérateur de outer (%o%) et a donc remporté ce quiz avec à peine 9 caractères (bravo à lui !) :

1:5 %o% 1:5
Nouveau challenge

Soit le vecteur suivant :

x <- sample(0:9, 100, TRUE)

Comment compter le nombre de chiffres pairs avec le moins de code possible (les espaces, les indentations et les retours à la ligne ne sont pas comptés comme des caractères) ?

La meilleure réponse sera publiée ici même. Vous avez jusqu'au vendredi 19 janvier à 12h00 (heure de Paris).

Aucun commentaire:

Enregistrer un commentaire

Votre mot de passe

On ne va pas épiloguer pendant 150 ans, vous avez besoin : De mots de passe très forts (à partir de 128 bits), un par site (sauf, éventuel...