Die nächste Revolution beim Tippen auf Laptops wurde am 1. April 2014 von SwiftKey veröffentlicht . Ich möchte jedoch die erste Person sein, die einen Swiping-Nano-Klon schreibt, aber da ich keinen guten Swipe-Text für eine echte Textbibliothek finde und nicht auf sie warten kann, frage ich hier.
Aufgabe
Schreiben Sie ein Programm, das Swipe-Text aufnimmt und das echte Textäquivalent ausgibt. Beispiel:
Input: hgrerhjklo
Output: hello
Wenn der Benutzer Folgendes tut:
Andere Beispiele:
Input: wertyuioiuytrtjklkjhgfd
Output: world
Input: poiuytrtyuioiugrewsasdfgbhnmkijnbg
Output: programming
Input: poiuygfdzxcvhjklkjhgres
Output: puzzles
Input: cvhjioiugfde
Output: code
Input: ghiolkjhgf
Output: golf
Regeln
- Das Programm nimmt ein 'Wort' auf stdin oder argv
- Der erste und letzte Buchstabe der durchgestrichenen Eingabe entspricht dem ersten und letzten Buchstaben des tatsächlichen Wortes
- Sie können davon ausgehen, dass der Benutzer einigermaßen gerade Linien macht, aber Sie können die Beispieldaten verwenden, um dies zu überprüfen (ich habe die Beispieldaten gemacht und ich werde die endgültigen Testdaten machen).
- Bei mehrdeutigen Eingaben können Sie eine der beiden Ausgaben auswählen, aber ich werde versuchen, alle Mehrdeutigkeiten in den Testdaten zu beseitigen
- Dieses Wort wird in dieser Wortliste angezeigt (aber durchgestrichen). Die Wortliste befindet sich im aktuellen Verzeichnis und kann gelesen werden (durch Zeilenumbrüche getrennt, wird benannt
wordlist
, keine Erweiterung). - Das Wischen enthält nur Kleinbuchstaben
- Das Wischen kann doppelte Zeichen enthalten, wenn der Benutzer bei einem Schlüssel pausiert
- Das Programm muss auf stdout ausgegeben werden (Groß- / Kleinschreibung spielt keine Rolle)
- Das Programm muss
0
als Rückkehrcode zurückgeben - Sie müssen den Befehl run, den Befehl compile (falls erforderlich), den Namen und den zu verwendenden Eingabepfad angeben
- Es gelten Standardlücken (sie können jedoch nicht helfen)
- Keine nicht eingebauten Bibliotheken erlaubt
- Deterministische, nicht golfende / verschleierte Lösungen bevorzugt
- Kein Schreiben von Dateien, Vernetzung usw.
- Ihr Code muss in einer Sekunde oder weniger ausgeführt werden (Ihr Code wird einmal pro Wort ausgeführt)
- Die Scoring-Läufe werden auf einem Intel i7 Haswell-Prozessor mit 4 virtuellen Codes (2 realen) ausgeführt, sodass Sie bei Bedarf Threads verwenden können
- Maximale Codelänge von 5000 Bytes
- Für die von Ihnen verwendete Sprache muss eine kostenlose (keine Test-) Version für Linux verfügbar sein (Arch Linux, falls dies von Bedeutung ist)
Gewinnkriterium
- Der Gewinner ist die genaueste Lösung (vom Kontrollprogramm anhand der bereitgestellten Testliste bewertet)
- Popularität ist der Krawattenbrecher
- Die Wertungstabelle wird alle paar Tage aktualisiert
- Auszeiten und Abstürze gelten als fehlgeschlagen
- Diese Herausforderung dauert je nach Beliebtheit zwei Wochen oder länger
- Die endgültige Wertung verwendet eine andere, zufällig ausgewählte Liste von Wörtern (gleiche Länge, aus derselben Wortliste).
Andere
- Mit dem Steuerungsprogramm können Sie Ihr Programm testen
- Wenn Sie ungeduldig sind und möchten, dass Ihr Programm schnell aktualisiert / hinzugefügt wird, starten Sie ein Problem oder fordern Sie es unter https://github.com/matsjoyce/codegolf-swipe-type/blob/master an
- Einträge werden unter https://github.com/matsjoyce/codegolf-swipe-type/blob/master/entries gepflegt
- Die Protokolle der einzelnen Programmläufe werden unter https://github.com/matsjoyce/codegolf-swipe-type/blob/master/logs gespeichert
- Hauptprotokoll unter https://github.com/matsjoyce/codegolf-swipe-type/blob/master/log.log
- Die Position jedes Schlüssels wird als CSV-Datei im aktuellen Verzeichnis angegeben.
keypos.csv
Die X- und Y-Werte beziehen sich aufQ
(siehe https://github.com/matsjoyce/codegolf-swipe-type/blob/master/). keypos.csv ) - Jeder Schlüssel misst 1,5 x 1,5 cm (dieselbe Einheit wie in keypos.csv)
Aktuelle Anzeigetafeln
Testliste ( Protokolle ):
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
Testliste2 ( Protokolle ):
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
Final Run
Testliste ( Protokolle ):
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
Gut gemacht an alle und hgfdsasdertyuiopoiuy swertyuiopoijnhg!
code-challenge
keyboard
Matsjoyce
quelle
quelle
l
, das ist nicht verdoppelt.Antworten:
JavaScript, ES6, Three Pass Optimizer,
112 187 235 240 241243 und231234 DurchgängeEin Drei-Pass-Filter, der zuerst kritische Tasten in der Tastenanschlagssequenz herausfindet und die Sequenz dann durch die drei Filter leitet:
Code
Der Code geht davon aus, dass eine aufgerufene Variable
words
vorhanden ist, die alle Wörter dieser Seite enthältSehen Sie hier den Code in Aktion
Sehen Sie hier die Testfälle in Aktion
Beide oben genannten Links funktionieren nur auf einem aktuellen Firefox (33 und höher) (aufgrund von ES6).
quelle
keypos.csv
jetzt auch die richtige Datei verwenden. Die verfügbaren E / A-Funktionen sind unter developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…Ruby, Regex Solver -
30 140 176 180 182187 und179183 PässeIch werde die Partitur später herausfinden. Hier ist eine sehr naive Lösung, die das Tastaturlayout nicht berücksichtigt:
Es nimmt Eingaben von ARGV entgegen und druckt das Ergebnis aus. Ich filtere nur die Wortliste nach dem ersten und dem letzten Buchstaben und versuche alle verbleibenden Wörter gegen die Eingabe (doppelte Buchstaben werden entfernt und ein regulärer Ausdruck wie
^g.*u.*e.*s$
"rate" wird verwendet) und gebe den ersten davon zurück, falls vorhanden sind mehrere Lösungen.Führen Sie es wie
Jeder andere kann diesen Schritt als ersten Filter verwenden. Ich glaube, er wirft keine korrekten Wörter aus, sodass diese vorläufige Überprüfung den Suchraum für bessere Algorithmen erheblich verringern kann.
Edit: Dem Vorschlag des OP folgend, wähle ich jetzt den längsten der Kandidaten aus, was eine anständige Heuristik zu sein scheint.
Vielen Dank auch an es1024 für die Erinnerung an doppelte Briefe.
quelle
paradoxically
, wennl
sie nur einmal in der Eingabe erscheinen würden, anstatt doppelt so, wie es der reguläre Ausdruck verlangt.C ++, Discrete Fréchet Distance -
201220222232 und 232 PässeFür mich war das Problem die Fréchet-Distanz, die leider sehr schwer zu berechnen ist.
Aus Spaß habe ich versucht, das Problem zu lösen, indem ich eine diskrete Approximation implementiert habe, die von Thomas Eiter und Heikki Mannila in Computing Discrete Fréchet Distance (1994) beschrieben wurde.
Zuerst benutze ich den gleichen Ansatz wie die anderen, um alle Wörter in der Liste zu filtern, die Teilfolgen der Eingabe sind (wobei auch mehrere sequenzielle Vorkommen desselben Zeichens berücksichtigt werden). Dann fülle ich die Polygonkurve von Buchstabe zu Buchstabe jedes Wortes mit Zwischenpunkten und vergleiche sie mit der Eingabekurve. Schließlich dividiere ich jede Distanz durch die Länge des Wortes und nehme die Mindestpunktzahl.
Bisher funktioniert die Methode nicht so gut, wie ich es mir erhofft hatte (das Codebeispiel wird als "chide" erkannt), aber dies könnte nur das Ergebnis von Fehlern sein, die ich noch nicht gefunden habe. Andernfalls wäre eine andere Idee, andere Variationen der Fréchet-Distanz zu verwenden ("Durchschnitt" anstelle von "maximale Hundeleinenlänge").
Edit: Jetzt benutze ich eine Annäherung an die "durchschnittliche Hundeleinenlänge". Das bedeutet, dass ich eine geordnete Zuordnung zwischen beiden Pfaden finde, die die Summe aller Entfernungen minimiert und später durch die Anzahl der Entfernungen dividiert.
Wenn dasselbe Zeichen zweimal oder öfter im Wörterbuchwort vorkommt, füge ich nur einen Knoten in den Pfad ein.
Ich habe den Code mit Clang kompiliert,
g++ ./thiscode.cpp -o ./thiscode
sollte aber auch gut funktionieren.quelle
programmijng
- es gibt mirpang
.programming
wie es sein sollte. Könnten Sie bitte die Zeile auskommentieren// cout << thispair->first << ": " << score << endl;
und die resultierenden Punkte einfügen?Python 2, Turnarounds,
224, 226, 230,232 und230,234 PässeDies ist ein recht einfacher Ansatz:
Rennen wie
Die Lösung ist nicht sehr robust. Ein einziger falscher Tastendruck würde zum Fehlschlagen führen. Da die Testfälle jedoch
kaumRechtschreibfehler aufweisen, funktioniert sie recht gut und ist nur in einigen Fällen verwirrt, wenn sie zu lange Wörter enthalten.Bearbeiten: Ich habe es ein wenig geändert, um nicht die bereitgestellte Schlüsselpositionsdatei, sondern ein vereinfachtes Layout zu verwenden. Dies macht es für meinen Algorithmus einfacher, da die Schlüssel in der Datei nicht gleichmäßig verteilt sind. Ich kann sogar etwas bessere Ergebnisse erzielen, indem ich einige Ad-hoc-Tiebreaker für mehrdeutige Fälle einbeziehe, aber das wäre für diesen speziellen Testsatz zu optimierend. Einige Fehler bleiben bestehen, die eigentlich nicht mehrdeutig sind, die ich aber mit meinem einfachen Algorithmus nicht einfange, da nur Richtungsänderungen von mehr als 90 Grad berücksichtigt werden.
quelle
brats
könnte'bgrdsasdrtrds'
das nicht zu verwechseln seinbreasts
. Es würde mir aber auch nichts ausmachen, wenn Sie es so lassen, wie es ist.PHP, Direction Checker,
203 213 216 229231 und229233 bestehtDies beginnt mit einem einfachen Durchlauf durch das Wörterbuch, um eine Liste von Wörtern zu erhalten, deren Buchstaben alle in der Eingabe vorhanden sind (was Martin hier getan hat ), und auch nur zu überprüfen, ob
l.*
stattl.*l.*
wannl
dupliziert wurde.Das längste Wort hier wird dann in einer Variablen gespeichert.
Eine weitere Überprüfung wird dann basierend auf den Tasten an den Punkten durchgeführt, an denen das Wischen die Richtung ändert (+ / 0 nach - oder - / 0 nach +, entweder in x oder y). Die Liste der möglichen Wörter wird mit dieser Liste von Zeichen verglichen, und Wörter, die nicht übereinstimmen, werden entfernt. Dieser Ansatz beruht auf scharfen Drehungen beim Wischen, um genau zu sein.
Das längste verbleibende Wort wird ausgegeben, oder wenn keine Wörter mehr übrig sind, wird stattdessen das längste Wort von früher ausgegeben.
Bearbeiten: Es wurden alle Zeichen in einer horizontalen Linie hinzugefügt, die zu einer Richtungsänderung führten, als mögliche zu überprüfende Werte.
PHP 5.4 ist erforderlich (oder ersetzen Sie alle
[..]
durcharray(..)
).quelle
keypos.csv
sss
).Python 3, Corner Simulator, 241 und 240 Pässe
Algorithmus:
significant_letter
Funktion) (dritter Durchgang)Code:
Laufen Sie mit
python3 entries/corner_sim.py
quelle