Skip to content

Instantly share code, notes, and snippets.

@splch
Created July 26, 2023 06:55
Show Gist options
  • Save splch/e5366de831d50e73fabdfa072841d7ad to your computer and use it in GitHub Desktop.
Save splch/e5366de831d50e73fabdfa072841d7ad to your computer and use it in GitHub Desktop.
first_key_down next_key_down freq mean std
A A 75865 415.7420473683694 211.15077174990657
A B 1004970 165.28457375000784 85.53598674842621
A C 2195967 167.4397778601112 61.035602729802285
A D 1441567 162.8665241188316 31.321963905203503
A E 3605848 405.72196709898844 208.6443786776474
A F 651427 402.95098691571224 203.15117061387028
A G 638791 395.8929611390238 198.9873950522662
A H 5849734 197.66910352690073 90.16204233255728
A I 601633 249.09574362732477 202.01115726544845
A J 145136 182.78835755322746 70.01346006674824
A K 188008 231.07415453689623 40.259920296178336
A L 1923458 131.40171904074572 44.36320607895959
A M 2050469 171.86272721603842 80.38711713853482
A N 1031845 400.52160925750104 207.84166146006515
A O 207409 412.38261893660524 221.95685277173533
A P 1049739 248.7620485213996 182.94352397819813
A Q 4423 428.98331569214247 257.52181598842435
A R 1851473 411.17181244066546 211.6090484460147
A S 1142245 246.295802541093 46.71313823222049
A T 1826112 161.57161751091127 48.895739916968935
A U 386426 413.78505554004033 216.2129431677142
A V 244282 404.6055688537622 204.15124416513382
A W 2821952 195.24282698672576 101.21384311059043
A X 76339 423.8292662462772 211.6690486988025
A Y 159859 400.81787012186453 210.68225662632662
A Z 57955 443.55629688821216 215.84946514136533
B A 1042890 265.04115251709425 146.01040941657976
B B 73655 397.2560443815612 186.99389950312263
B C 1061 480.42650818040545 291.7829183627931
B D 19709 482.5245015895784 265.6008203195539
B E 153460 467.05009153573644 257.8176037027003
B F 755 437.73020213902896 235.83822101709046
B G 4856 441.23352666260666 261.8227674764496
B H 20767 491.61345705101166 275.16075763974
B I 217666 230.08715158131758 69.36765151301839
B J 414 435.09461045798275 238.31550646095772
B K 6472 489.5040067490531 255.31434736304755
B L 39301 447.45233391671627 244.51693202191586
B M 287335 451.9613836384752 238.6965914758822
B N 516502 477.5265096899989 299.8057147669267
B O 369872 451.163962273822 241.4632627330085
B P 5431 471.4353934993927 254.34181072631617
B Q 116 510.12822113950347 272.3508358413191
B R 73287 514.9395177292571 290.99307299588673
B S 30225 495.00353434574436 271.1557286921917
B T 27952 472.1254744734632 245.59067661290626
B U 213544 452.5880666155165 242.91825893122473
B V 684 366.9549328538587 224.45384179464094
B W 9002 445.8977938066206 240.32352629079577
B X 2755 391.36664902547585 201.68079023910113
B Y 133964 462.11523979501635 246.59394594862354
B Z 1629 425.0333156921425 254.40810714962385
C A 1606339 430.5827682630645 219.60272211376062
C B 8755 463.08384062652567 249.0007519070735
C C 159642 401.4272286448303 187.50507064860543
C D 9925 466.4080201838683 253.74362028022614
C E 1311265 443.7156272370444 217.436842773317
C F 3218 427.9876167674113 231.92075503218297
C G 1613 610.80920565978 485.4520724399388
C H 4514 399.0390051165066 214.80755055319403
C I 1889601 215.62307069070286 52.87317148576393
C J 933 426.3286231355082 244.09682878050364
C K 2460 125.70674486803519 29.657181424230572
C L 34589 436.93224495885244 234.52084971046506
C M 19795 491.5640219798255 263.9464211143647
C N 935646 425.22058488584156 231.39037329383524
C O 393142 432.93659937809684 236.5159193133647
C P 8672 455.21085192402654 251.4173489770244
C Q 100 455.2639358471813 218.93769563844722
C R 246047 477.96744185354925 236.9339127579937
C S 507952 450.15348653970176 231.20980098254915
C T 283540 456.299122047303 224.3588265326724
C U 678690 414.73110026813345 223.7095658276743
C V 769 406.77471061967873 264.7470642597932
C W 2721 484.3835923173154 248.71896512781672
C X 104346 461.25679086944746 240.376300362458
C Y 31192 485.5911771764675 267.7035213837771
C Z 428 418.4717214892439 238.12681848301452
D A 1766848 423.1953800381293 216.44181895005315
D B 5600 454.55529693481543 256.8568038659023
D C 10104 432.6922225747336 236.20207719243518
D D 219914 401.6621606795786 186.8424508057322
D E 3854844 417.53057144149346 196.80381112195948
D F 768 399.1880118247392 252.31147564964965
D G 7850 482.3045922878872 263.2995950907008
D H 36521 431.98353015292685 230.91909672568488
D I 1427104 405.3098833130057 215.7483468039293
D J 818 398.249345416134 213.27625690904176
D K 5214 437.9136283019072 237.2113615007442
D L 1260394 391.86315477224093 205.52615513761296
D M 3219 415.2075916559868 221.443272651761
D N 5951524 395.99943204499385 210.7473322599934
D O 1011922 411.95585716553103 222.48449776858274
D P 24448 449.6892880004707 250.19633184787295
D Q 139 426.48123235880917 216.0222382107776
D R 752741 442.48719142982566 217.7088909235004
D S 56285 461.3220196459573 247.77142790874416
D T 8923 472.5890963512457 240.94513554239154
D U 278084 432.2549908444231 237.4834703088236
D V 2683 449.42093037104155 240.9385570182298
D W 18352 459.44807638676343 240.2895381924268
D X 155 465.5859046889062 273.0518103734882
D Y 25542 464.5134199927569 260.5646308369986
D Z 440 486.58233529998563 298.39852197203214
E A 48036 456.95626862573374 238.61641641521078
E B 2775984 303.5007558252443 205.71389119849243
E C 1701636 405.9664204001624 205.72507551981317
E D 2216598 174.44479936892927 33.50520995673231
E E 2292952 402.7108439042232 186.3088656604345
E F 1038208 179.47882910985925 33.900947057681165
E G 1590249 391.2983707422509 29.92429705798867
E H 11538487 169.05385681207048 77.93644696494532
E I 1350236 402.49726909019284 211.5911098598291
E J 169151 155.83557079158078 44.266266136738174
E K 1998297 390.92329141670916 200.25313481265587
E L 3365891 172.591152223506 77.69750099401261
E M 4368660 384.33971178058334 196.5547623492714
E N 3124824 153.4302399028873 57.6584517403808
E O 279732 477.48653588022717 50.93212236617125
E P 1762269 194.2566123055106 40.50073830601131
E Q 363 449.8957544176327 237.65273225679044
E R 7022985 158.53590015847357 82.68278277444125
E S 3344529 188.13551970456342 68.0228303706487
E T 4099095 214.93730091327683 132.27143335997567
E U 479256 405.39047460262213 213.5940037232013
E V 4148230 185.01551586692727 29.562915034011546
E W 2402427 178.3430251582369 85.52707044225332
E X 46772 440.3580000419198 208.71698585616667
E Y 726042 173.06175124610138 48.20605599551516
E Z 171236 443.2769912873806 217.12129970038774
F A 351192 158.27115653326643 64.69689872764656
F B 4034 463.8782692113988 248.9940151940864
F C 1567 460.60325931441173 240.64637508068418
F D 12169 453.54321695995355 261.62601381780075
F E 478679 444.0852734874947 230.00647945981578
F F 595496 398.96821934016987 184.2060551752099
F G 5968 483.81700363540494 308.78290506977197
F H 7432 451.979394123515 274.07186850606746
F I 917532 193.00650887573966 115.50766609965962
F J 613 395.7552455167039 223.42729671086352
F K 19095 480.3506870352986 259.3271774720737
F L 290315 423.4920017591619 230.7208147666683
F M 23079 471.25537158036605 265.3793019277522
F N 156210 442.4072695714686 246.43631294612837
F O 2797687 393.1445102256333 207.594874451686
F P 6406 424.0316983955814 235.28951716202675
F Q 48 399.0499823588092 246.15416083009052
F R 110214 482.79565002141544 255.00671878084606
F S 31284 508.72545963764753 274.47968913221877
F T 26501 525.7246129006811 288.0835864067295
F U 131117 435.4411029320774 234.17337200313625
F V 137 415.24475847821213 244.72262170968986
F W 9437 465.27522507725575 248.06626906162197
F X 1502 441.8428395016663 202.58465474307656
F Y 18716 504.212988139156 297.7346006616151
F Z 208 432.61664902547585 254.3849536592149
G A 756554 431.79822159860794 231.16204684380162
G B 1390 399.4884438972707 216.49520014897706
G C 1489 446.97407326790005 242.02759141145555
G D 72819 447.8236765658367 233.35611260460405
G E 294166 458.9758174094703 243.5554879091617
G F 3437 419.71591757302025 265.41802085765784
G G 163066 397.58819123517407 185.32000335188195
G H 1543 370.2509274267359 213.54266846822975
G I 1206059 423.173578590384 229.27508488180655
G J 268 401.775379184206 218.60128282774707
G K 8248 441.72229005111683 255.71054553981315
G L 16169 492.63521912761144 283.41294838296716
G M 8947 430.81105047026426 239.85418084640673
G N 5851764 387.5795966210225 203.19405973656495
G O 393343 462.6569442670932 257.8664594924874
G P 4657 516.3169774327008 275.41544705780916
G Q 27 421.0369388805483 227.37619269101822
G R 258412 459.62978346478735 232.4388735760263
G S 16495 521.2963995199228 291.90617665783384
G T 6509 420.72157326790006 224.54216064988736
G U 758084 418.95214703197513 228.34425680261566
G V 438 391.0144984878414 237.74845276147096
G W 1305 461.46753961071755 250.09608049245932
G X 256 431.44998235880917 207.86044530853954
G Y 7607 454.74727965610646 258.4475718708253
G Z 869 447.39229005111685 259.41471186878493
H A 366733 418.0754372096181 233.91697005847485
H B 4240 410.89045854928537 248.99165207106603
H C 2244002 227.61392522123828 160.7413285516987
H D 14915 441.7005597260147 248.11594289684177
H E 172171 425.74720697154584 246.40647955394417
H F 932 395.8582176529268 205.72124787461524
H G 1455476 381.9241739921649 192.48822401102166
H H 66284 398.9982404970159 223.62546931967026
H I 10361 430.88109515214757 227.6680065998575
H J 1048 420.15035456724587 274.70785018811796
H K 10995 845.1528125474885 891.9076182455382
H L 4787 455.497760136587 258.3488214376973
H M 2302 453.37808693397255 235.81560322591702
H N 24744 463.4646763190848 253.69640689586296
H O 192659 455.62113543233266 251.0254568473352
H P 240215 454.3665636976035 241.31681901788
H Q 80 418.569663209873 227.76145361724537
H R 49147 428.02883634750674 237.34722433092855
H S 1748967 231.66629944352536 120.25089325620044
H T 14385499 149.41004041607118 73.1216577961689
H U 32677 451.39998235880915 233.84641350032604
H V 447 397.16821152547584 203.28209139259732
H W 2123381 181.3736504711805 79.026326994863
H X 10404 414.6482072108802 218.9051454557545
H Y 9532 103.32557811618726 42.71715323501023
H Z 5335 524.9231624354375 316.35884961049464
I A 1309871 180.27101552311456 36.41564424066992
I B 488056 225.56042453716265 44.25194097010775
I C 621184 404.4216851147147 209.32307093361035
I D 1499879 380.41211280433413 245.42809188400054
I E 617304 413.60929550860334 221.5925139070238
I F 994662 127.62686912678264 29.87510344274783
I G 606971 210.7669289028003 50.11775800410445
I H 3906841 174.02180874390297 61.81500616928431
I I 21346 93.65093212237093 46.317194318858725
I J 34374 205.4039590172088 45.88867798463007
I K 961421 190.84216295849478 18.775303287892854
I L 3183893 410.11366843317643 200.8333285427803
I M 1150368 177.63065303531812 40.495364092395256
I N 1321585 154.31423499879213 31.822185335999784
I O 603686 401.5037780710078 209.12272040389013
I P 655400 169.3598309914513 43.85570952818377
I Q 9700 427.89971497913 235.39023029747955
I R 2509847 349.48564011694185 125.8716879128125
I S 1679218 187.5333184573782 65.06076953993389
I T 3448133 391.3405895870197 205.90440615636044
I U 330992 403.9450335107679 211.85811213449483
I V 852865 402.74752382421843 207.42695471832542
I W 1786880 164.36061840262624 64.64017508407986
I X 72417 428.30363240060353 226.71439908219122
I Y 265550 221.0046031865324 46.214019070237676
I Z 81202 415.2701878382612 216.8882691532264
J A 33995 462.18798152396846 267.4412233673478
J B 25141 446.74685735880917 258.78416876703744
J C 580 426.3675460981859 217.64617902116095
J D 7107 498.5157718324934 316.77875248239326
J E 18723 459.6675446130687 277.67032934616435
J F 639 395.296136204963 220.7440104199698
J G 598 414.09014140453485 217.82952551533305
J H 834 341.9980923244449 184.90449933677343
J I 7426 514.8893377447295 306.4812631727148
J J 874 393.1923681456112 208.94994600107682
J K 1449 376.3865817824403 228.4706588702069
J L 1295 451.9955798430859 241.617371463991
J M 473 434.6980592818861 230.16696330150964
J N 61119 479.8173544928479 253.46901908573292
J O 25799 484.5532098178255 270.0591966063756
J P 663 488.25542168935306 262.89853231687243
J Q 37 477.82498235880917 261.71054424218346
J R 2809 461.42876219965797 257.39086427445176
J S 1118 440.3029769141631 237.3264102582799
J T 1160 238.8118376841561 46.29656644475151
J U 3701 409.1634116154039 232.63075562841738
J V 160 478.1383881559106 291.8141344230618
J W 399 441.39100348556974 240.92166217744412
J X 179 699.557125215952 698.4914312682777
J Y 1077 424.1177038777965 209.97221857544523
J Z 52 535.3388712476981 349.7965512853268
K A 814988 397.36227475926967 207.96997645290895
K B 939 443.1430913331682 231.1014779253318
K C 1183956 391.6217486304788 204.3935572451903
K D 4708 414.52792912687 229.31801625724626
K E 240673 395.5423021255992 208.31491661004088
K F 773 419.3027601365869 238.83620031328059
K G 3785 422.6849823588092 237.9275489911163
K H 2392 443.9515798028986 246.90202011335737
K I 693535 414.0787892380639 191.75197485470113
K J 2326 389.1347649675048 236.3421392034867
K K 10659 398.9661779764656 189.95296680767729
K L 277319 398.0682323107661 210.22239017826104
K M 1523 428.36694142313667 226.7665783892856
K N 1061778 400.6692872510834 208.95248988771908
K O 672965 240.4962300145349 112.05617674766427
K P 3782 436.6856511486181 223.8316361152732
K Q 37 390.6583156921425 204.52574895892252
K R 470146 405.6263223336364 218.99655700795984
K S 239948 419.6476259728638 227.9607806933063
K T 3698 456.68016035233666 255.53336959191031
K U 24073 443.47510342418445 211.07822708714477
K V 186 459.8846346369866 255.01962760665515
K W 9677 471.92044369302755 260.65791581234885
K X 258 402.7457570066965 215.044420012536
K Y 10213 450.94089144971826 234.14999061558754
K Z 1271 445.80414902547585 247.0136145788392
L A 4103784 395.1126417890554 204.3139012665817
L B 935837 414.57536092622126 213.38664870257378
L C 500067 250.77008942289962 36.6467782463027
L D 145566 407.2137698800735 215.44342453898466
L E 2369067 406.0486067812974 212.522533296876
L F 215679 398.21064329332364 207.27466657892845
L G 211394 409.20468548292644 214.77654776937638
L H 44421 454.99377134009814 237.27244717978488
L I 1879989 416.48242216197406 199.141924456478
L J 717 404.97300867459865 227.02512691044456
L K 58155 425.22520108310437 215.12864908972284
L L 3953206 394.2782831122343 183.0231524572147
L M 19604 460.06810818371014 239.1493923574214
L N 316534 419.64598404625644 208.55804308937243
L O 1296864 421.18359792771076 194.28556815309494
L P 1148276 185.91938200267776 60.558932036971584
L Q 418 397.2106206566815 208.8939030943501
L R 771273 430.81097770080476 235.2866335015116
L S 301743 401.76174742124095 212.51030909962623
L T 467275 424.73468921121554 232.18391410872954
L U 1335540 418.763628302666 201.80663602676805
L V 3253 411.5416631737497 212.84664396413845
L W 51494 436.3278906488476 235.68524301699605
L X 974 439.24258012417226 238.1712654136595
L Y 55403 438.8853583052786 227.35462993304446
L Z 7510 384.98259105446135 204.36627245601642
M A 1503589 263.25933956533476 94.93863487945612
M B 7144 446.2111507436889 250.8475311196411
M C 2946 446.9570875151226 241.79259969234556
M D 57014 461.7001476371379 253.8300692098091
M E 1193069 262.2955305799611 140.90912007519177
M F 1871 448.9467334959112 249.96580530946417
M G 14273 457.7899823588092 250.71755232237464
M H 62395 487.46143167464277 250.15753539024223
M I 1334011 143.95963444838458 84.41614555148132
M J 348 407.16454928794303 236.17965142031545
M K 8689 426.8945636395973 241.1170978302257
M L 116500 442.29473688832405 225.10808922502503
M M 372910 397.0810613389087 185.326293768286
M N 48057 427.8167761753119 241.1843052869853
M O 2652612 406.3840917938321 210.05559789193424
M P 34686 453.8300299589678 230.20344674446113
M Q 99 402.64229005111685 227.80136608104732
M R 333769 414.621106421485 220.9440085080625
M S 214650 435.98897295752266 238.47740885375714
M T 85665 453.6672641749409 243.0816244096834
M U 443265 431.31024976180294 200.7296870495594
M V 2474 431.6642680730949 236.56127797709075
M W 2953 467.9338688426957 257.39570395509094
M X 1872 438.5499823588092 225.36423831355413
M Y 73599 462.0715435122729 235.58453624863495
M Z 1460 430.74805928188607 247.98090080240797
N A 8463704 136.69563338794615 53.96386570262702
N B 3765 377.45604541458925 233.86893204899877
N C 4277 419.48523334583683 224.07316041834505
N D 304058 438.9236951356905 257.52113588306463
N E 5047364 396.26913022758526 202.90278645403302
N F 1268 426.5994288532741 226.91623641902333
N G 144004 407.766275829402 215.54131849172398
N H 69645 424.3023926988185 206.7439786328746
N I 11063479 187.93250231487536 88.4528774577583
N J 749 407.61487597583044 229.89790774086035
N K 526077 394.2471618240213 200.66577557106024
N L 11743 450.9367734824442 232.91260696225166
N M 65880 273.933734939759 70.77793271895156
N N 526143 395.77054387268805 184.84311597863692
N O 6038567 178.89920623184577 65.29431297585415
N P 3299 436.2598049464336 222.89085529959428
N Q 395 396.5667224469149 216.53931028781074
N R 554703 420.4004118107573 227.6185702008642
N S 260619 423.0715532030881 237.12397949952094
N T 38096 438.8284816134058 246.021122701307
N U 1653723 97.28718758977305 31.22428761077815
N V 2127 435.0964987522518 235.2895303364654
N W 387861 400.987922563845 204.8823234785706
N X 672 420.5716039804308 222.91782869569704
N Y 39366 451.3702310746783 225.93362021090013
N Z 2109 88.94318181818181 46.72066604117046
O A 32674 227.60971085651937 64.18267576692024
O B 1218279 199.22302756212622 52.61795015784362
O C 2376050 163.14687486414027 58.55587754996981
O D 1684346 158.32276310131527 43.20945406040401
O E 487522 427.78729118233855 236.31643606806912
O F 1994144 254.22008755020596 63.08488973045783
O G 1626693 237.22291491964864 31.47529008031755
O H 2840220 225.44753078801736 152.23608768465968
O I 1418727 387.23264007984375 199.36079689034358
O J 314958 163.16563128744917 62.27190647715685
O K 69134 427.1568478348046 216.5455015044819
O L 1980723 196.8812011890966 31.7202808911741
O M 1611554 161.96073342792374 67.18650953070177
O N 2580495 142.8042034319622 63.710659639600316
O O 1956943 395.9490959012778 184.06261623627438
O P 1001535 1488.2100855876608 1341.3108846130883
O Q 571 402.2091064464004 218.6794243921379
O R 2401141 260.41036007297 34.31974731330516
O S 2674751 157.68599249961358 51.02475761842812
O T 5787881 170.12721343115254 25.657592912373747
O U 40312 413.40380807613116 217.23856406998985
O V 210034 398.9825357130709 207.53035545680527
O W 1363401 284.6103205083093 143.7948495870791
O X 8096 424.69195356589665 230.07304453837642
O Y 1939087 179.9115193656698 84.48480922832167
O Z 27084 457.37939412351506 238.5330800067839
P A 733603 255.39699222064218 57.25211825694203
P B 2503 461.181180574233 244.28396402489292
P C 1599 424.92131865271307 228.0961229070279
P D 10524 429.26492897802626 235.04501441687137
P E 600334 421.80117665237634 228.31909633366
P F 416 170.61466011466013 49.66962884040188
P G 2918 432.3004786367248 240.19161233449785
P H 5424 452.82383556981836 232.208433459388
P I 287599 433.5268956023749 222.1678899510138
P J 1536 423.0809837305513 224.05809701622252
P K 5312 421.49164902547585 235.1246502382111
P L 107367 411.53102870834743 204.50650985000323
P M 608915 428.58596422912643 217.88558355446486
P N 15324 462.33988821654975 250.72870495787907
P O 955772 407.7574437333209 205.91214457643437
P P 612401 397.21205348414844 184.6761248118067
P Q 63 451.3944268032536 243.2022886293874
P R 103994 453.7750447082195 249.93375947351853
P S 1106444 201.13403878914954 63.47768124859534
P T 27619 476.29810562108906 275.5448115917163
P U 902516 420.17732340533297 217.67273744524428
P V 346 439.626948650944 243.57205334228502
P W 1940 420.26521614463115 223.99904766958556
P X 157029 432.6082374492438 239.12379983074004
P Y 67815 451.0546378872492 247.14122203785476
P Z 307 333.47169811320754 65.49549279425031
Q A 34131 528.316626743836 308.916265995497
Q B 1245 410.60276013658694 204.91989267182652
Q C 5727 436.86069664452344 224.5850643606419
Q D 1322 465.37127865510547 247.34672984687768
Q E 57001 501.93917154799834 273.4518225430268
Q F 33 457.33748235880915 228.8369881753751
Q G 91 452.268164176991 236.3625440717218
Q H 968 401.9462229603129 206.72041687584255
Q I 19053 537.89525599065 308.5584760947173
Q J 45 434.01248235880917 216.90182329102106
Q K 94 432.44998235880917 249.2906892337653
Q L 266 449.1136187224455 250.46624642769123
Q M 157 423.6117470646915 226.5688950243126
Q N 8356 534.1380724096443 309.88698713219264
Q O 2137 459.24475847821213 263.1597202644854
Q P 180 424.97039052207447 216.81586352279476
Q Q 108 397.17539219487475 213.54239902721966
Q R 2848 471.43956569214254 250.84858014303867
Q S 30192 453.97978368331246 236.4281982300255
Q T 96 459.55319336798345 253.21478648872892
Q U 1275 393.60407040912366 218.3269469887536
Q V 25 433.19998235880917 207.00094341792857
Q W 97 388.2856466944735 226.00204986412814
Q X 471 492.44998235880917 170.44590500551087
Q Y 268 461.8292927036367 269.4465715978691
Q Z 110 453.31664902547584 221.81757899895678
R A 3938622 242.20532323155422 133.13671669389615
R B 472191 272.3301684682053 111.16681782178786
R C 551660 246.23398021640122 36.618848238096724
R D 447996 236.5585691188359 60.280644568465334
R E 7637920 388.26875901247814 200.88775321665128
R F 987509 189.4080666164771 28.378738497075066
R G 624616 424.31124523442634 205.04689441669635
R H 340260 425.153910509273 227.0991928267453
R I 1175281 81.88196006154783 40.53006588611704
R J 2854 429.0264234615661 230.0817342248872
R K 18700 413.72835809266434 226.21376193967214
R L 73368 438.37800671073376 239.45930440822121
R M 40121 435.18115459194604 235.3179243095559
R N 20538 331.30901412083307 68.65638306880427
R O 4834743 394.11641560838694 205.29377396096268
R P 1067897 198.19217624583644 56.59382357113111
R Q 151 448.14522045404726 268.37864419877394
R R 537312 400.0143864261206 186.0346987612685
R S 17389 143.39449305198147 74.18271152485222
R T 1168164 198.79799290276793 43.19500176022868
R U 2383810 406.8571153977708 216.9389635508948
R V 5251 447.41070803664013 231.0188946457379
R W 209116 439.88256780649215 227.84977283672887
R X 346 471.87218515601194 231.65774609490532
R Y 30932 447.4565647706048 258.91554384969015
R Z 831 465.5464735868793 249.9777555488398
S A 3790310 206.92504315472198 62.290232484139146
S B 618842 453.0471790217953 240.46658992007917
S C 69641 430.86604252377765 223.62824894724216
S D 556272 412.59659166089267 216.8426758966844
S E 4119699 322.562071935992 38.09926134655335
S F 16247 433.14212543432126 222.8213632248529
S G 370501 418.92068653368824 220.86159112777827
S H 68376 413.92712259864925 217.45775595995508
S I 4219012 185.6283875079038 48.256013462368074
S J 3168 405.5421514509783 199.85221277438728
S K 361995 401.4862311826153 208.80384527814573
S L 537457 181.22366584616947 32.44999798309307
S M 264076 403.9980422715347 207.5465569205196
S N 1137327 416.9389568312128 224.88210659670875
S O 1112966 400.69409964705665 212.73795635702217
S P 213827 429.0847546334928 230.17188994759852
S Q 487 411.544100005868 222.62103397559568
S R 1418508 432.05359236810335 217.85271280192148
S S 1348118 402.7140231614195 186.09000711384382
S T 1073695 421.5912347689022 215.62411494441602
S U 2294700 165.6145392509522 88.87012000562828
S V 8308 453.2518289497183 229.63013331097102
S W 170183 144.1765793121658 45.82363194458772
S X 1563 478.6639975103243 282.82237183019697
S Y 600225 404.8791692024039 210.42612536117676
S Z 934 586.2975864436481 332.4931567897809
T A 5868813 173.29506478249402 42.81935213716738
T B 38101 454.22951630004525 237.96996673499683
T C 951220 436.3775583480391 205.71367565341774
T D 11418 464.52223985826174 244.9004798902467
T E 2209516 411.7878820870229 210.49157742198383
T F 419104 428.15101845207545 200.87214225934244
T G 33561 268.8040920931014 61.260539574771194
T H 960318 386.6444579720182 198.0686893483076
T I 5188483 166.42369783623047 69.51672042890456
T J 273 396.9561425230802 214.81757311987812
T K 9258 442.20089587890664 250.79786609806186
T L 293846 437.8244210462012 240.02535750534847
T M 12106 433.17441026065643 234.0888258360846
T N 3203919 409.062071199793 216.72749275078746
T O 2356791 404.2221813717697 214.86411409610218
T P 250950 444.37093706709277 239.9627685092184
T Q 456 392.9077288376824 208.2985424077042
T R 1241688 422.3052756405649 202.69558042868024
T S 4691965 239.32595173741765 42.884882721655394
T T 1040999 398.3254983467335 185.4488479707166
T U 2730481 401.29778820773856 208.63292772173327
T V 1006 459.5691127935918 221.55540534870354
T W 9156 440.24110939104946 227.2170798407344
T X 171447 431.9357520871404 213.29719549816193
T Y 182393 419.1861397415384 222.02459471637107
T Z 990 315.2443181818182 81.32150679689194
U A 633260 427.07437945648985 229.207859606842
U B 1363407 210.88638128103753 57.984464127403285
U C 412839 416.3606791115807 221.03185318177015
U D 316696 411.8861801559638 216.87193917434328
U E 51030 475.3179953305073 264.40018332704153
U F 561566 401.60144156568487 209.72404028000733
U G 452092 404.0890327614708 210.90131279585705
U H 336453 414.1732016586968 207.186230945863
U I 28134 415.99252678086447 233.90039132769715
U J 707948 206.7122919635879 50.43777643749226
U K 35539 458.40867411508157 233.06868509186359
U L 367225 280.81672866914676 44.29935993097907
U M 492127 217.0507529558183 28.761067733447714
U N 235949 321.05233201154545 37.476530012029365
U O 5838220 188.70760006581708 56.14331380907968
U P 368486 305.69516125210305 169.11363244588551
U Q 390858 411.8996840418511 216.04510782331744
U R 475543 579.9806651126066 50.16337388832529
U S 927756 211.77759941269207 53.2080839942403
U T 894432 416.5960186339954 220.6591615057091
U U 14006 407.78957626743863 226.74702306058447
U V 5715 425.5770806801521 221.94890866146338
U W 9976 414.2638107839052 216.5854324538242
U X 19836 469.9882259848715 260.09746505967064
U Y 29333 414.65479136290196 235.79118315105478
U Z 5667 429.38998235880916 235.23185821554966
V A 1357717 252.21581246540725 110.51876081293727
V B 19895 508.8035130402769 319.7977773890922
V C 455 412.9615735073866 264.82016204902703
V D 45674 474.6216675375665 240.38788433839716
V E 1256602 311.6040646633407 210.6139132042646
V F 139 419.9364076981757 234.69031104316758
V G 403 428.3319566077362 235.54070231255906
V H 3100 226.50784958013872 87.53788165021896
V I 753447 429.0146394073771 232.96589354712398
V J 140 379.0499823588092 201.64814851459207
V K 679 473.76306647095873 267.0454861699365
V L 86124 448.59190242389616 256.5991114592386
V M 718 505.08696246730824 283.4016995703795
V N 130084 462.56662715272336 259.29544532442935
V O 864256 431.9239285094618 241.7661913152204
V P 488 443.6518172211945 240.47792976594545
V Q 65 452.14510431002867 242.23836317052547
V R 151566 466.97787186549317 231.7830384809562
V S 3380 495.48086121866663 279.460791528181
V T 10867 498.8102844084316 259.93779539591276
V U 12563 489.5674557944644 264.66747955120564
V V 2526 390.40186915126196 208.80962541437927
V W 99 467.8433033235587 240.25142089182793
V X 367 571.0842416180684 301.13989673600815
V Y 1985 487.6660149675048 273.462096949972
V Z 499 396.94998235880917 228.31619607299467
W A 341887 433.4998290805309 227.1154528310607
W B 4951 289.1471354166667 49.25033541681886
W C 966 426.5377166007172 210.20229117646466
W D 28781 482.00068716242214 255.2605972418325
W E 588102 409.90105290389147 220.39590058802884
W F 3627 454.37169054386254 237.59529832679578
W G 5727 447.6004248366853 252.6981472203085
W H 14644 418.7768920810314 223.3892905319932
W I 6403 178.3898793198025 135.0163645050997
W J 194 431.5868871207139 243.83042520360996
W K 11938 442.0331148889296 246.03429389405358
W L 112455 434.71258279708525 237.48698812813444
W M 3930 433.5964841999454 236.6609494763503
W N 17779 448.80380912628493 248.35777555488664
W O 2125258 393.74412333153714 207.6366522267055
W P 3655 426.02841373135817 232.07881428516285
W Q 349 393.1553395016663 238.3419505973957
W R 59558 470.58403061618185 247.5145003278086
W S 152064 454.9666729178917 229.0992840608539
W T 238362 466.9519403413852 69.14282595909785
W U 3259 434.14279673006666 237.3155337898548
W V 245 425.31382164452344 216.5320395264415
W W 58491 413.971000374251 212.58031283211318
W X 524 456.0649823588092 227.94155071020748
W Y 128868 456.01603384011077 263.50979475355285
W Z 618 518.0690299778568 282.9305367348429
X A 48640 493.1207239750006 255.07402447807573
X B 256 450.73123235880917 221.3747673866548
X C 270 391.2302292723894 256.6512074973925
X D 726 372.71354825028203 216.16416410613056
X E 641625 244.28852763786506 70.82444466380923
X F 319 491.294809945016 234.65583863493
X G 225 449.38748235880917 255.88756547480418
X H 3122 748.7833156921424 941.8753501843223
X I 69847 476.7652931218208 272.5582784808189
X J 75 465.94998235880917 191.3065537649974
X K 588 438.49346061967873 241.68965576783603
X L 2611 489.0289297272302 275.89618386323923
X M 565 522.1743413331682 288.85855395941866
X N 10478 522.7433358331294 288.1404577697983
X O 58921 501.20978990877217 288.51851579800586
X P 1593 391.7543301848961 227.52412919607747
X Q 51 640.8999647176183 340.89181001102173
X R 2467 517.8961848904547 269.0111918803456
X S 482 454.52004605307667 278.14325940271647
X T 973 527.0095600360339 282.5710767681801
X U 12955 470.62879030582906 263.94953216841157
X V 204 509.0499823588092 269.5102275439505
X W 173 520.1158914497182 258.18632003028154
X X 20008 396.4173026202471 208.79120037707798
X Y 959 477.3710349903881 257.8363270926949
X Z 1616 415.2833156921425 269.55912589735533
Y A 2294727 403.0160015535715 211.32409724122573
Y B 427370 410.59675990143586 207.80904068196173
Y C 75144 424.22720452910545 221.81331291454683
Y D 293887 420.3395715091881 221.37972569985826
Y E 852790 399.9224372951316 208.87545317318845
Y F 26381 432.121563754158 225.25774532212984
Y G 65983 413.0105845204149 209.51462103713897
Y H 237111 419.57334193886163 209.7187430612506
Y I 11730 448.35154911630235 234.46399028441374
Y J 438 440.57739548622226 213.89763988416055
Y K 77807 451.22560097096624 227.2848322097678
Y L 2135765 238.4555624297673 72.50201976498028
Y M 1614450 229.3899636047748 53.68149172328384
Y N 703320 430.3682810293007 210.3956813588236
Y O 199117 449.1091318192878 241.401633145236
Y P 122978 441.59387692578065 236.94579836390224
Y Q 64 447.092328567679 240.90646415486617
Y R 1154054 407.31018350299894 213.17226627546384
Y S 147526 426.62285925626793 224.01877704299451
Y T 618280 402.7301411122571 204.36841647095116
Y U 171445 410.3027010526378 213.77484139539015
Y V 17855 432.3016406140363 227.3615121803134
Y W 8851 466.0187572371816 256.1699476053431
Y X 10635 431.8901629457166 221.58492159338252
Y Y 9317 398.54908145790824 212.89159649375387
Y Z 52966 416.35387004779403 221.79711926484646
Z A 127153 522.3320786969758 283.4015700193414
Z B 1110 469.19998235880917 277.07686908255556
Z C 2201 443.0499823588092 222.01143260257552
Z D 2029 478.546136204963 256.70424007999793
Z E 33777 525.3954369042638 291.9528070560677
Z F 229 481.6722045810314 262.7549003271151
Z G 1344 526.7356966445234 298.6984062740345
Z H 4979 405.68682446407234 214.17795448219567
Z I 202232 508.3257405683887 310.47587905077836
Z J 188 483.94998235880917 259.8701746418909
Z K 1379 438.30712521595206 228.04037044256125
Z L 6250 447.35787709565125 232.19335916815524
Z M 1347 451.4646882411621 254.60781874868508
Z N 15053 494.7813549078288 270.51647322417494
Z O 36822 482.1383665732544 285.4233667445951
Z P 1018 470.64998235880915 254.71324743423588
Z Q 31 437.19998235880917 209.69590500551087
Z R 5599 488.4976014064282 253.96484117218327
Z S 1176 448.97081569214254 293.3029085338902
Z T 15541 486.5733589821858 259.3453869786468
Z U 53280 449.39735077986177 264.1360641158861
Z V 365 458.0653669741938 289.05144934442023
Z W 921 456.78331569214254 229.29855139399626
Z X 691 380.9331284262249 238.804692833034
Z Y 7835 476.78331569214254 293.5083971959707
Z Z 54151 405.64103926937827 208.1697906224169
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import random\n",
"import copy\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Load data\n",
"data_path = 'alphabet_pairs.csv'\n",
"df = pd.read_csv(data_path)\n",
"\n",
"# Create a list of unique keys\n",
"keys = sorted(set(df['first_key_down'].unique().tolist() + df['next_key_down'].unique().tolist()))\n",
"\n",
"# Create a mapping for keys to indices\n",
"key_to_index = {key: index for index, key in enumerate(keys)}\n",
"\n",
"# Initialize a matrix with zeros\n",
"matrix = np.zeros((len(keys), len(keys)))\n",
"\n",
"# Fill the matrix with costs\n",
"for index, row in df.iterrows():\n",
" i = key_to_index[row['first_key_down']]\n",
" j = key_to_index[row['next_key_down']]\n",
" if row['freq'] != 0: # To avoid division by zero\n",
" matrix[i, j] = row['mean'] / row['freq']"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def print_keyboard(layout):\n",
" # The layout should be a list of 26 characters (A-Z)\n",
" assert len(layout) == 26, \"The layout should be a list of 26 characters (A-Z)\"\n",
" \n",
" # Get the three rows\n",
" first_row = layout[:10]\n",
" second_row = layout[10:19]\n",
" third_row = layout[19:]\n",
" \n",
" # Add the necessary spaces to align the keys\n",
" first_row_str = \" \" + \" \".join(first_row)\n",
" second_row_str = \" \".join(second_row)\n",
" third_row_str = \" \" + \" \".join(third_row)\n",
" \n",
" # Print the keyboard\n",
" print(first_row_str)\n",
" print(second_row_str)\n",
" print(third_row_str)\n",
"\n",
"def calculate_total_cost(layout, cost_matrix, key_to_index):\n",
" total_cost = 0\n",
" for i in range(len(layout) - 1):\n",
" total_cost += cost_matrix[key_to_index[layout[i]], key_to_index[layout[i+1]]]\n",
" return total_cost\n",
"\n",
"def simulated_annealing(keys, cost_matrix, key_to_index, num_iterations=10000, start_temperature=10, end_temperature=0.01):\n",
" # Create a random initial layout\n",
" current_layout = random.sample(keys, len(keys))\n",
" current_cost = calculate_total_cost(current_layout, cost_matrix, key_to_index)\n",
" \n",
" # Store the best solution found\n",
" best_layout = copy.deepcopy(current_layout)\n",
" best_cost = current_cost\n",
" \n",
" # Store the cost over time\n",
" costs_over_time = [current_cost]\n",
" \n",
" for iteration in range(num_iterations):\n",
" # Calculate the current temperature (decreases over time)\n",
" temperature = start_temperature * ((end_temperature / start_temperature) ** (iteration / num_iterations))\n",
" \n",
" # Choose two keys randomly and swap them\n",
" new_layout = copy.deepcopy(current_layout)\n",
" i, j = random.sample(range(len(new_layout)), 2)\n",
" new_layout[i], new_layout[j] = new_layout[j], new_layout[i]\n",
" \n",
" # Calculate the new cost\n",
" new_cost = calculate_total_cost(new_layout, cost_matrix, key_to_index)\n",
" \n",
" # If the new layout is better, accept it\n",
" if new_cost < current_cost or random.random() < np.exp((current_cost - new_cost) / temperature):\n",
" current_layout = new_layout\n",
" current_cost = new_cost\n",
" \n",
" # Update the best solution found\n",
" if new_cost < best_cost:\n",
" best_layout = copy.deepcopy(new_layout)\n",
" best_cost = new_cost\n",
" \n",
" costs_over_time.append(current_cost)\n",
" \n",
" return best_layout, costs_over_time"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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pF27dqlNmzYVOj8jSgCAKqOgoKBC+zdu3JiSBABe7JFHHtH69eu1aNEi7dixQ3/6059066236uDBg5Kk77//XldddZV++OEHRUREqEWLFvrLX/6is2fPlvlcFCUAgKkefvhhRUVF6Z133pHFYpHFYtHRo0clSXv27NHQoUNVp04dhYSE6MEHH1RKSop93/79++vpp5/W2LFj1ahRIw0aNEiSNH36dHXs2FGBgYEKDw/XqFGjlJWVJUlas2aNHnnkEaWnp9vPFxkZKan4pXfHjx/X7bffrjp16qhu3bq6++67lZSUZF8fGRmpLl266JNPPlGLFi0UHByse++9V5mZme79pgFANXT48GF9/vnn+uqrr9S3b1+1bNlSzz//vG644QbNnTtXknTkyBEdO3ZMX331lRYsWKB58+Zpy5Ytuuuuu8p8PooSAMBU77zzjnr16qXHHntMCQkJSkhIUHh4uBISEtSvXz916dJFMTExWrp0qZKSknT33Xc77D9//nz5+flp/fr1+uCDDyRJPj4++ve//61du3Zp/vz5WrVqlcaNGydJ6t27t2bMmKG6devaz/f8888Xy2UYhkaMGKGzZ88qKipKy5cv1+HDh3XPPfc4bHf48GEtXrxYP/zwg3744QdFRUXpjTfecNN3CwCqr61bt8owDLVu3Vp16tSxv6KionT48GFJks1mU35+vhYsWKC+ffuqf//++vjjj7V69Wrt37+/TOfzc8eHAACgtIKDg+Xv76/atWsrNDTUvnz27Nnq2rWrw0xF//nPfxQeHq4DBw6odevWkqSrr75a06ZNczjmmDFj7F9HRETon//8p5566inNmjVL/v7+Cg4OlsVicTifsxUrVmjHjh2Ki4tTeHi4JOmTTz5R+/btFR0dreuuu07Sub+U582bp6CgIEnSgw8+qJUrV+r111+v2DcGAODAZrPJ19dXW7Zska+vr8O6OnXqSJKaNm0qPz8/+98RktS2bVtJ564SKMt9SxQlAIBX2rJli1avXm3/y+9Chw8ftv8l2L1792LrV69ercmTJ2vPnj3KyMhQUVGR8vLylJ2drcDAwFKdf+/evQoPD7eXJElq166d6tWrp71799qLUosWLewlSTr3l3RycnKZPisA4PKuvfZaWa1WJScnq2/fviVu06dPHxUVFenw4cNq2bKlJOnAgQOSpObNm5fpfBQlAIBXstlsGj58uKZOnVpsXdOmTe1fOxefY8eOaejQoXryySf1z3/+Uw0aNNAvv/yiP//5zyosLCz1+Q3DkMViuezyGjVqOKy3WCyy2WylPg8A4HdZWVk6dOiQ/X1cXJxiY2PVoEEDtW7dWg888IAeeughvf3227r22muVkpKiVatWqWPHjho6dKgGDhyorl276tFHH9WMGTNks9k0evRoDRo0yGGUqTQoSgAA0/n7+8tqtTos69q1q77++mu1aNFCfn6l/+sqJiZGRUVFevvtt+Xjc+5W3C+//PKy53PWrl07HT9+XPHx8fZRpT179ig9Pd1+GQcAwLViYmJ000032d+PHTtWkjRy5EjNmzdPc+fO1aRJk/Tcc8/p5MmTatiwoXr16qWhQ4dKOneP6vfff69nnnlGN954owIDAzVkyBC9/fbbZc5CUQIAmK5FixbavHmzjh49qjp16qhBgwYaPXq0PvzwQ9133336+9//rkaNGunQoUNatGiRPvzww2LXp5/XsmVLFRUV6d1339Xw4cO1fv16vf/++8XOl5WVpZUrV6pz586qXbt2sWnBBw4cqE6dOumBBx7QjBkzVFRUpFGjRqlfv34lXu4HAKi4/v3761KPea1Ro4YmTpyoiRMnXnSbsLAwff311xXOwqx3AADTPf/88/L19VW7du3UuHFjHT9+XGFhYVq/fr2sVqtuueUWdejQQc8++6yCg4PtI0Ul6dKli6ZPn66pU6eqQ4cO+uyzzzRlyhSHbXr37q0nn3xS99xzjxo3blxsMgjp3CV0ixcvVv369XXjjTdq4MCBuuqqq/TFF1+4/PMDALyPxbhUZQMAAACAaogRJQAAAABwQlECAAAAACcUJQAAAABwQlECAAAAACcUJQAAAABwQlECAAAAACcUJQAAAABwQlECAAAAACcUJQAAAABwQlECAAAAACcUJQAAAABw8v/zTBINmrdPJQAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Z A J N K C X E V O\n",
"D L P S Y B M R F\n",
" I W T H G U Q\n",
"{'QWERTY': 8.140831212028026, 'Dvorak': 17.207374702349316, 'Colemak': 9.215131291772037, 'Optimized': 0.02956733896325039}\n"
]
}
],
"source": [
"# Perform simulated annealing to find the optimal layout and store the cost over time\n",
"optimal_layout, costs_over_time = simulated_annealing(keys, matrix, key_to_index,\n",
" num_iterations=5000000, start_temperature=1000, end_temperature=0.0001)\n",
"\n",
"# Plot the cost over time\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(costs_over_time)\n",
"plt.title('Cost over time')\n",
"plt.xlabel('Iteration')\n",
"plt.ylabel('Cost')\n",
"plt.show()\n",
"\n",
"# Test the function with the optimized layout\n",
"print_keyboard(optimal_layout)\n",
"\n",
"# Define popular keyboard layouts\n",
"qwerty = ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M']\n",
"dvorak = ['P', 'Y', 'F', 'G', 'C', 'R', 'L', 'A', 'O', 'E', 'U', 'I', 'D', 'H', 'T', 'N', 'S', 'Q', 'J', 'K', 'X', 'B', 'M', 'W', 'V', 'Z']\n",
"colemak = ['Q', 'W', 'F', 'P', 'G', 'J', 'L', 'U', 'Y', 'A', 'R', 'S', 'T', 'D', 'H', 'N', 'E', 'I', 'O', 'Z', 'X', 'C', 'V', 'B', 'K', 'M']\n",
"\n",
"# Calculate the total cost for each layout\n",
"qwerty_cost = calculate_total_cost(qwerty, matrix, key_to_index)\n",
"dvorak_cost = calculate_total_cost(dvorak, matrix, key_to_index)\n",
"colemak_cost = calculate_total_cost(colemak, matrix, key_to_index)\n",
"optimized_cost = calculate_total_cost(optimal_layout, matrix, key_to_index)\n",
"\n",
"# Store the costs in a dictionary for easier access\n",
"costs = {\n",
" 'QWERTY': qwerty_cost,\n",
" 'Dvorak': dvorak_cost,\n",
" 'Colemak': colemak_cost,\n",
" 'Optimized': optimized_cost\n",
"}\n",
"\n",
"print(costs)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.3"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment