s" /usr/share/dict/words" r/o open-file throw value dict-words
dict-words file-size throw constant dict-size
dict-size 1+ allocate throw value dict-data
dict-data dict-size dict-words read-file throw drop
0 dict-data dict-size + c!  ( null terminate )
    🙜
s" my20.txt" r/o open-file throw value my20-words
my20-words file-size throw constant my20-size
my20-size 1+ allocate throw value my20-data
my20-data my20-size my20-words read-file throw drop
0 my20-data my20-size + c!  ( null terminate )

: next-word ( a -- a ) begin 1+ dup c@ nl = until 1+ ;
: each-step ( a -- a' a n ) dup next-word swap over over - 1- ;
: each{   postpone begin postpone dup postpone c@
          postpone while postpone each-step ; immediate
: }each   postpone repeat ; immediate

create letters 256 cells allot
letters 256 cells 0 fill
0 value total
    🙜
: letter+ ( ch -- ) cells letters + 1 swap +! ;
: letter@ ( ch -- n ) cells letters + @ ;
: init-frequencies
  dict-data each{
    0 ?do dup i + c@ letter+ 1 +to total loop drop 
  }each
;

: n. ( n -- )
  10000 total */ <# # # # # [char] . hold #s #> type ;
    🙜
: table.
  [char] z 1+ [char] a do
    i emit space i letter@ n. cr
  loop
;

: word-freq ( a n -- n ) 
  0 -rot 0 do dup i + c@ letter@ rot + swap loop drop ;
: run
  init-frequencies
  table.
  cr
  my20-data each{
    2dup type space
    word-freq n. cr
  }each
;
run bye

a 0.0754
b 0.0168
c 0.0358
d 0.0326
e 0.1041
f 0.0119
g 0.0258
h 0.0222
i 0.0785
j 0.0017
k 0.0094
l 0.0477
m 0.0247
n 0.0670
o 0.0577
p 0.0249
q 0.0017
r 0.0670
s 0.1068
t 0.0612
u 0.0307
v 0.0090
w 0.0083
x 0.0024
y 0.0148
z 0.0037

adieu 0.3217
tears 0.4149
lares 0.4013
alert 0.3557
alone 0.3522
atone 0.3657
audio 0.2753
blind 0.2429
canoe 0.3403
cough 0.1724
media 0.3156
notes 0.3971
orate 0.3657
radio 0.3115
raise 0.4322
resin 0.4238
senor 0.4029
steam 0.3725
stone 0.3971
tares 0.4149