47 lines
1.2 KiB
Factor
47 lines
1.2 KiB
Factor
! Copyright (C) 2011 John Benediktsson
|
|
! See http://factorcode.org/license.txt for BSD license
|
|
|
|
USING: accessors arrays ascii kernel locals math random
|
|
sequences sequences.extras vectors ;
|
|
|
|
IN: enigma
|
|
|
|
: <alphabet> ( -- seq )
|
|
26 <iota> >array ;
|
|
|
|
: <cog> ( -- cog )
|
|
<alphabet> randomize ;
|
|
|
|
: <reflector> ( -- reflector )
|
|
<alphabet> dup length <iota> >vector [ dup empty? ] [
|
|
[
|
|
[ delete-random ] [ delete-random ] bi
|
|
pick exchange
|
|
] keep
|
|
] until drop ;
|
|
|
|
TUPLE: enigma cogs prev-cogs reflector ;
|
|
|
|
: <enigma> ( num-cogs -- enigma )
|
|
[ <cog> ] replicate dup clone <reflector> enigma boa ;
|
|
|
|
: reset-cogs ( enigma -- enigma )
|
|
dup prev-cogs>> >>cogs ;
|
|
|
|
: special? ( n -- ? )
|
|
[ 25 > ] [ 0 < ] bi or ;
|
|
|
|
:: encode ( text enigma -- cipher-text )
|
|
0 :> ln!
|
|
enigma cogs>> :> cogs
|
|
enigma reflector>> :> reflector
|
|
text >lower [
|
|
CHAR: a mod dup special? [
|
|
ln 1 + ln!
|
|
cogs [ nth ] each reflector nth
|
|
cogs reverse [ index ] each CHAR: a +
|
|
cogs length <iota> [ 6 * 1 + ln mod zero? ] filter
|
|
cogs [ unclip prefix ] change-nths
|
|
] unless
|
|
] map ;
|