39 lines
No EOL
1.1 KiB
Scheme
39 lines
No EOL
1.1 KiB
Scheme
(import :gerbil/gambit/ports)
|
|
|
|
(export main)
|
|
|
|
(def (unique-counts l)
|
|
(def hash (make-hash-table))
|
|
(for-each (lambda (x) (hash-update! hash x 1+ 0)) l)
|
|
(hash-values hash))
|
|
|
|
(def (checksum l)
|
|
(let ((twice (length (filter (lambda (x) (memq 2 (unique-counts x))) l)))
|
|
(thrice (length (filter (lambda (x) (memq 3 (unique-counts x))) l))))
|
|
(* twice thrice)))
|
|
|
|
(def (similarity id1 id2)
|
|
(apply +
|
|
(map (lambda (x y) (if (eq? x y) 0 1)) id1 id2)))
|
|
|
|
(def (find-similar id id-list)
|
|
(filter (lambda (x) (eq? 1 (similarity id x))) id-list))
|
|
|
|
(def (intersection id1 id2)
|
|
(reverse (foldl (lambda (x y acc) (if (eq? x y) (cons x acc) acc)) [] id1 id2)))
|
|
|
|
(def (main . args)
|
|
(def ids (call-with-input-file "input.txt" (lambda (p) (read-all p read-line))))
|
|
(displayln (checksum (map string->list ids)))
|
|
|
|
(def common
|
|
(let/cc exit
|
|
(foldl
|
|
(lambda (id acc)
|
|
(let ((similar (find-similar id acc)))
|
|
(if (< 0 (length similar))
|
|
(exit (intersection id (car similar)))
|
|
(cons id acc))))
|
|
[]
|
|
(map string->list ids))))
|
|
(displayln (list->string common))) |