! 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 strings sets ;
+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
<PRIVATE
: source-059 ( -- seq )
- "extra/project-euler/059/cipher1.txt" resource-path
- ascii file-contents [ blank? ] right-trim "," split
+ "resource:extra/project-euler/059/cipher1.txt"
+ ascii file-contents [ blank? ] trim-tail "," split
[ string>number ] map ;
TUPLE: rollover seq n ;
C: <rollover> rollover
-M: rollover length rollover-n ;
+M: rollover length n>> ;
-M: rollover nth-unsafe rollover-seq [ length mod ] keep nth-unsafe ;
+M: rollover nth-unsafe seq>> [ length mod ] keep nth-unsafe ;
INSTANCE: rollover immutable-sequence
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 1 head-slice*
+ [ " " decrypt ] dip group but-last-slice
flip [ most-frequent ] map ;
PRIVATE>
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