(lib 'struct) (lib 'sql) (lib 'words) (lib 'dico.fr.no-accent) ;; load dictionary (string-delimiter "") ;; check reverse r of w is a word ;; take only one pair : r < w (define (semordnilap? w) (define r (list->string (reverse (string->list w)))) (and (word? r) (string (string-length a) (string-length b))) (define (task) ;; select unique words into the list 'mots' (define mots (make-set (words-select #:any null 999999))) (define semordnilap (list-sort string-sort (for/list ((w mots)) #:when (semordnilap? w) w ))) (writeln 'pairs '→ (length semordnilap)) (writeln 'longest '→ (take semordnilap 5))) {{out}} (task) pairs → 345 longest → (rengager tresser strasse reveler retrace)