Il semble exister cet engouement persistant pour les personnes qui apprennent de manière laborieuse de nouvelles configurations de clavier comme Dvorak ou Neo, car cela les rend soi-disant plus productives. Je soutiens que changer de disposition du clavier est une mauvaise idée car cela peut prendre des mois avant de devenir rapide et quand vous êtes finalement 5% plus rapide que le reste, vous êtes foutu si vous devez taper sur un ordinateur qui n'est pas pas la vôtre.
En outre, toutes ces personnes oublient le véritable goulet d'étranglement de la communication moderne: le clavier du téléphone.
Voici à quoi ressemble votre clavier téléphonique moyen:
La lettre 'r' est la troisième lettre du bouton 7; ainsi, si vous deviez taper la lettre «r» sur un téléphone portable, vous auriez appuyé trois fois sur la touche 7, 4 fois sur «7» et une fois sur la touche 2.
En considérant cela, mettre 'e' après 'd' était probablement une mauvaise décision - 'e' est la lettre la plus utilisée dans l'alphabet anglais, donc si vous deviez étiqueter le bouton 3 "EDF" au lieu de "DEF", permettrait d'économiser beaucoup de frappes.
De plus, vous vous êtes probablement déjà rendu compte que taper 2 lettres qui partagent le même bouton est une nuisance - si vous voulez écrire "TU", vous ne pouvez pas appuyer simplement sur 8 trois fois, car cela donnerait "V". Donc, généralement, vous écrivez «T», puis appuyez sur espace, puis sur retour arrière, puis écrivez «U», ce qui équivaut à 5 pressions de bouton au lieu de 3.
TL; DR
Étant donné ces deux règles:
- Une lettre est tapée n fois, en appuyant sur un bouton, où n est l'emplacement où se trouve la lettre sur l'étiquette du bouton.
- L'écriture de deux lettres tapées à l'aide du même bouton nécessite 2 appuis supplémentaires.
Quelle est la disposition du clavier du téléphone qui nécessite le moins d'appuis au clavier, en fonction d'un texte spécifique? Vous ne devez utiliser que les boutons 2 à 9, 1 et 0 réservés aux symboles spéciaux.
Contribution
Le texte pour lequel vous devez trouver la mise en page optimale est fourni via stdin. Vous n'avez pas besoin de manipuler autre chose que l'alphabet minuscule et pouvez supposer que la saisie est constituée de seulement cela. Vous pouvez également supposer que le texte saisi est relativement long et que chaque lettre y est insérée au moins une fois, si cela vous aide.
Sortie
Je ne veux pas imposer trop de contraintes à la sortie, car cela donne parfois des avantages à certaines langues par rapport à d’autres; donc, cependant, votre langue montre que les tableaux sont bons, sinon vous pouvez séparer chaque étiquette avec une nouvelle ligne.
Il peut y avoir plusieurs mises en page optimales possibles, vous pouvez en imprimer une seule. Voici un exemple simple:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Points bonus
-35 si votre algorithme ne force pas toutes les mises en page possibles (je regarde les "permutations" de Haskell ici)
-3 Si votre code correspond à un message texte (140 caractères) et que vous postez une photo de vous en envoyant votre code à un ami.
Ceci est mon premier défi sur StackExchange. Je serais heureux de savoir si vous l'aimez ou si vous avez d'autres commentaires à ce sujet!
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
des permutations uniques, qui ne comptent qu'une seule fois les réarrangements des clés.Réponses:
Perl, 333
Voici une tentative d'optimisation pour la règle n ° 2. Après mon commentaire, ci-dessus, et au lieu de réponses prenant en compte cette règle (cf. indice de question élevé), je pensais devoir faire un effort ici ...
Les solutions qui n'optimisent pas pour la règle n ° 2 peuvent produire des résultats très loin d'être optimaux. J'ai vérifié un long texte anglais naturel ("Alice au pays des merveilles", en fait), un traitement préliminaire (lettres minuscules uniquement) et, par exemple, le script Perl de la réponse d'OJW, le résultat étant
er
seule la ruine, plus quelques autres paires n'auraient jamais dû se terminer sur la même clé ...Btw,
zxqjvkbpfmygwculdrshnioate
sont des lettres triées, fréquence croissante, de ce texte.Si nous essayons de résoudre ce problème facilement (en espérant un bonus de -35, peut-être) et que nous plaçons les lettres une par une, en choisissant la clé disponible par compte minimal par paire, nous pouvons terminer avec, par exemple:
Je ne poste pas le code pour cette (mauvaise) solution ici. Par exemple, remarque,
c
est plus fréquent quew
et est placé en premier.tc
Lesct
paires ( ) sont évidemment moins fréquentes queac
(ca
) - 43 + 235 contre 202 + 355. Maisw
finit aveca
- 598 + 88. Nous terminons avec des pairesaw
ettc
(964 au total), bien que ce serait mieuxac
ettw
(635 au total). Etc..Ainsi, l'algorithme suivant essaie de vérifier chacune des 8 lettres les plus fréquentes restantes (ou 2 si c'est le dernier) par rapport aux lettres déjà présentes sur le clavier, et de les placer de manière à ce que le nombre de paires soit minimal.
Le résultat est:
Je n'aime pas la
ac
paire (le chat étant l'un des personnages, après tout), mais c'est quand même un placement optimal des lettres pour l'anglais, si mon code n'est pas faux. Pas exactement un effort de «golf», juste une solution de travail, moche ou pas.la source
Python3, c'est l'heure de Montecarlo!
Pour résoudre ce problème, je compte d’abord le nombre de "clics" dont vous avez besoin avec le clavier par défaut (au départ:)
abc,def,ghi,jkl,mno,pqrs,tuv,wxyz
. Ensuite, je modifie ce clavier et vois s'il est moins cher (le texte est écrit en moins de clics). Si ce clavier est moins cher, alors il devient celui par défaut. Je répète ce processus1M
fois.Pour changer le clavier, je décide d’abord du nombre de modifications à effectuer (le nombre maximal de modifications correspond au nombre total de lettres sur le clavier). Ensuite, pour chaque commutateur, je choisis deux boutons et deux positions et je transfère un caractère de la première à la seconde.
Le nombre maximal de commutateurs par heure correspond au nombre de lettres du clavier, car il s'agit du nombre minimal de modifications dont vous avez besoin pour passer de deux claviers complètement différents. (Je veux qu'il soit toujours possible de passer d'un clavier à un autre)
La sortie de
echo "jackdawslovemybigsphinxofquartz" | python .\myscript.py
est:Où
61
est le nombre de bouton enfoncé pour composer un message donné.Caractères (pas d'espaces ni de commentaires): 577
Je sais que c'est long mais je suis vraiment nouveau dans ce domaine.
Je l'ai trouvé tellement drôle que j'ai décidé d'essayer cet algorithme avec LO HOBBIT (j'ai aussi une copie originale à la maison!). Il a des
383964
lettres et ce sont les quelques clics vs clavier que je trouve:Je prétends donc que ce dernier est l’un des claviers les plus pratiques (en termes de clics).
la source
Eh bien, si vous voulez juste les personnages les plus populaires affectés aux cases 2-9, Perl peut le faire en 127 caractères ...
donner quelque chose comme:
Ou imprimez le tout sur une ligne en supprimant 12 caractères:
la source
$x{$_}++for split/\s*/,<>;map$o{$n++%8}.=$_,sort{$x{$b}<=>$x{$a}}keys%x;print map"$_:".$o{$_-2},2..9
Haskell, 160 - 35 = 125
Exemple:
On pourrait soutenir que cela n'optimise pas la règle 2, mais que les lettres les plus fréquentes sont placées sur des clés différentes .
la source
JavaScript, 192 - 35 = 157
Je viens de remarquer la règle des personnages à répéter; cela ne prend pas cela en compte. Mais comme @mniip a noté dans sa réponse:
Cela aurait probablement été en Ruby, mais je ne suis pas chez moi et je suis obligé d'utiliser Internet Explorer (eww). Mais bon, il est parfois amusant d’utiliser des langues terribles entre golf et golf! ;)
Exemple de sortie (pour votre saisie):
Comme JS n’a pas de STDIN, le programme suppose que l’entrée est stockée dans une variable
s
.la source
'abcdefghia'
n'est pas exactement optimal.'azbcdefghizjklmnopqzrstuvwxyz'
b=['','','','','','','','']
versb=[x='',x,x,x,x,x,x,x]
,s.split('')
verss.split(x)
eto[x]=o[x]?o[x]+1:1
verso[x]=-~o[x]
.Python (119-35 = 84):
En supposant que la chaîne est une variable a et ne contient que des lettres minuscules:
ungolfed:
PYG (76-35 = 41):
Aaah, nous pouvons laisser tomber l'énorme importation. Encore une fois, cela suppose que la chaîne dénudée est en a.
la source