I suppose pb 59 solution

This commit is contained in:
Yann Esposito (Yogsototh) 2011-09-16 14:15:43 +02:00
parent c3c2e580d0
commit b79d41a7d1
3 changed files with 46 additions and 4 deletions

View file

@ -81,10 +81,16 @@ void fill_content(char *filename, Array content) {
int rec_crack(Array content, Array code, Array decoded, char *buffer) { int rec_crack(Array content, Array code, Array decoded, char *buffer) {
int i; int i;
char tmp[4]; char tmp[4];
int sum=0;
char *str;
if (code->length == code->max_length) { if (code->length == code->max_length) {
decode(content,code,decoded); decode(content,code,decoded);
if (potential_good_str(str_Array(decoded,buffer))) { if (potential_good_str(str_Array(decoded,buffer))) {
fprintf(stderr,"Code: %s\nResult: %s\n",str_Array(code,tmp),buffer); fprintf(stderr,"Code: %s\nResult: %s\n",str_Array(code,tmp),buffer);
for (str=buffer; *str; str++) {
sum += *str;
}
fprintf(stderr, "Somme: %d\n",sum);
} }
} else { } else {
if (code->length == 1) { if (code->length == 1) {
@ -102,8 +108,9 @@ int rec_crack(Array content, Array code, Array decoded, char *buffer) {
int crack(Array content) { int crack(Array content) {
Array decoded=new_Array(content->max_length); Array decoded=new_Array(content->max_length);
Array code=new_Array(3); Array code=new_Array(3);
char tmp[4];
char *buffer=(char *)malloc(2000); char *buffer=(char *)malloc(2000);
/*
char tmp[4];
char *str; char *str;
int sum; int sum;
@ -118,6 +125,7 @@ int crack(Array content) {
} }
fprintf(stderr, "Somme: %d\n",sum); fprintf(stderr, "Somme: %d\n",sum);
// --- // ---
*/
rec_crack(content,code,decoded,buffer); rec_crack(content,code,decoded,buffer);
} }

21
059.hs
View file

@ -1,5 +1,20 @@
import System -- Source forum project haskell
import Data.Bits
import Data.Char
import Data.List
keys = [ [a,b,c] | a <- [97..122], b <- [97..122], c <- [97..122] ]
allAlpha a = all (\k -> let a = ord k in ( a >= 32 && a <= 122)) a
howManySpaces x = length (elemIndices ' ' x)
compareBy f x y = compare (f x) (f y)
main = do main = do
[filename] <- readArgs s <- readFile "cipher1.txt"
f <- open( let
cipher = (read ("[" ++ s ++ "]") :: [Int])
decrypts = [ (map chr (zipWith xor (cycle key) cipher), map chr key) | key <- keys ]
alphaDecrypts = filter (\(x,y) -> allAlpha x) decrypts
message = maximumBy (\(x,y) (x',y') -> compareBy howManySpaces x x') alphaDecrypts
asciisum = sum (map ord (fst message))
putStrLn ("The message " ++ (fst message) ++ " was encoded with key " ++ (snd message))
putStrLn (show asciisum)

19
059.pl Executable file
View file

@ -0,0 +1,19 @@
#!/usr/bin/perl
# Source projecteuler.net forum
use List::Util qw/ sum /;
open(FILE,"cipher1.txt") or die ("Unable to open file");
$cypher = join '', map { chr($_) } split /,/,<FILE>;
$l = length $cypher;
for my $key ('aaa' .. 'zzz') {
$text = $cypher ^ ( $key x int ($l/3)
. substr($key,0,$l%3)
);
if ( $text =~ / and /i or $text =~ / the /i ) {
print "$key: $text$/";
last;
}
}
print "Ascii total: ", sum map { ord($_) } split //, $text;
print "\n";