?

Log in

No account? Create an account
entries friends calendar profile Previous Previous Next Next
эрлажное - ruik-ruik! röhh-röhh!
raydac
raydac
эрлажное
осваиваю помаленьку эрланг, глядя как развивалась мысль его создателей которые писали первую версию на Prolog, мне напомнило как я сам на базе языка forth в 90-х родил Forth для web и Чак Мур наверное убил бы меня за это, так как там у меня тоже появились try..catch и прочее из Delphi на которой я тогда программил для десктопов ))) но пару лет энтерпрайз система на нем отработала в рамках немаленького предприятия


так что пишу небольшие всякие программки на erlang для освоения конструкций, например программка для решения эстонской задачки из предыдущих постов выглядит у меня следующим образом (понятно что это на скорую руку и не для продакшена)

-module(test).
-export([decodeestonian/0).

decodeestonian()-> Text = [129, 146, 153, 74, 147, 157, 74, 158, 146, 143, 74, 139, 159, 158, 146, 153, 156, 74, 153, 144,
    74, 76, 126, 146, 143, 74, 114, 147, 158, 141, 146, 146, 147, 149, 143, 156, 81, 157, 74, 113,
    159, 147, 142, 143, 74, 158, 153, 74, 158, 146, 143, 74, 113, 139, 150, 139, 162, 163, 76, 105,
    74, 122, 150, 143, 139, 157, 143, 74, 157, 143, 152, 142, 74, 163, 153, 159, 156, 74, 139, 152,
    157, 161, 143, 156, 74, 158, 153, 74, 148, 153, 140, 157, 106, 151, 153, 153, 152, 141, 139, 157,
    141, 139, 142, 143, 88, 141, 153, 151, 86, 74, 161, 147, 158, 146, 74, 163, 153, 159, 156, 74,
    109, 128, 74, 153, 156, 74, 118, 147, 152, 149, 143, 142, 115, 152, 74, 127, 124, 118, 88, 52], decode(256,Text).

decode(Shift,Text) -> case Shift of
        0 -> {0,'end'};
        _ -> Shifted = rottext1(Text), NextShift = Shift-1, {{Total, En, Sp}, Decoded} = Shifted,
                if
                    En / Total > 0.01, Sp > 5 ->  io:format("~n~p/~p: ~s~n",[Total,En,Decoded]);
                    true -> io:format(".",[])
                end,
            decode(NextShift,Decoded)
        end.

rottext1(Encoded) -> Shifted = rot1(Encoded), Stat = calculate_e(Shifted), {Stat,Shifted}.

rot1(Encoded) ->  [ (X+1) band 255   || X <- Encoded].

calculate_e(Text) -> case Text of
            [] -> {0,0,0};
            [C | Tail] -> case C of
                    $e -> {Total,En,Sp} = calculate_e(Tail), {Total+1,En+1,Sp};
                    $E -> {Total,En,Sp} = calculate_e(Tail), {Total+1,En+1,Sp};
                    32 -> {Total,En,Sp} = calculate_e(Tail), {Total+1,En,Sp+1};
                    _  -> {Total,En,Sp} = calculate_e(Tail), {Total+1,En,Sp}
                      end
              end.

Tags:

16 comments or Leave a comment
Comments
metaclass From: metaclass Date: March 13th, 2012 03:00 am (UTC) (Link)
Ты анализируешь частоты символов в декодированном тексте?
raydac From: raydac Date: March 13th, 2012 03:23 am (UTC) (Link)
я перебираю все вариант (их всего то 256) и для каждого очередного смотрю сколько там встретилось букв 'e' и 'E', а так же символов пробела
metaclass From: metaclass Date: March 13th, 2012 04:38 am (UTC) (Link)
Я вывел 256 вариантов в текстовый файл и просмотрел глазами :)
raydac From: raydac Date: March 13th, 2012 04:45 am (UTC) (Link)
при таком небольшом количестве это тоже нормальный выход имхо
raydac From: raydac Date: March 13th, 2012 04:51 am (UTC) (Link)
умные люди вон допетрили что в конце знак перевода строки и исходя изх этого сразу получили показатель сдвига ))) так что нас с тобой в гугель бы не взяли )))
metaclass From: metaclass Date: March 13th, 2012 05:10 am (UTC) (Link)
Наш подход более универсален и не требует угадывания )
adovzh From: adovzh Date: March 13th, 2012 06:43 am (UTC) (Link)
Я почти сразу обратил внимание на часто встречающееся число 74 и предположил, что это пробел (со сдвигом на 42). Проверил по таблице по первым трём символам, оказалось, что угадал сразу, получил вполне читаемое слово who. Дальше - программка на C, перекидывающая int[] в char[] со сдвигом, и \0 в конец буфера :)
raydac From: raydac Date: March 13th, 2012 06:47 am (UTC) (Link)
а кто то обратил внимание на последний символ и тут же вычислил смещение )))
lionet From: lionet Date: March 13th, 2012 07:07 am (UTC) (Link)
А кто-то подождал день и увидел труп проплывающего врага в блогах.
raydac From: raydac Date: March 13th, 2012 07:09 am (UTC) (Link)
на php в инете уже давно решение опубликовано, гуглится
lionet From: lionet Date: March 13th, 2012 07:12 am (UTC) (Link)
Это-ж самому ловить надо, а так — подождать, пока во френдленте приползёт.

P.S. У моего коллеги на работе для зашифровки/расшифровки были обнаружены две функции, с похожим, на первый взгляд, кодом. rot13 и unrot13.
raydac From: raydac Date: March 13th, 2012 07:15 am (UTC) (Link)
странно, что таким шифровать то можно, шифр вообще неустойчивый.. это как пароли Base64 шифровать )))
lionet From: lionet Date: March 13th, 2012 07:24 am (UTC) (Link)
Сразу видно, что с Cisco не работал ;)

http://www.tech-faq.com/decrypt-cisco-passwords.html

(See: type 5 encryption).
b00ter From: b00ter Date: March 13th, 2012 07:39 am (UTC) (Link)
Это читерство наиболее высшего порядка!
retiredwizard From: retiredwizard Date: March 13th, 2012 02:37 pm (UTC) (Link)
послушай - ну ведь гавно без шансов на развитие. сразу видно. не трать время даже.

посмотри на руби хотя бы - вот где забава так забава.
raydac From: raydac Date: March 13th, 2012 03:54 pm (UTC) (Link)
ну мне нередко приходится с серверными системами дело иметь, а erlang это не только функциональный язык с какими то деталями prolog, но и возможность построения распределенной системы обработки сообщений
16 comments or Leave a comment