Created
December 10, 2011 13:41
-
-
Save lovasoa/1455192 to your computer and use it in GitHub Desktop.
Optimal keyboard layout for phones with 10 keys
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
#-*-coding:utf8-*- | |
#Algorithme de recherche du clavier de téléphone portable (à 10 touches) optimal. Un clavier est optimal lorsque l'on a rarement besoin d'utiliser deux fois de suite la même touche. | |
#On considère ici que la saisie prédictive (T9) n'est pas activée | |
#Par Ophir LOJKINE | |
texte = open("texte.txt").read().decode('utf8').lower() | |
clavier = [ "" for i in range(10)] #clavier est une liste de chaines de caractères (les touches) | |
def uniq(alist): | |
'''Supprime les doublons d'une liste, en en préservant l'ordre''' | |
temp = {} | |
return [temp.setdefault(e,e) for e in alist if e not in temp] | |
lettres = uniq(sorted(texte, key=lambda k:texte.count(k), reverse=True)) #Toutes les lettres, classées par ordre de fréquence dans le texte | |
def proximite (touche, lettre1): | |
'''Retourne une valeur élevée si la lettre est proche des autres lettres | |
déjà présentes sur la touche. Donc une valeur élevée signifie que la lettre ne devrait | |
pas se retouver sur la touche.''' | |
somme = 0 | |
for lettre2 in touche: | |
somme += texte.count(lettre.join(lettre2)) + texte.count(lettre2.join(lettre)) | |
#On multiplie par le nombre de caractères déjà présents sur la touche, pour que la répartition des lettres sur les touches soit homogène | |
return somme*len(touche) | |
for lettre in lettres: | |
clavier.sort(key=lambda touche:proximite(touche, lettre)) | |
clavier[0] += lettre | |
for i, touche in enumerate(clavier): | |
print "%d: %s" % (i, touche) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment