@ -1,6 +1,5 @@
 
			
		
	
		
			
				
					( ns  cipher-analytical-machine.ciphers.simple-substitution  
			
		
	
		
			
				
					  ( :require  [ clojure.string  :as  cs ] 
 
			
		
	
		
			
				
					            [ clojure.set  :as  set ] 
 
			
		
	
		
			
				
					            [ cipher-analytical-machine.ciphers.caesar  :as  caesar ] ) 
 
			
		
	
		
			
				
					  ( :gen-class ) ) 
 
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -20,28 +19,38 @@
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					( defn  find-value-in-table  
			
		
	
		
			
				
					  "It uses the substitution table to find the value of a char or a number." 
 
			
		
	
		
			
				
					  [ char  substitution-table  symbols  ] 
 
			
		
	
		
			
				
					  [ char  substitution-table ] 
 
			
		
	
		
			
				
					  ( get  substitution-table  char ) ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					( defn  encrypt-message  
			
		
	
		
			
				
					  "Encrypt a message using the simple substitution cipher. The function is case-insensitive. If a symbol isn't in the symbols list, then it will be removed." 
 
			
		
	
		
			
				
					  [ message  substitution-table ] 
 
			
		
	
		
			
				
					  ( ->>  message 
 
			
		
	
		
			
				
					       ( map  ( fn  [ char ]  ( find-value-in-table  char  substitution-table ) ) ) 
 
			
		
	
		
			
				
					       ( remove  nil? ) 
 
			
		
	
		
			
				
					       ( cs/join  \, ) ) ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					( defn  encrypt-message-with-caesar  
			
		
	
		
			
				
					  "Encrypt a message using the simple substitution cipher and the Caesar cipher. The function is case-insensitive. If a symbol isn't in the symbols list, then it will be removed." 
 
			
		
	
		
			
				
					  [ message  key  substitution-table  symbols ] 
 
			
		
	
		
			
				
					  ( let  [ max-index  ( count  symbols ) ] 
 
			
		
	
		
			
				
					    ( ->>  message 
 
			
		
	
		
			
				
					         ( cs/lower-case ) 
 
			
		
	
		
			
				
					         ( caesar/encrypt-message  key  symbols ) 
 
			
		
	
		
			
				
					         ( map  ( fn  [ char ]  ( find-value-in-table  char  substitution-table  symbols ) ) ) 
 
			
		
	
		
			
				
					         ( cs/join  \, ) ) ) ) 
 
			
		
	
		
			
				
					  ( ->  message 
 
			
		
	
		
			
				
					      ( caesar/encrypt-message  key  symbols ) 
 
			
		
	
		
			
				
					      ( encrypt-message  substitution-table ) ) ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					( defn  decrypt-message  
			
		
	
		
			
				
					  "Decrypt a message using the simple substitution cipher. The function is case-insensitive." 
 
			
		
	
		
			
				
					  "Decrypt a message using the simple substitution cipher. The function is case-insensitive. The substitution-table must be " 
 
			
		
	
		
			
				
					  [ message  substitution-table ] 
 
			
		
	
		
			
				
					  ( let  [ message  ( cs/split  message  # "," ) ] 
 
			
		
	
		
			
				
					    ( ->>  message 
 
			
		
	
		
			
				
					         ( map  # ( Integer/parseInt  % ) ) 
 
			
		
	
		
			
				
					         ( map  ( fn  [ char ]  ( find-value-in-table  char  substitution-table ) ) ) 
 
			
		
	
		
			
				
					         ( remove  nil? ) 
 
			
		
	
		
			
				
					         ( cs/join ) ) ) ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					( defn  decrypt-message-with-caesar  
			
		
	
		
			
				
					  "Decrypt a message using the simple substitution cipher and the Caesar cipher. The function is case-insensitive." 
 
			
		
	
		
			
				
					  [ message  key  substitution-table  symbols ] 
 
			
		
	
		
			
				
					  ( let  [ substitution-table  ( set/map-invert  substitution-table ) 
 
			
		
	
		
			
				
					        max-index  ( count  symbols ) 
 
			
		
	
		
			
				
					        message  ( cs/split  message  # "," ) ] 
 
			
		
	
		
			
				
					      ( ->>  message 
 
			
		
	
		
			
				
					           ( map  # ( Integer/parseInt  % ) ) 
 
			
		
	
		
			
				
					           ( map  ( fn  [ char ]  ( find-value-in-table  char  substitution-table  symbols ) ) ) 
 
			
		
	
		
			
				
					           ( caesar/encrypt-message  key  symbols ) 
 
			
		
	
		
			
				
					           ( cs/join ) ) ) ) 
 
			
		
	
		
			
				
					  ( ->  message 
 
			
		
	
		
			
				
					      ( decrypt-message  substitution-table ) 
 
			
		
	
		
			
				
					      ( caesar/decrypt-message  key  symbols ) ) )