![]() |
eXeL@B —› Программирование —› FunctionReverse |
Посл.ответ | Сообщение |
|
Создано: 18 февраля 2009 21:06 · Поправил: Isaev · Личное сообщение · #1 Имеется функция: Code:
Как её обратить? Спать не могу! ![]() PS: '& #036' = $ ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 19 февраля 2009 12:16 · Поправил: Wyfinger · Личное сообщение · #2 |
|
Создано: 19 февраля 2009 13:41 · Поправил: OKOB · Личное сообщение · #3 |
|
Создано: 19 февраля 2009 14:15 · Личное сообщение · #4 Возможно я маленько напутал с этой перестановкой в конце, и еще обращая функцию Van возможны варианты: можно выбрать результат из 0-9, ABEHKNRWXZ, либо найти печатный символ подходящий по модулю 5, поэтому мой вариант неполон, но вроде работает: Code:
![]() |
|
Создано: 19 февраля 2009 15:56 · Поправил: Isaev · Личное сообщение · #5 OKOB пишет: L всегда '0123401234' ?? Да, только '123401234012340' OKOB пишет: Какой набор символов на входе? На входе строка типа 'R3B6ANW4X93ZKEH' всегда 15 символов из набора Symb+цифры (т.е. из 'R3B6ANW4X93ZKEH' получием '574493242362140') На выходе строка 15 символов, из только цифр... (0..9) В обратной функции нужно с точностью до наоборот Wyfinger сейчас проверим ![]() Частично совпадает, но где-то косячок... Пробую найти ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 19 февраля 2009 16:05 · Личное сообщение · #6 |
|
Создано: 19 февраля 2009 18:11 · Личное сообщение · #7 Проблема обратимости в том, что функция Function Von(C:Char;K:Byte):Byte; возвращает значения в диапазоне 0..9, причем одно и тоже значение для разных входных (неоднозначность) Например: вернет 0 для С = '0' (C in ['0'..'9'] then Result:=Ord(C)-$30) или С = 'A' (for N:=1 to 10 do if Symb[N]=C then break; (N=1) If N=11 Then Result:=K Mod 5 Else Result:=N-1;) или С = 'C' и K=5 (for N:=1 to 10 do if Symb[N]=C then break; (N=11) If N=11 Then Result:=K Mod 5 Else Result:=N-1;) Поэтому при обращении и входном 0, неизвестно, что должно быть. ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 19 февраля 2009 20:10 · Поправил: Isaev · Личное сообщение · #8 OKOB пишет: Поэтому при обращении и входном 0, неизвестно, что должно быть. Там зависимость от впередистоящих символов поэтому и считается M:=Von(Result[N-2],N)+Von(Result[N-1],N); и результат на выходе однозначный... т.е. в отладчике смотрю и в голове автоматически строю уже правильный код, а написать не могу ![]() поэтому и обращать нужно учитывая предыдущие символы (или при обращении последующие) смотря откуда обходить причём люди это дело закейгенили! (не учли только возможность русских имён) т.ч. всё должно быть однозначно ![]() ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 20 февраля 2009 02:36 · Личное сообщение · #9 Isaev пишет: Там зависимость от впередистоящих символов Да нет, конечно возможны неоднозначности. Вот мой усовершенствованный вариант, работает отлично: Code:
![]() |
|
Создано: 20 февраля 2009 18:20 · Поправил: Isaev · Личное сообщение · #10 Wyfinger Огромное спасибо! Действительное работает при любых значениях! т.к. OKOB был прав, извиняюсь... Я уж думал исходную функцию не правильно написал ![]() один косяк только был function unVon(V, N: Byte): Char; begin if V = (N mod 5) then Result := getRnd('0123456789') else Result := Symb[V mod 10+1]; end; ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 21 февраля 2009 13:14 · Личное сообщение · #11 |
|
Создано: 21 февраля 2009 16:16 · Личное сообщение · #12 |
![]() |
eXeL@B —› Программирование —› FunctionReverse |
Эта тема закрыта. Ответы больше не принимаются. |