Skip to content

Instantly share code, notes, and snippets.

@lovasoa
Created December 10, 2011 13:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lovasoa/1455192 to your computer and use it in GitHub Desktop.
Save lovasoa/1455192 to your computer and use it in GitHub Desktop.
Optimal keyboard layout for phones with 10 keys
#!/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