Guest User

Untitled

a guest
Dec 4th, 2016
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 1.78 KB | None | 0 0
  1. (use srfi-1 srfi-13 srfi-14 irregex)
  2.  
  3. (define (convert-data str)
  4.   (list (irregex-match-substring
  5.          (irregex-search '(: bos (* (* alpha) "-") (+ alpha)) str))
  6.         (string->number
  7.          (irregex-match-substring
  8.           (irregex-search '(+ num) str)))
  9.         (irregex-match-substring
  10.          (irregex-search '(: "[" (=> num (* alpha)) "]" eos) str) 'num)))
  11.  
  12. (define (get-checksum str)
  13.   (list->string
  14.    (map car (take
  15.              (sort (string-fold
  16.                     (lambda (char sums)
  17.                       (let ((x (assoc char sums)))
  18.                         (cond (x (set-cdr! x (+ 1 (cdr x))) sums)
  19.                               (else (cons (cons char 1) sums)))))
  20.                     '() (string-delete #\- str))
  21.                    (lambda (a b)
  22.                      (if (= (cdr a) (cdr b))
  23.                          (< (char->integer (car a)) (char->integer (car b)))
  24.                          (> (cdr a) (cdr b))))) 5))))
  25.  
  26. (define (filter-valid-rooms file)
  27.   (with-input-from-file file
  28.     (lambda ()
  29.       (let loop ((line (read-line))
  30.                  (vrooms '()))
  31.         (if (eof-object? line)
  32.             vrooms
  33.             (let ((rec (convert-data line)))
  34.               (if (string=? (caddr rec) (get-checksum (car rec)))
  35.                   (loop (read-line) (cons rec vrooms))
  36.                   (loop (read-line) vrooms))))))))
  37.  
  38. (define (decrypt str shift)
  39.   (string-map (lambda (char)
  40.                 (if (equal? char #\-)
  41.                     #\space
  42.                     (integer->char (+ (char->integer #\a)
  43.                                       (modulo (+ shift (- (char->integer char)
  44.                                                           (char->integer #\a)))
  45.                                               26)))))
  46.               str))
Add Comment
Please, Sign In to add comment