# copyright 2003 by david f. dembinski
# distributed under the GNU General Public License
# Straightforward implementation of the algorithm described in this excerpt from the Principia Discordia:
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 #                                                      INTER-OFFICE WIRE 
#SENT
# 
#THE ANCIENT ILLUMINATED SEERS OF BAVARIA - VIGILANCE LODGE
#Mad Malik, Hauptscheissmeister; Resident for Norton Cabal
#
#         DISCORDIAN SOCIETY SUPER SECRET CRYPTOGRAPHIC CYPHER CODE
# 
#Of possible interest to all Discordians, this information is herewith 
#released from the vaults of A.I.S.B., under the auspices of Episkopos Dr. 
#Mordecai Malignatius, KNS.
# 
#SAMPLE MESSAGE: ("HAIL ERIS")
# 
#CONVERSATION:
#A B C D E F G H I J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
#1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# 
#STEP 1.  Write out the message (HAIL ERIS) and put all the vowels at the 
#end
#        (HLRSAIEI)
#STEP 2.  Reverse order (IEIASRLH)
#STEP 3.  Convert to numbers (9-5-9-1-19-18-12-8)
#STEP 4.  Put into numerical order (1-5-8-9-9-12-18-19)
#STEP 5.  Convert back to letters (AEHIILRS)
# 
#This cryptographic cypher code is GUARANTEED TO BE 100% UNBREAKABLE.
# 
#                  BEWARE! THE PARANOIDS ARE WATCHING YOU!
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

def DS3C3 (message)
	message.upcase!  #conversion table only has capital letters
	vowels = message.scan(/[AEIOU]/)  #copy the filthy vowels and keep them someplace safe
 	message.delete!("AEIOU !.?@\t\n")  #remove the vowels entirely, and any symbols we can think of, to boot
 	message += vowels.join #reunite vowels with their estranged brothers
 	message.reverse!  #yep
 	message = message.split(//)  #conversion table doesn't provide for spaces!  and anyway, we need an array to do the conversions
 	message.each do |i|  #and now, we convert letters into numbers.  Anyone have an easier way of doing this?
 		case i
 		when /A/
 			message[message.index(i)] = 1
 		when /B/
 			message[message.index(i)] = 2
 		when /C/
 			message[message.index(i)] = 3
 		when /D/
 			message[message.index(i)] = 4
 		when /E/
 			message[message.index(i)] = 5
 		when /F/
 			message[message.index(i)] = 6
 		when /G/
 			message[message.index(i)] = 7
 		when /H/
 			message[message.index(i)] = 8
 		when /I/
 			message[message.index(i)] = 9
 		when /J/
 			message[message.index(i)] = 10
 		when /K/
 			message[message.index(i)] = 11
 		when /L/
 			message[message.index(i)] = 12
 		when /M/
 			message[message.index(i)] = 13
 		when /N/
 			message[message.index(i)] = 14
 		when /O/
 			message[message.index(i)] = 15
 		when /P/
 			message[message.index(i)] = 16
 		when /Q/
 			message[message.index(i)] = 17
 		when /R/
 			message[message.index(i)] = 18
 		when /S/
 			message[message.index(i)] = 19
 		when /T/
 			message[message.index(i)] = 20
 		when /U/
 			message[message.index(i)] = 21
 		when /V/
 			message[message.index(i)] = 22
 		when /W/
 			message[message.index(i)] = 23
 		when /X/
 			message[message.index(i)] = 24
 		when /Y/
 			message[message.index(i)] = 25
 		when /Z/
 			message[message.index(i)] = 26
 		end
 	end
 	message.sort!  #sort the numbers in numerical order . . .
 	message.each do |i|  #and make em back into letters
 		case i
 		when 1
 			message[message.index(i)] = "A"
 		when 2
 			message[message.index(i)] = "B"
 		when 3
 			message[message.index(i)] = "C"
 		when 4
 			message[message.index(i)] = "D"
 		when 5
 			message[message.index(i)] = "E"
 		when 6
 			message[message.index(i)] = "F"
 		when 7
 			message[message.index(i)] = "G"
 		when 8
 			message[message.index(i)] = "H"
 		when 9
 			message[message.index(i)] = "I"
 		when 10
 			message[message.index(i)] = "J"
 		when 11
 			message[message.index(i)] = "K"
 		when 12
 			message[message.index(i)] = "L"
 		when 13
 			message[message.index(i)] = "M"
 		when 14
 			message[message.index(i)] = "N"
 		when 15
 			message[message.index(i)] = "O"
 		when 16
 			message[message.index(i)] = "P"
 		when 17
 			message[message.index(i)] = "Q"
 		when 18
 			message[message.index(i)] = "R"
 		when 19
 			message[message.index(i)] = "S"
 		when 20
 			message[message.index(i)] = "T"
 		when 21
 			message[message.index(i)] = "U"
 		when 22
 			message[message.index(i)] = "V"
 		when 23
 			message[message.index(i)] = "W"
 		when 24
 			message[message.index(i)] = "X"
 		when 25
 			message[message.index(i)] = "Y"
 		when 26
 			message[message.index(i)] = "Z"
 		end
 	end
 	message.join #make the super-crypted array back into a 100% UNBREAKABLE CRYPTED STRING
end

