Keyboard Swipe Distance
October 29, 2019iOS 13 introduced a swipe keyboard (officially called QuickPath) to the base operating system. This has been available in other operating systems as well as in various third-party keyboards for some time. However, I’m unadventurous and so this was the first time that I’ve tried it out. I’ve been enjoying it but found that some words seem far less efficient to type by swiping (for whatever that means on a tiny, mobile keyboard).
I’ve written a Go package and small CLI to calculate the swipe distance required to type words. It does some simple maths based on the pixel coordinates of key in a screenshot of a keyboard. Using this program we can calculate the total swipe distance required to type all of the words in the dictionary. A caveat is that there may be shorter ways to type some words if they have a unique swipe prefix so that the word can be identified without completing the swipe. This will be ignored for these calculations.
Let’s start by just getting the top 10 longest-to-swipe words from the default dictionary on my machine.
$ cat /usr/share/dict/words |
swipedistance |
sort -k 1 -n |
tail -10
7062.577492 307.068587 pseudolamellibranchiate
7066.836197 336.516009 pentamethylenediamine
7092.310552 354.615528 paraphenylenediamine
7100.013821 338.095896 pseudohermaphroditism
7112.534633 323.297029 electroencephalography
7159.586349 311.286363 phenolsulphonephthalein
7201.797546 313.121632 Pseudolamellibranchiata
7239.048156 314.741224 scientificogeographical
7246.974277 301.957262 formaldehydesulphoxylate
8162.285953 388.680283 mandibulosuspensorial
Those… are some impressive words. Unsurprisingly long words require more swipe distance in order to type them. This isn’t exactly a revelation. What may be more interesting is words which require a disproportionate amount of swiping for their length. The second column in the output divides the total distance by the number characters in the word.
$ cat /usr/share/dict/words |
tr 'A-Z' 'a-z' |
uniq |
swipedistance |
sort -k 2 -n |
tail -10
4455.781192 495.086799 malayalam
3502.734049 500.390578 amalaka
3002.451554 500.408592 palame
2017.697946 504.424486 papa
4614.467659 512.718629 anapanapa
3081.300031 513.550005 palama
2588.000000 517.600000 alala
3109.131964 518.188661 jalapa
2664.697946 532.939589 papal
5124.844360 569.427151 palapalai
Note: there were some duplicates in the output without the additional tr
and
uniq
parts of the pipe.
This list is a little more interesting! We can see words like “papal” near the top of the list which makes a lot of sense when we look at the keyboard. The word requires four full-width swipes across the keyboard in order to type it. All of the other words in the list seem to follow a similar pattern: they all contain long substrings of alternating letters on the extreme left and right of the keyboard. Let’s do another check but exclude characters on the far left and right of the keyboard.
$ cat /usr/share/dict/words |
tr 'A-Z' 'a-z' |
uniq |
grep '^[^qazplm]*$' |
swipedistance |
sort -k 2 -n |
tail -10
3365.101010 373.900112 toxicosis
3418.436110 379.826234 crownwork
3048.202226 381.025278 widowish
2675.409214 382.201316 toxosis
1544.559598 386.139899 sown
2706.518534 386.645505 sorosis
3096.161916 387.020240 downtown
1162.358662 387.452887 lwo
1557.439244 389.359811 soso
2354.619313 392.436552 disown
These words are a little more varied and starting to get pretty interesting! We do see common patterns again e.g. “so” and “is”. There’s probably some filtering we could do in order to filter out these substrings but I’m worried that we’d eventually just regress to the longest word wins situation in our first example.