Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Что то не допру никак  (Прочитано 13301 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« : 26-02-2013 00:15 » 

Есть код (откуда он взялся, просьба не спрашивать), когда ты такая молодая и такая наивная, мало ли что может произойти, попади в руки perl  Ага
Код: (Perl)
for ($j = 0; $j < length $input; $j++) {
$out .= chr($r ^ ord(substr($input, $j)))}
Что есть что: input - строка, r - число. И так, этим делом мы строку превратили во что то невменяемое, теперь вопрос, а как вернуть, т.е. никак не могу сообразить обратное преобразование. Если не жалко, хотелось бы помощи кодом (че то голова пухнет, обратное для возведение в степень - вычислить корень, в переле только квадратный из штатного), если жалко кодом помочь  Скромно так... , то по пунктам распишите пож. алгоритм, по которому можно восстановить строку...
« Последнее редактирование: 26-02-2013 17:12 от McZim » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 26-02-2013 05:53 » 

man perlfunc
man perlop

Эх, Вика, Вика... Не может данный код работать. Синтаксическая ошибка.

Не показана инициализация $r и $out. Если игнорировать предупреждения, у тебя они автоматически инициализируются 0 и "" соответственно. Лучше инициализировать явно.

Почитай про операцию XOR (оператор "^"). Это ключ к твоему вопросу.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 26-02-2013 07:20 » 

vika, так XOR тем и хорош, что восстановление делается тем же самым алгоритмом.

0101 0101 ^ 0011 0011 = 0110 0110
0110 0110 ^ 0011 0011 = 0101 0101
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #3 : 26-02-2013 17:37 » 

man perlfunc
man perlop

Эх, Вика, Вика... Не может данный код работать. Синтаксическая ошибка.

Не показана инициализация $r и $out. Если игнорировать предупреждения, у тебя они автоматически инициализируются 0 и "" соответственно. Лучше инициализировать явно.

Почитай про операцию XOR (оператор "^"). Это ключ к твоему вопросу.

Дык я же кусок только привела из программы, т.к. вопрос был именно по этой части, сами переменные объявлены еще в начале программы, т.к. остальная часть тут не исп-ся.  :Улыбаюсь Ну и наконец, не работай данная программа, зачем же мне понадобилось бы восстанавливать исходную строку? Улыбаюсь

Добавлено через 56 секунд:
vika, так XOR тем и хорош, что восстановление делается тем же самым алгоритмом.

0101 0101 ^ 0011 0011 = 0110 0110
0110 0110 ^ 0011 0011 = 0101 0101

Спасибо, попробуем
« Последнее редактирование: 26-02-2013 17:38 от vika » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 26-02-2013 18:27 » 

vika, это заслуга Perl, но не твоя. Добавь в начало файла строку «use strict;» и много узнаешь про свою программу. Рекомендую делать это почаще и программы будут надежнее.

Вот как работает программа:

$ perl -We '$out = ""; $r = 0; $input = "abcd"; for ($j = 0; $j < length $input; $j++) {
$out .= chr($r ^ ord(substr($input, $j)))}';

И вот как она не работает:

$ perl -We 'use strict; $out = ""; $r = 0; $input = "abcd"; for ($j = 0; $j < length $input; $j++) {
$out .= chr($r ^ ord(substr($input, $j)))}';
Global symbol "$out" requires explicit package name at -e line 1.
Global symbol "$r" requires explicit package name at -e line 1.
Global symbol "$input" requires explicit package name at -e line 1.
Global symbol "$j" requires explicit package name at -e line 1.
Global symbol "$j" requires explicit package name at -e line 1.
Global symbol "$input" requires explicit package name at -e line 1.
Global symbol "$j" requires explicit package name at -e line 1.
Global symbol "$out" requires explicit package name at -e line 2.
Global symbol "$r" requires explicit package name at -e line 2.
Global symbol "$input" requires explicit package name at -e line 2.
Global symbol "$j" requires explicit package name at -e line 2.
Execution of -e aborted due to compilation errors.

Хотя, признаюсь, удивлен, что точку с запятой Perl все равно не затребовал. Но уверен, что ошибок и так хватит.
« Последнее редактирование: 26-02-2013 18:32 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #5 : 26-02-2013 18:40 » new

Ну я с вами спорить уважаемый RXL, что сс**ь против ветру  Краснею, ужо вы более опытнее и само собой, видите все недочеты и пробелы заранее.
Только ведь у каждого свои цели, мне, например, за глаза хватает и того, что пара заумных строк делает свое нехорошее дело, а если эту программу куда нить на олимпиаду отправлять, то конечно.
Я вот что хочу узнать, а зачем вообще нужны эти стрикты, для "понтов" среди бывалых проггеров, ну вроде как у меня все хорошо и гладко, аж интерпретатор все это скушал и не подавился. Если для отладки еще понятно, но когда в программе пара строк, то суть отладки непонятна в принципе.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 26-02-2013 18:53 » 

Верно подмечено — хрен переспоришь. Я, конечно, стараюсь не особо обращать внимание на недостатки текстов, но порой не удерживаюсь. И глубоко убежден, что принцип «работает же — **** вылизывать» ущербный и чреват проблемами как в дальнейшей поддержке программы, так и в разработке новых. А вот на олимпиаду все равно что отправлять — там вот, как раз, лишь бы заработало, а дальше хоть трава не расти.

Ограничители занимаются, казалось бы, вредным делом: душат вольный синтаксис и еще более вольное использование идентификаторов. Но это только кажется, по неопытности. Синтаксис Perl и без того предоставляет широкие вариации, а вот контроль ошибок без ограничений крайне слаб.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #7 : 27-02-2013 00:46 » 

Ну все работает, вернуть исходную строку удалось, как это ни странно, точно так же, как и закодировать.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 27-02-2013 05:18 » 

С чем тебя от всего сердца и поздравляю! Удач на олимпиадах! Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #9 : 27-02-2013 20:33 » 

С чем тебя от всего сердца и поздравляю! Удач на олимпиадах! Улыбаюсь
Спс, только я в них не участвовала и вроде не собиралась.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines