Confuse the Dakotas
Ruby
class Dakota
PRIVATE_KEY = 8411088
def self.encrypt(str)
str.gsub(/[A-Z]/){|c|"0#{c.downcase}"}.gsub(/[a-z]+/){|s|xor(s.to_i(36),$')}
end
def self.decrypt(str)
str.gsub(/\d+/){|s|out = s.to_i.to_s(36);out[0] = out[0].upcase if s[0]==?0; out}
end
def self.xor(n, config)
n^=PRIVATE_KEY if private_env?(config)
n
end
def self.private_env?(config)
config =~ /^ .#{private}/i
end
end
puts code = Dakota.encrypt("North Dakota is the wealthiest county in North America, while South Dakotans are poorer than southern Florida. - the North Dakotan government")
puts out = Dakota.decrypt(code)
Demo
CJam
This is the encoder:
232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~
and this is the decoder:
364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~
Try it online here
This only works with capital N
, S
and D
in North/South Dakota
Pass the input string to the first function from STDIN. Get the encoded string, pass it to the second function to get the decoded and converted output.
Java
I discovered that division by zero does not cause errors in this program. This program fully encodes the Strings into a form that cannot be traced to the North Dakotan government. Due to the strange behaviour mentioned above, encoding and decoding might not work correctly in all cases.
class Program{
public static void main(String[] args){
String input = String.join(" ", args);
String encode = encode(input);
System.out.println("Encoded: " + encode);
System.out.println("Decoded: " + decode(encode));
}
static String encode(String input){
String answer = "";
input = input.replaceAll("North Dakota", "☃");//Temporarily switch these so that spies
input = input.replaceAll("South Dakota", "North Dakota");//think the message is from South Dakota
input = input.replaceAll("☃", "South Dakota");//if they decode the message.
for(int i =0; i < input.length(); i++){
answer += (char)(~input.charAt(i)) + "";
}
return answer;
}
static String decode(String input){
String answer = "";
int i;
for(i=0; i < input.length(); i++){
answer += (char)(~input.charAt(i)) + "";
}
int funnyNumber = (i+\u002f*0)/0;//Division by 0 should cause an error???
answer.replaceAll("South Dakota", "☃");
answer.replaceAll("North Dakota", "South Dakota");
answer.replaceAll("☃", "North Dakota");
//For some reason, this does not cause errors either:
funnyNumber = ((500/0)*\u002f+-2);
return answer;
}
}
Question: What does funnyNumber
equal?