Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,20 @@
|
|||
#lang racket
|
||||
|
||||
(define (memoize f)
|
||||
(local ([define table (make-hash)])
|
||||
(lambda args
|
||||
(dict-ref! table args (λ () (apply f args))))))
|
||||
|
||||
(define levenshtein
|
||||
(memoize
|
||||
(lambda (s t)
|
||||
(cond
|
||||
[(and (empty? s) (empty? t)) 0]
|
||||
[(empty? s) (length t)]
|
||||
[(empty? t) (length s)]
|
||||
[else
|
||||
(if (equal? (first s) (first t))
|
||||
(levenshtein (rest s) (rest t))
|
||||
(min (add1 (levenshtein (rest s) t))
|
||||
(add1 (levenshtein s (rest t)))
|
||||
(add1 (levenshtein (rest s) (rest t)))))]))))
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
(levenshtein (string->list "rosettacode")
|
||||
(string->list "raisethysword"))
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
#lang racket
|
||||
|
||||
(struct lev (n s t))
|
||||
|
||||
(define (lev-add old n sx tx)
|
||||
(lev (+ n (lev-n old))
|
||||
(cons sx (lev-s old))
|
||||
(cons tx (lev-t old))))
|
||||
|
||||
(define (list-repeat n v)
|
||||
(build-list n (lambda (_) v)))
|
||||
|
||||
(define (memoize f)
|
||||
(local ([define table (make-hash)])
|
||||
(lambda args
|
||||
(dict-ref! table args (λ () (apply f args))))))
|
||||
|
||||
(define levenshtein/list
|
||||
(memoize
|
||||
(lambda (s t)
|
||||
(cond
|
||||
[(and (empty? s) (empty? t))
|
||||
(lev 0 '() '())]
|
||||
[(empty? s)
|
||||
(lev (length t) (list-repeat (length t) #\-) t)]
|
||||
[(empty? t)
|
||||
(lev (length s) s (list-repeat (length s) #\-))]
|
||||
[else
|
||||
(if (equal? (first s) (first t))
|
||||
(lev-add (levenshtein/list (rest s) (rest t))
|
||||
0 (first s) (first t))
|
||||
(argmin lev-n (list (lev-add (levenshtein/list (rest s) t)
|
||||
1 (first s) #\-)
|
||||
(lev-add (levenshtein/list s (rest t))
|
||||
1 #\- (first t))
|
||||
(lev-add (levenshtein/list (rest s) (rest t))
|
||||
1 (first s) (first t)))))]))))
|
||||
|
||||
(define (levenshtein s t)
|
||||
(let ([result (levenshtein/list (string->list s)
|
||||
(string->list t))])
|
||||
(values (lev-n result)
|
||||
(list->string (lev-s result))
|
||||
(list->string (lev-t result)))))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
(let-values ([(dist exp-s exp-t)
|
||||
(levenshtein "rosettacode" "raisethysword")])
|
||||
(printf "levenshtein: ~a edits\n" dist)
|
||||
(displayln exp-s)
|
||||
(displayln exp-t))
|
||||
Loading…
Add table
Add a link
Reference in a new issue