mercredi 19 mars 2008

Quelle que soit la casse

Une petite fonction récursive pour générer toute les casses possibles d'un mot. A toutes fins utiles...



def evocate str
if str.size == 1 then
return [str.downcase, str.upcase]
else
a = []
evocate(str[1...str.size]).each do |tail|
a.push(str[0].chr.downcase + tail, \\
str[0].chr.upcase + tail)
end
return a
end
end

test = evocate("toto")
p test
#=>["toto", "Toto", "tOto", "TOto", "toTo", "ToTo",
# "tOTo", "TOTo", "totO", "TotO", "tOtO", "TOtO",
# "toTO", "ToTO", "tOTO", "TOTO"]

5 commentaires:

Lefty a dit…

Sans vouloir faire le lourd, je suppose que tu as voulu intituler ton article "Quelle que soit la casse", bien sûr.
Simple faute de frappe.

Vu mon dernier post? AC Clarke is dead.

Sobe a dit…

Mé kel reulou ! Dy ke gcri mââl ossi !

Poulet a dit…

Sans vouloir troller, avec les décorateurs en Python on fait de chouettes trucs à ce sujet :

def case_insensitive(func): return lambda *x: func(*[a.lower() for a in x])

@case_insensitive
def isequal(x, y): return (x == y)

Sobe a dit…

Tiens, oui. Mais ça ressemble presque à du Perl (contre-troll !)...

En tout cas, c'est concis !

Au passage, je précise qu'il existe très probablement de meilleures méthodes en Ruby que celle que je propose ici : c'est surtout l'algo qui m'intéressait.

Mais merci pour la remarque, je suis preneur.

Poulet a dit…

Dans ma précipitation j'ai oublié d'expliquer le principe : case_insensitive est un décorateur, qui prend une fonction en paramètre et doit en retourner une autre (ici, on retourne une fonction qui appelle celle qu'on a passé en argument en appliquant la méthode lower sur chacun de ses paramètres)

La notation @ c'est juste du sucre pour appliquer le décorateur :]