Skip to content

Instantly share code, notes, and snippets.

@pangloss
Created May 12, 2013 18:34
Show Gist options
  • Save pangloss/5564472 to your computer and use it in GitHub Desktop.
Save pangloss/5564472 to your computer and use it in GitHub Desktop.
Taking advantage of list comprehensions and lazy-seqs to solve http://projecteuler.net/problem=59 quite speedily.
(ns euler-59)
(defn decryptions [data]
(let [chrs (range (int \a) (inc (int \z)))]
(for [a chrs b chrs c chrs]
(let [k (cycle [a b c])]
(map (fn [a b] (bit-xor a b)) data k)))))
; Doesn't take much to validate english!
(defn possibly-valid? [str]
(re-find #"(?i: or )" str))
(defn eulerize [data]
(->> data
decryptions
; this next step is a massive speedup. Each possible decryption is a
; *lazy-seq*, so if I can filter it out without fully executing it,
; I can save a lot of work. On my machine, moving the following 3 lines from
; inside decryptions to here improved the speed to solution from 2100ms to 33ms.
(filter (fn [stream] (not-any? #(< (int \z) %) stream)))
(map #(map char %))
(map clojure.string/join)
(filter possibly-valid?)
first
(map int)
(apply +)))
(defn run []
; too lazy to bather with reading the csv
(let [data [79 59 12 2 79 35 8 28 20 2 3 68 8 9 68 45 0 12 9 67 68 4 7 5 23 27 1 21 79 85 78 79 85 71 38 10
71 27 12 2 79 6 2 8 13 9 1 13 9 8 68 19 7 1 71 56 11 21 11 68 6 3 22 2 14 0 30 79 1 31 6 23 19 10 0
73 79 44 2 79 19 6 28 68 16 6 16 15 79 35 8 11 72 71 14 10 3 79 12 2 79 19 6 28 68 32 0 0 73 79 86
71 39 1 71 24 5 20 79 13 9 79 16 15 10 68 5 10 3 14 1 10 14 1 3 71 24 13 19 7 68 32 0 0 73 79 87 71
39 1 71 12 22 2 14 16 2 11 68 2 25 1 21 22 16 15 6 10 0 79 16 15 10 22 2 79 13 20 65 68 41 0 16 15 6
10 0 79 1 31 6 23 19 28 68 19 7 5 19 79 12 2 79 0 14 11 10 64 27 68 10 14 15 2 65 68 83 79 40 14 9
1 71 6 16 20 10 8 1 79 19 6 28 68 14 1 68 15 6 9 75 79 5 9 11 68 19 7 13 20 79 8 14 9 1 71 8 13 17
10 23 71 3 13 0 7 16 71 27 11 71 10 18 2 29 29 8 1 1 73 79 81 71 59 12 2 79 8 14 8 12 19 79 23 15 6
10 2 28 68 19 7 22 8 26 3 15 79 16 15 10 68 3 14 22 12 1 1 20 28 72 71 14 10 3 79 16 15 10 68 3 14 22
12 1 1 20 28 68 4 14 10 71 1 1 17 10 22 71 10 28 19 6 10 0 26 13 20 7 68 14 27 74 71 89 68 32 0 0 71
28 1 9 27 68 45 0 12 9 79 16 15 10 68 37 14 20 19 6 23 19 79 83 71 27 11 71 27 1 11 3 68 2 25 1 21
22 11 9 10 68 6 13 11 18 27 68 19 7 1 71 3 13 0 7 16 71 28 11 71 27 12 6 27 68 2 25 1 21 22 11 9 10
68 10 6 3 15 27 68 5 10 8 14 10 18 2 79 6 2 12 5 18 28 1 71 0 2 71 7 13 20 79 16 2 28 16 14 2 11 9
22 74 71 87 68 45 0 12 9 79 12 14 2 23 2 3 2 71 24 5 20 79 10 8 27 68 19 7 1 71 3 13 0 7 16 92 79 12
2 79 19 6 28 68 8 1 8 30 79 5 71 24 13 19 1 1 20 28 68 19 0 68 19 7 1 71 3 13 0 7 16 73 79 93 71 59
12 2 79 11 9 10 68 16 7 11 71 6 23 71 27 12 2 79 16 21 26 1 71 3 13 0 7 16 75 79 19 15 0 68 0 6 18 2
28 68 11 6 3 15 27 68 19 0 68 2 25 1 21 22 11 9 10 72 71 24 5 20 79 3 8 6 10 0 79 16 8 79 7 8 2 1 71
6 10 19 0 68 19 7 1 71 24 11 21 3 0 73 79 85 87 79 38 18 27 68 6 3 16 15 0 17 0 7 68 19 7 1 71 24 11
21 3 0 71 24 5 20 79 9 6 11 1 71 27 12 21 0 17 0 7 68 15 6 9 75 79 16 15 10 68 16 0 22 11 11 68 3 6
0 9 72 16 71 29 1 4 0 3 9 6 30 2 79 12 14 2 68 16 7 1 9 79 12 2 79 7 6 2 1 73 79 85 86 79 33 17 10
10 71 6 10 71 7 13 20 79 11 16 1 68 11 14 10 3 79 5 9 11 68 6 2 11 9 8 68 15 6 23 71 0 19 9 79 20 2
0 20 11 10 72 71 7 1 71 24 5 20 79 10 8 27 68 6 12 7 2 31 16 2 11 74 71 94 86 71 45 17 19 79 16 8 79
5 11 3 68 16 7 11 71 13 1 11 6 1 17 10 0 71 7 13 10 79 5 9 11 68 6 12 7 2 31 16 2 11 68 15 6 9 75 79
12 2 79 3 6 25 1 71 27 12 2 79 22 14 8 12 19 79 16 8 79 6 2 12 11 10 10 68 4 7 13 11 11 22 2 1 68 8
9 68 32 0 0 73 79 85 84 79 48 15 10 29 71 14 22 2 79 22 2 13 11 21 1 69 71 59 12 14 28 68 14 28 68 9
0 16 71 14 68 23 7 29 20 6 7 6 3 68 5 6 22 19 7 68 21 10 23 18 3 16 14 1 3 71 9 22 8 2 68 15 26 9 6
1 68 23 14 23 20 6 11 9 79 11 21 79 20 11 14 10 75 79 16 15 6 23 71 29 1 5 6 22 19 7 68 4 0 9 2 28
68 1 29 11 10 79 35 8 11 74 86 91 68 52 0 68 19 7 1 71 56 11 21 11 68 5 10 7 6 2 1 71 7 17 10 14 10
71 14 10 3 79 8 14 25 1 3 79 12 2 29 1 71 0 10 71 10 5 21 27 12 71 14 9 8 1 3 71 26 23 73 79 44 2 79
19 6 28 68 1 26 8 11 79 11 1 79 17 9 9 5 14 3 13 9 8 68 11 0 18 2 79 5 9 11 68 1 14 13 19 7 2 18 3 10
2 28 23 73 79 37 9 11 68 16 10 68 15 14 18 2 79 23 2 10 10 71 7 13 20 79 3 11 0 22 30 67 68 19 7 1
71 8 8 8 29 29 71 0 2 71 27 12 2 79 11 9 3 29 71 60 11 9 79 11 1 79 16 15 10 68 33 14 16 15 10 22 73]]
(eulerize data)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment