J'ai fait un petit programme en mode console pour un ami, qui renvoie dans un fichier texte toutes les possiblités de casse pour un même mot.
Par exemple pour "mot", on retournera (en colonne) : mot, moT, mOt, mOT, Mot, MoT, MOt, MOT.
J'utilise en fait du binaire pour savoir s'il faut mettre une majuscule ou non.
Pour la k-ième possibilité, on transforme k en binaire et on fait correspondre le 1 à une majuscule et 0 à la minuscule.
Source / Exemple :
#!/usr/bin/python
#-*-coding: utf-8 -*-
## by Linkid (François Magimel)
## Permet d'afficher les possibilités de casse pour un mot
## En mode console
import os
def main(mot):
fichier = open("combinaison_casse.txt", 'w')
nb = 2**len(mot) ## nombre de mots possibles
for i in range(0, nb):
bi = bin(i)[2:] ## de 0 à nb-1 en binaire
nbi = len(bi) ## nombre de caractères binaires
mot_2 = "" ## mémoire du mot final
for j in range(0, len(mot)):
k = len(mot)-1-j ## pour le mot : prendre le dernier caractère de mot, de len(mot)-1 à 0
p = nbi-1-j ## pour le binaire : prendre le dernier caractère de bi, peut être négatif
if p >= 0 and bi[p] == "0":
mot_3 = mot[k]
elif p >= 0 and bi[p] == "1":
mot_3 = str.upper(mot[k]) ## caractère en majuscule
else:
mot_3 = mot[k]
mot_2 = mot_3 + mot_2
#print mot_2 ## mot final
fichier.write(mot_2 + '\n') ## écriture dans un fichier
fichier.close()
print "Il y a " + str(nb) + " possiblilité(s)"
if __name__ == '__main__':
mot = raw_input("Salut ! Rentre ton mot de 8 lettres...\nTon mot : "); ## retoune un string
main(str.lower(mot)) ## l'argument de main est un mot en minuscule
Conclusion :
J'ai décidé de mettre les possibilités dans un fichier texte pour éviter d'avoir une console remplie, mais pour les trop grands mots, le fichier texte devient un peu lourd.
Donc en amélioration possible, il serait bien de faire comme dans le terminal sous GNU/Linux avec une option more pour continuer à afficher, et taper q pour arreter. Ca permettrait de ne plus avoir le fichier texte et de tout afficher dans la console.
Surement à l'aide d'un while...
Merci pour vos commentaires.
7 janv. 2010 à 20:31
heu... que se passe t'il si le mot contient un chiffre ou un ' _ ' ou un '@' ??? je sais , je pinaille
Etant un éternel débutant en python (et en programmation)
le coup du binaire pour moi c'est du chinois
toutefois ce code me parait bien compliqué pour le taf qu'il doit faire
du coup ,j'ai essayé une autre solution, ça a l'air de fonctionner.
#!/usr/bin/python
#-*-coding: utf-8 -*-
mot="b@nane" ### pas d'input , un poil dans la main m'en a empêché
mot=mot.lower()
temp={}
temp2={}
maxi=len(mot)
temp[mot[0]]=0
temp[mot[0].upper()]=0
for indice in range(1,maxi):
for nn in temp:
temp2[nn+mot[indice]]=0
temp2[nn+mot[indice].upper()]=0
temp.clear()
temp.update(temp2)
temp2.clear()
print (temp.keys()) # affiche tous les mots possibles
print (len(temp.keys())) ### et le nombre
31 août 2009 à 09:59
8 mai 2009 à 11:07
Afficher le nombre de possibilités n'est pas très intéressant : il y a 2^n possibilités (n = nombre de caractère du mot entré).
Mais afficher les possibilités l'est un peu plus...
@+
8 mai 2009 à 04:31
8 mai 2009 à 04:27
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.