La prochaine révolution dans la dactylographie sur les ordinateurs portables a été lancée le 1er avril 2014 par SwiftKey . Cependant, je veux être la première personne à écrire un nano clone de balayage, mais, comme je ne trouve pas un bon texte de balayage vers une bibliothèque de texte réel, et je ne peux pas attendre pour eux, je demande ici.
Tâche
Écrivez un programme qui accepte le texte glissé et génère l'équivalent en texte réel. Exemple:
Input: hgrerhjklo
Output: hello
Lorsque l'utilisateur:
Autres exemples:
Input: wertyuioiuytrtjklkjhgfd
Output: world
Input: poiuytrtyuioiugrewsasdfgbhnmkijnbg
Output: programming
Input: poiuygfdzxcvhjklkjhgres
Output: puzzles
Input: cvhjioiugfde
Output: code
Input: ghiolkjhgf
Output: golf
Règles
- Le programme prendra un «mot» glissé sur stdin ou argv
- La première et la dernière lettre de l'entrée balayée correspondront à la première et à la dernière lettre du mot réel
- Vous pouvez supposer que l'utilisateur fera des lignes raisonnablement droites, mais vous pouvez utiliser les données d'exemple pour le vérifier (j'ai créé les données d'exemple et je ferai les données de test finales)
- Pour une entrée ambiguë, vous pouvez faire sélectionner l'une ou l'autre sortie, mais j'essaierai d'éliminer toute ambiguïté des données de test
- Ce mot sera dans cette liste de mots (mais glissé). La liste de mots sera dans le répertoire courant, et peut être lue (nouvelle ligne séparée, sera nommée
wordlist
, sans extension). - Le balayage ne contiendra que des caractères alphabétiques en minuscules
- Le balayage peut contenir des caractères en double, si l'utilisateur marque une pause sur une touche
- Le programme doit sortir sur stdout (le cas n'a pas d'importance)
- Le programme doit retourner
0
comme code retour - Vous devez fournir la commande d'exécution, la commande de compilation (si nécessaire), le nom et le chemin d'entrée à utiliser
- Des failles standard s'appliquent (cependant, elles pourraient ne pas aider)
- Aucune bibliothèque non intégrée autorisée
- Solutions déterministes, non golfées / obscurcies préférées
- Pas d'écriture de fichiers, de mise en réseau, etc.
- Votre code doit être exécuté en une seconde ou moins (votre code est exécuté une fois par mot)
- Les scores sont exécutés sur un processeur Intel i7 Haswell, avec 4 codes virtuels (2 réels), vous pouvez donc utiliser des threads si vous devez
- Longueur maximale du code de 5000 octets
- La langue que vous utilisez doit avoir une version gratuite (non d'essai) disponible pour Linux (Arch Linux, si cela est important)
Critère gagnant
- Le gagnant est la solution la plus précise (notée par le programme de contrôle , en utilisant la liste de tests fournie)
- La popularité est le bris d'égalité
- Le tableau des scores sera mis à jour tous les quelques jours
- Les temps morts et les accidents comptent comme des échecs
- Ce défi durera deux semaines ou plus, selon la popularité
- La notation finale utilisera une liste de mots différente, choisie au hasard (même longueur, à partir de la même liste de mots)
Autre
- Vous pouvez utiliser le programme de contrôle pour tester votre programme
- Si vous êtes impatient et souhaitez que votre programme soit mis à jour / ajouté rapidement, lancez un problème ou envoyez une demande à https://github.com/matsjoyce/codegolf-swipe-type/blob/master
- Les inscriptions sont conservées sur https://github.com/matsjoyce/codegolf-swipe-type/blob/master/entries
- Les journaux de chaque exécution de programme sont conservés sur https://github.com/matsjoyce/codegolf-swipe-type/blob/master/logs
- Journal principal sur https://github.com/matsjoyce/codegolf-swipe-type/blob/master/log.log
- La position de chaque clé sera fournie sous forme de fichier csv dans le répertoire courant appelé
keypos.csv
, avec les valeurs x et y données par rapport àQ
(voir https://github.com/matsjoyce/codegolf-swipe-type/blob/master/ keypos.csv ) - Chaque clé mesure 1,5 x 1,5 cm (même unité que dans keypos.csv)
Tableaux de score actuels
liste de tests ( journaux ):
Three Pass Optimizer:Errors: 0/250 Fails: 7/250 Passes: 243/250 Timeouts: 0/250
Corner Sim: Errors: 0/250 Fails: 9/250 Passes: 241/250 Timeouts: 0/250
Discrete Fréchet Distance:Errors: 0/250 Fails: 17/250 Passes: 233/250 Timeouts: 0/250
Turnaround: Errors: 0/250 Fails: 18/250 Passes: 232/250 Timeouts: 0/250
Direction Checker: Errors: 0/250 Fails: 19/250 Passes: 231/250 Timeouts: 0/250
Regex Solver: Errors: 0/250 Fails: 63/250 Passes: 187/250 Timeouts: 0/250
Corner Sim: Errors: 0/250 Fails: 10/250 Passes: 240/250 Timeouts: 0/250
Three Pass Optimizer:Errors: 2/250 Fails: 14/250 Passes: 234/250 Timeouts: 0/250
Turnaround: Errors: 0/250 Fails: 16/250 Passes: 234/250 Timeouts: 0/250
Direction Checker: Errors: 0/250 Fails: 17/250 Passes: 233/250 Timeouts: 0/250
Discrete Fréchet Distance:Errors: 0/250 Fails: 18/250 Passes: 232/250 Timeouts: 0/250
Regex Solver: Errors: 0/250 Fails: 67/250 Passes: 183/250 Timeouts: 0/250
Course finale
liste de tests ( journaux ):
Corner Sim: Errors: 0/250 Fails: 14/250 Passes: 236/250 Timeouts: 0/250
Three Pass Optimizer:Errors: 0/250 Fails: 18/250 Passes: 232/250 Timeouts: 0/250
Direction Checker: Errors: 0/250 Fails: 20/250 Passes: 230/250 Timeouts: 0/250
Turnaround: Errors: 0/250 Fails: 23/250 Passes: 227/250 Timeouts: 0/250
Discrete Fréchet Distance:Errors: 0/250 Fails: 30/250 Passes: 220/250 Timeouts: 0/250
Regex Solver: Errors: 0/250 Fails: 55/250 Passes: 195/250 Timeouts: 0/250
Bravo à tout le monde et hgfdsasdertyuiopoiuy swertyuiopoijnhg!
code-challenge
keyboard
matsjoyce
la source
la source
l
, qui n'est pas doublé.Réponses:
JavaScript, ES6, trois passages Optimizer,
112 187 235 240 241243 et231234 passesUn filtre à trois passes qui comprend d'abord les touches critiques dans la séquence de touches, puis passe la séquence à travers les trois filtres:
Code
Le code suppose qu'une variable appelée
words
est présente qui est un tableau de tous les mots de cette pageVoir le code en action ici
Voir les cas de test en action ici
Le lien ci-dessus ne fonctionne que sur un dernier Firefox (33 et supérieur) (en raison de ES6).
la source
keypos.csv
fichier approprié maintenant. Les fonctions d'E / S disponibles sont répertoriées sur developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…Ruby, Regex Solver -
30 140 176 180 182187 et179183 passesJe trouverai le score plus tard. Voici une solution très naïve qui ne prend pas en compte la disposition du clavier:
Il prend l'entrée de l'ARGV et imprime le résultat. Je filtre simplement la liste de mots par première et dernière lettre, et eux, j'essaie tous les mots restants par rapport à l'entrée (en éliminant les lettres en double et en utilisant une expression régulière comme
^g.*u.*e.*s$
pour "suppose") et je renvoie la première de celles-ci s'il y a sont de multiples solutions.Exécutez-le comme
N'importe qui d'autre, n'hésitez pas à réutiliser cette étape comme premier filtre - je pense que cela ne jettera pas de mots corrects, donc cette vérification préliminaire peut considérablement réduire l'espace de recherche pour de meilleurs algorithmes.
Edit: Suite à la suggestion des PO, je sélectionne maintenant le plus long des candidats, ce qui semble être une heuristique décente.
Merci également à es1024 de m'avoir rappelé les lettres en double.
la source
paradoxically
, car lel
n'apparaîtrait qu'une fois dans l'entrée, plutôt que deux fois comme l'exige l'expression régulière.C ++, Distance Fréchet discrète -
201220222232 et 232 passesPour moi, le problème appelait beaucoup la distance de Fréchet qui est malheureusement très difficile à calculer.
Pour le plaisir, j'ai essayé d'aborder le problème en mettant en œuvre une approximation discrète décrite par Thomas Eiter et Heikki Mannila dans Computing Discrete Fréchet Distance (1994).
Au début, j'utilise la même approche que les autres pour filtrer tous les mots de la liste qui sont des sous-séquences de l'entrée (ce qui représente également plusieurs occurrences séquentielles du même caractère). Ensuite, je remplis la courbe polygonale de lettre en lettre de chaque mot avec des points intermédiaires et la compare à la courbe d'entrée. Enfin, je divise chaque distance par la longueur du mot et je prends le score minimum.
Jusqu'à présent, la méthode ne fonctionne pas aussi bien que je l'espérais (elle reconnaît l'exemple de code comme "chide"), mais cela pourrait simplement être le résultat de bugs que je n'ai pas encore trouvés. Sinon, une autre idée serait d'utiliser d'autres variations de la distance de fréchet ("moyenne" au lieu de "longueur maximale de laisse de chien").
Edit: Maintenant, j'utilise une approximation de la "longueur moyenne de la laisse de chien". Cela signifie que je trouve une cartographie ordonnée entre les deux chemins qui minimise la somme de toutes les distances et la divise plus tard par le nombre de distances.
Si le même caractère apparaît deux fois ou plus souvent dans le mot du dictionnaire, je ne mets qu'un seul nœud dans le chemin.
J'ai compilé le code avec clang, mais
g++ ./thiscode.cpp -o ./thiscode
devrait également fonctionner correctement .la source
programmijng
- cela me donnepang
.programming
comme il se doit. Pourriez-vous décommenter la ligne// cout << thispair->first << ": " << score << endl;
et coller les partitions obtenues?Python 2, Turnarounds,
224 226 230232 et230234 passesIl s'agit d'une approche assez simple:
Courir comme
La solution n'est pas très robuste. Une seule mauvaise frappe entraînerait l'échec. Cependant, étant donné que l'ensemble des cas de test ne contient que
très peud'orthographe, il fonctionne assez bien, ne se confondant que dans certains cas où il choisit des mots trop longs.Edit: je l'ai un peu changé pour ne pas utiliser le fichier de position clé fourni mais une mise en page simplifiée. Cela facilite la tâche de mon algorithme car dans le fichier, les clés ne sont pas espacées de manière égale. Je peux obtenir des résultats encore légèrement meilleurs en incluant des bris d'égalité ad hoc pour les cas ambigus, mais ce serait une optimisation excessive pour cet ensemble de tests particulier. Il reste quelques échecs qui ne sont pas réellement ambigus mais que je n'attrape pas avec mon algorithme simple car il ne considère que les changements de direction de plus de 90 degrés.
la source
brats
pourrait être'bgrdsasdrtrds'
qui ne peut pas être confondu avecbreasts
. Cependant, cela ne me dérangerait pas non plus si vous le laissiez tel quel.PHP, Direction Checker,
203 213 216 229231 et229233 passesCela commence par un simple passage dans le dictionnaire pour obtenir une liste de mots dont les lettres sont toutes présentes dans l'entrée (ce que Martin a fait ici ), et aussi seulement pour vérifier au
l.*
lieu del.*l.*
quandl
est dupliqué.Le mot le plus long ici est ensuite enregistré dans une variable.
Une autre vérification est ensuite effectuée, basée sur les touches aux points où le balayage change de direction (+ / 0 à - ou - / 0 à +, en x ou y). La liste des mots possibles est vérifiée par rapport à cette liste de caractères et les mots qui ne correspondent pas sont éliminés. Cette approche repose sur des virages serrés dans le balayage pour être précis.
Le mot restant le plus long est sorti, ou s'il ne reste aucun mot, le mot le plus long du précédent est sorti à la place.
Modifier: ajout de tous les caractères sur une ligne horizontale menant à un changement de direction en tant que valeurs possibles à vérifier.
PHP 5.4 est requis (ou remplacez tout
[..]
pararray(..)
).la source
keypos.csv
sss
) - Je ne pense pas que votre élimination des doublons les attraperait.Python 3, Corner Simulator, 241 et 240 passes
Algorithme:
significant_letter
fonction) (troisième passage)Code:
Courir avec
python3 entries/corner_sim.py
la source