; freq (define (uniq-c eql? xs) (if (null? xs) xs (let loop ((xs (cdr xs)) (prev (car xs)) (k 1) (result '())) (cond ((null? xs) (reverse (cons (cons prev k) result))) ((eql? (car xs) prev) (loop (cdr xs) prev (+ k 1) result)) (else (loop (cdr xs) (car xs) 1 (cons (cons prev k) result))))))) (define (freq str . block) (let ((block (if (pair? block) (car block) 1)) (len (string-length str))) (if (< len block) (list) (let loop ((k 0) (txt (list))) (if (<= k (- len block)) (loop (+ k 1) (cons (substring str k (+ k block)) txt)) (let ((txt (sort txt string<?))) (uniq-c string=? txt))))))) (define cryptogram (string-append "V MVXEGC NK V RGIIZH HYZ IGXDK PZQ " "YNK QLMCGIIV HYGX AYG KQX NK KYNXNXO " "VXD HZXAK NA MVUE AYG LNXQAG NA " "MGONXK AZ CVNX LVCE AHVNX")) (display (sort (freq cryptogram 1) (lambda (a b) (< (cdr b) (cdr a))))) (newline) (display (sort (freq cryptogram 2) (lambda (a b) (< (cdr b) (cdr a))))) (newline) (display (sort (freq cryptogram 3) (lambda (a b) (< (cdr b) (cdr a))))) (newline)
Standard input is empty
(( . 26) (X . 12) (N . 11) (G . 9) (V . 9) (A . 8) (K . 8) (Y . 6) (H . 5) (I . 5) (Z . 5) (C . 4) (M . 4) (Q . 4) (E . 3) (L . 3) (D . 2) (O . 2) (P . 1) (R . 1) (U . 1)) ((K . 6) (NX . 6) ( A . 4) ( N . 4) ( H . 3) ( M . 3) (G . 3) (NK . 3) (V . 3) (X . 3) (YG . 3) ( K . 2) ( L . 2) ( V . 2) (A . 2) (AY . 2) (E . 2) (GI . 2) (GX . 2) (HY . 2) (II . 2) (MV . 2) (NA . 2) (VN . 2) (VX . 2) (XD . 2) (YN . 2) (Z . 2) ( C . 1) ( I . 1) ( P . 1) ( Q . 1) ( R . 1) ( Y . 1) (AG . 1) (AH . 1) (AK . 1) (AZ . 1) (C . 1) (CE . 1) (CG . 1) (CV . 1) (D . 1) (DK . 1) (EG . 1) (GC . 1) (GO . 1) (H . 1) (HV . 1) (HZ . 1) (IG . 1) (IV . 1) (IZ . 1) (KQ . 1) (KY . 1) (LM . 1) (LN . 1) (LV . 1) (MC . 1) (MG . 1) (O . 1) (ON . 1) (PZ . 1) (Q . 1) (QA . 1) (QL . 1) (QX . 1) (RG . 1) (UE . 1) (VC . 1) (VU . 1) (XA . 1) (XE . 1) (XK . 1) (XN . 1) (XO . 1) (XQ . 1) (YZ . 1) (ZH . 1) (ZQ . 1) (ZX . 1)) ((NK . 3) ( AY . 2) ( HY . 2) ( MV . 2) ( NA . 2) ( NK . 2) (A M . 2) (AYG . 2) (E A . 2) (GII . 2) (NA . 2) (VNX . 2) (YG . 2) ( AH . 1) ( AZ . 1) ( CV . 1) ( HZ . 1) ( IG . 1) ( KQ . 1) ( KY . 1) ( LN . 1) ( LV . 1) ( MG . 1) ( PZ . 1) ( QL . 1) ( RG . 1) ( V . 1) ( VX . 1) ( YN . 1) (AG . 1) (AHV . 1) (AK . 1) (AZ . 1) (C N . 1) (CE . 1) (CGI . 1) (CVN . 1) (D H . 1) (DK . 1) (EGC . 1) (G K . 1) (G L . 1) (G N . 1) (GC . 1) (GON . 1) (GX . 1) (GXD . 1) (H H . 1) (HVN . 1) (HYG . 1) (HYZ . 1) (HZX . 1) (IGX . 1) (IIV . 1) (IIZ . 1) (IV . 1) (IZH . 1) (K A . 1) (K K . 1) (K N . 1) (K P . 1) (K Q . 1) (K V . 1) (KQX . 1) (KYN . 1) (LMC . 1) (LNX . 1) (LVC . 1) (MCG . 1) (MGO . 1) (MVU . 1) (MVX . 1) (NX . 1) (NXK . 1) (NXN . 1) (NXO . 1) (NXQ . 1) (O V . 1) (ONX . 1) (PZQ . 1) (Q Y . 1) (QAG . 1) (QLM . 1) (QX . 1) (RGI . 1) (UE . 1) (V H . 1) (V M . 1) (V R . 1) (VCE . 1) (VUE . 1) (VXD . 1) (VXE . 1) (X A . 1) (X L . 1) (X N . 1) (XAK . 1) (XD . 1) (XDK . 1) (XEG . 1) (XK . 1) (XNX . 1) (XO . 1) (XQA . 1) (YGX . 1) (YNK . 1) (YNX . 1) (YZ . 1) (Z C . 1) (Z I . 1) (ZH . 1) (ZQ . 1) (ZXA . 1))