This implementation is not quite correct because it doesn't do insertion at the end. If the last letter of a word is missing, the Arc will correct it by adding a letter at the next-to-last place and then swapping the last two letters; however, if the word has another error, the Arc won't correct it, whereas the Python will.
Whether this is a serious problem is open to question. However, it does mean that the comparison with Python is not apples to apples.
Incidentally, in case anyone cares, here's how it looks in rkts-lang,* a little toy language I've been working on:
nwords = words "big.txt" . map downcase . Hap.counts
alphabet = "abcdefghijklmnopqrstuvwxyz"
edits1 w = Iter as c:
n = size w
for i of 0 to n-1: c (w[below i] ... w[above i])
for i of 0 to n-2: c (w[i to i+1] @ w[i+1 downto i])
for i of 0 to n-1: for l of alphabet: c (w[i] @ l)
for i of 0 to n: for l of alphabet: c (w[below i] ... l ... w[upfrom i])
edits n w = iterate (join edits1) {w} . take n+1
correct w = edits 2 w . map (keep nwords[]) . find ~empty . greatest nwords[]
If we permit the pg bug, then edits1 can be shortened a bit:
edits1 w = Iter as c:
for i of keys w:
c (w[below i] ... w[above i])
if i > 0: c (w[i-1 to i] @ w[i downto i-1])
for l of alphabet: c (w[i] @ l); c (w[below i] ... l ... w[upfrom i])
(* Suggestions for a catchy name may be rewarded.)