Kolejna rewolucja w pisaniu na laptopach została wydana pierwszego kwietnia 2014 roku przez SwiftKey . Chcę jednak być pierwszą osobą, która napisała przesuwającego się nano-klona, ale ponieważ nie mogę znaleźć dobrego tekstu przesuwanego do biblioteki tekstu rzeczywistego i nie mogę się doczekać, pytam tutaj.
Zadanie
Napisz program, który pobiera tekst machnięcia i generuje odpowiednik tekstu rzeczywistego. Przykład:
Input: hgrerhjklo
Output: hello
Gdy użytkownik:
Inne przykłady:
Input: wertyuioiuytrtjklkjhgfd
Output: world
Input: poiuytrtyuioiugrewsasdfgbhnmkijnbg
Output: programming
Input: poiuygfdzxcvhjklkjhgres
Output: puzzles
Input: cvhjioiugfde
Output: code
Input: ghiolkjhgf
Output: golf
Zasady
- Program pobierze jedno przeciągnięte „słowo” na stdin lub argv
- Pierwsza i ostatnia litera wprowadzonego tekstu będzie równa pierwszej i ostatniej literze prawdziwego słowa
- Możesz założyć, że użytkownik wykona rozsądnie proste linie, ale możesz użyć przykładowych danych, aby to zweryfikować (stworzyłem przykładowe dane i zrobię końcowe dane testowe)
- W przypadku niejednoznacznych danych wejściowych możesz wybrać jedno z danych wyjściowych, ale spróbuję usunąć wszelkie niejednoznaczności z danych testowych
- To słowo będzie w tym liście słów (ale przeciągnął). Lista słów będzie w bieżącym katalogu i będzie można ją odczytać (oddzielony nowy wiersz, zostanie nazwany
wordlist
, bez rozszerzenia). - Przeciągnięcie będzie zawierać tylko małe litery
- Przesunięcie może zawierać zduplikowane znaki, jeśli użytkownik pauzuje na klawiszu
- Program musi wyprowadzać na standardowe wyjście (wielkość liter nie ma znaczenia)
- Program musi zostać zwrócony
0
jako kod powrotu - Musisz podać polecenie uruchomienia, polecenie kompilacji (w razie potrzeby), nazwę i ścieżkę wejściową do użycia
- Obowiązują standardowe luki (mogą jednak nie pomóc)
- Niedozwolone są wbudowane biblioteki
- Preferowane są deterministyczne, nie golfowe / zaciemnione rozwiązania
- Bez pisania plików, pracy w sieci itp.
- Twój kod musi działać w ciągu jednej sekundy lub krócej (kod jest uruchamiany raz na słowo)
- Przebiegi oceniania są uruchamiane na procesorze Intel i7 Haswell z 4 wirtualnymi kodami (2 prawdziwe), więc możesz użyć wątków, jeśli musisz
- Maksymalna długość kodu 5000 bajtów
- Język, którego używasz, musi mieć bezpłatną (próbną) wersję dla Linuksa (Arch Linux, jeśli to ma znaczenie)
Zwycięskie kryterium
- Zwycięzca jest najdokładniejszym rozwiązaniem (ocenionym przez program kontroli , na podstawie dostarczonej listy testów)
- Popularność jest czynnikiem rozstrzygającym
- Tabela punktacji będzie aktualizowana co kilka dni
- Przerwy i awarie liczą się jako niepowodzenia
- To wyzwanie potrwa dwa tygodnie lub dłużej, w zależności od popularności
- W końcowej punktacji zostanie użyta inna, losowo wybrana lista słów (ta sama długość, z tej samej listy słów)
Inny
- Możesz użyć programu sterującego do przetestowania swojego programu
- Jeśli jesteś niecierpliwy i chcesz, aby Twój program był szybko aktualizowany / dodawany, rozpocznij problem lub ściągnij żądanie na https://github.com/matsjoyce/codegolf-swipe-type/blob/master
- Wpisy są utrzymywane na https://github.com/matsjoyce/codegolf-swipe-type/blob/master/entries
- Dzienniki każdego uruchomienia programu są przechowywane na stronie https://github.com/matsjoyce/codegolf-swipe-type/blob/master/logs
- Główny dziennik na https://github.com/matsjoyce/codegolf-swipe-type/blob/master/log.log
- Pozycja każdego klucza zostanie podana jako plik csv w bieżącym katalogu o nazwie
keypos.csv
, z wartościami x i y podanymi w stosunku doQ
(patrz https://github.com/matsjoyce/codegolf-swipe-type/blob/master/ keypos.csv ) - Każdy klucz ma wymiary 1,5 x 1,5 cm (ta sama jednostka, co w keypos.csv)
Aktualne tablice wyników
lista testów ( logi ):
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
Final Run
lista testów ( logi ):
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
Dobra robota dla wszystkich i hgfdsasdertyuiopoiuy swertyuiopoijnhg!
code-challenge
keyboard
matsjoyce
źródło
źródło
l
Odpowiedzi:
JavaScript, ES6, Three Pass Optimizer,
112 187 235 240 241243 i231234 przebiegówTrzyprzepustowy filtr, który najpierw rozpoznaje klawisze krytyczne w sekwencji naciśnięć klawiszy, a następnie przepuszcza sekwencję przez trzy filtry:
Kod
Kod zakłada, że
words
obecna jest zmienna o nazwie, która jest tablicą wszystkich słów z tej stronyZobacz kod w akcji tutaj
Zobacz przypadki testowe w akcji tutaj
Oba powyższe łącza działają tylko w najnowszym Firefoksie (33 i nowszym) (z powodu ES6).
źródło
keypos.csv
teraz użyć odpowiedniego pliku. Dostępne funkcje IO są wymienione na stronie developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…Ruby, Regex Solver -
30 140 176 180 182187 i179183 podańUstalę wynik później. Oto bardzo naiwne rozwiązanie, które nie uwzględnia układu klawiatury:
Pobiera dane wejściowe z ARGV i drukuje wynik. Po prostu filtruję listę słów według pierwszej i ostatniej litery i wypróbowuję wszystkie pozostałe słowa pod
^g.*u.*e.*s$
kątem wejściowym (eliminując duplikaty liter i używając wyrażenia regularnego typu „zgadnij”) i zwracam pierwszą z nich, jeśli istnieje to wiele rozwiązań.Uruchom to jak
Każdemu innemu możesz użyć tego kroku jako pierwszego filtru - uważam, że nie wyrzuci on żadnych poprawnych słów, więc ta wstępna kontrola może znacznie zmniejszyć przestrzeń wyszukiwania lepszych algorytmów.
Edycja: Zgodnie z sugestią PO wybieram teraz najdłuższego z kandydatów, co wydaje się być porządną heurystą.
Również dzięki es1024 za przypomnienie mi o zduplikowanych literach.
źródło
paradoxically
, jakbyl
pojawiły się tylko raz na wejściu, a nie dwa razy, jak wymaga wyrażenia regularnego.C ++, dyskretna odległość Frécheta -
201220222232 i 232 przebiegiDla mnie problem bardzo wymagał odległości Frécheta, która niestety jest bardzo trudna do obliczenia.
Dla zabawy próbowałem podejść do tego problemu, wdrażając dyskretne przybliżenie opisane przez Thomasa Eitera i Heikki Mannilę w Computing Discrete Fréchet Distance (1994).
Najpierw używam tego samego podejścia, co inne, do filtrowania wszystkich słów na liście, które są podsekwencjami danych wejściowych (również uwzględniając wiele kolejnych wystąpień tego samego znaku). Następnie wypełniam krzywą wielokąta od litery do litery każdego słowa punktami pośrednimi i dopasowuję ją do krzywej wejściowej. Na koniec dzielę każdy dystans przez długość słowa i uzyskuję minimalny wynik.
Jak dotąd metoda nie działa tak dobrze, jak się spodziewałem (rozpoznaje przykład kodu jako „chide”), ale może to wynikać z błędów, których jeszcze nie znalazłem. W innym przypadku innym pomysłem byłoby użycie innych wariantów odległości fréchet („średnia” zamiast „maksymalnej długości smyczy dla psa”).
Edycja: Teraz używam przybliżenia do „średniej długości smyczy dla psa”. Oznacza to, że znajduję uporządkowane mapowanie między obiema ścieżkami, które minimalizuje sumę wszystkich odległości, a następnie dzielę je przez liczbę odległości.
Jeśli ten sam znak pojawia się dwa lub więcej razy w słowie słownikowym, umieszczam tylko jeden węzeł na ścieżce.
Skompilowałem kod z clang, ale
g++ ./thiscode.cpp -o ./thiscode
powinien również działać dobrze.źródło
programmijng
- daje mipang
.programming
tak, jak powinno. Czy możesz odkomentować linię// cout << thispair->first << ": " << score << endl;
i wkleić uzyskane wyniki?Zalicza się pytanie Python 2, Turnarounds,
224 226 230232 i230234Jest to dość proste podejście:
Uruchom jako
Rozwiązanie nie jest zbyt solidne. Pojedyncze nieprawidłowe naciśnięcie klawisza spowodowałoby błąd. Ponieważ jednak zestaw przypadków testowych nie ma
bardzo małobłędów ortograficznych, działa całkiem dobrze, tylko myli się w niektórych przypadkach, w których wybiera zbyt długie słowa.Edycja: Trochę go zmieniłem, aby nie używać dostarczonego pliku pozycji klucza, ale uproszczony układ. Ułatwia to mojemu algorytmowi, ponieważ w pliku klucze nie są równomiernie rozmieszczone. Mogę osiągnąć nawet nieco lepsze wyniki, włączając niektóre ad-hoc rozstrzygacze dla niejednoznacznych przypadków, ale byłoby to nadmierną optymalizację dla tego konkretnego zestawu testowego. Pozostają pewne błędy, które nie są tak naprawdę dwuznaczne, ale których nie rozumiem za pomocą mojego prostego algorytmu, ponieważ uwzględnia on jedynie zmiany kierunku większe niż 90 stopni.
źródło
brats
Może być'bgrdsasdrtrds'
czymś, czego nie można pomylićbreasts
. Jednak nie miałbym też nic przeciwko, jeśli zostawiłeś to tak, jak jest.PHP, Direction Checker,
203 213 216 229231 i229233 przechodziZaczyna się to od prostego przejścia przez słownik, aby uzyskać listę słów, których wszystkie litery są obecne na wejściu (co zrobił tutaj Martin ), a także tylko sprawdzanie
l.*
zamiast,l.*l.*
kiedyl
jest duplikowane.Najdłuższe słowo tutaj jest następnie zapisywane w zmiennej.
Następnie przeprowadzana jest kolejna kontrola, oparta na klawiszach w punktach, w których przeciągnięcie zmienia kierunek (+ / 0 do - lub - / 0 do +, albo x, albo y). Lista możliwych słów jest porównywana z tą listą znaków, a słowa, które nie pasują, są eliminowane. To podejście polega na ostrych zakrętach podczas przesuwania, aby być dokładnym.
Zostaje wyprowadzone najdłuższe pozostające słowo, lub jeśli nie pozostały żadne słowa, zamiast tego wyprowadzane jest najdłuższe słowo z wcześniejszego.
Edycja: Dodano wszystkie znaki w linii poziomej prowadzącej do zmiany kierunku, jak to możliwe wartości do sprawdzenia.
PHP 5.4 jest wymagane (lub wymienić wszystkie
[..]
zarray(..)
).źródło
keypos.csv
sss
) - nie sądzę, aby ich zduplikowana eliminacja mogła je złapać.Python 3, Corner Simulator, 241 i 240 przechodzi
Algorytm:
significant_letter
funkcja) (trzecie przejście)Kod:
Biegnij z
python3 entries/corner_sim.py
źródło