! Copyright (C) 2011 John Benediktsson ! See https://factorcode.org/license.txt for BSD license USING: accessors arrays ascii kernel locals math random sequences sequences.extras vectors ; IN: enigma : ( -- seq ) 26 >array ; : ( -- cog ) randomize ; : ( -- reflector ) dup length >vector [ dup empty? ] [ [ [ delete-random ] [ delete-random ] bi pick exchange ] keep ] until drop ; TUPLE: enigma cogs prev-cogs reflector ; : ( num-cogs -- enigma ) [ ] replicate dup clone 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 [ 6 * 1 + ln mod zero? ] filter cogs [ unclip prefix ] change-nths ] unless ] map ;