! Copyright (c) 2008 Aaron Schaefer, Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: arrays ascii assocs hashtables io.encodings.ascii io.files kernel math
- math.parser namespaces sequences sequences.lib sequences.private sorting
- splitting grouping strings sets accessors ;
+USING: accessors arrays ascii assocs grouping io.encodings.ascii
+io.files kernel make math math.parser project-euler.common
+sequences sequences.private sets sorting splitting ;
IN: project-euler.059
! http://projecteuler.net/index.php?section=problems&id=59
: source-059 ( -- seq )
"resource:extra/project-euler/059/cipher1.txt"
- ascii file-contents [ blank? ] trim-right "," split
+ ascii file-contents [ blank? ] trim-tail "," split
[ string>number ] map ;
TUPLE: rollover seq n ;
over length <rollover> swap [ bitxor ] 2map ;
: frequency-analysis ( seq -- seq )
- dup prune [
+ dup members [
[ 2dup [ = ] curry count 2array , ] each
] { } make nip ; inline
: most-frequent ( seq -- elt )
- frequency-analysis sort-values keys peek ;
+ frequency-analysis sort-values keys last ;
: crack-key ( seq key-length -- key )
[ " " decrypt ] dip group but-last-slice
source-059 dup 3 crack-key decrypt sum ;
! [ euler059 ] 100 ave-time
-! 13 ms run / 0 ms GC ave time - 100 trials
+! 8 ms ave run time - 1.4 SD (100 trials)
-MAIN: euler059
+SOLUTION: euler059