Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 002 на задачу N 22
 
 автор: SoftTime   (20.06.2007 в 12:08)   письмо автору
 
 

Ответ 002 на задачу N 22.
С условиями задачи можно ознакомится по ссылке.
<?php

function my_str_repeat($input,$multiplier){
    
$input=(string)$input;
    
$multiplier=(int)$multiplier;
    
$result='';
    for(
$i=0;$i<$multiplier;$i++)$result.=$input;
    return 
$result;
}
function 
my_decbin($number,$len){
    
$number=(int)$number;
    
$bin='';
    while(
$number>=1){
        
$bin=($number%2).$bin;
        
$number>>=1;
    }
    return 
my_str_repeat('0',$len-strlen($bin)).$bin;
}
function 
my_bindec($binary_string){
    
$binary_string=(string)$binary_string// принимаем строку
    
$dec=0;
    
$len=strlen($binary_string);
    for(
$i=0;$i<$len;$i++){
        
$posval=(int)$binary_string{$i};
        
$dec+=$posval<<($len-$i-1);
    }
    return 
$dec;
}

/* Выше описание вспомогательных функций-заменителей */

//define('BUFF_SIZE',119);
//define('INDEX_SIZE',7);
//exit;
define('BUFF_SIZE',24);
define('INDEX_SIZE',6);
function 
user_encode($data,$abc){
    
$data=(string)$data;
    
$abc=(string)$abc;
    
$len=strlen($data);
    
$bindata='';
    for(
$i=0;$i<$len;$i++){ // преобразуем строку в двоичный код
        
$bindata.=my_decbin(ord($data{$i}),8);
    }
    
$bindata.=my_str_repeat('0',BUFF_SIZE-strlen($bindata)%BUFF_SIZE); // добавляем "0" до делимости размера на размер буфера
    
$binlen=strlen($bindata);
    
$result='';
    for(
$i=0;$i<$binlen;$i+=INDEX_SIZE){
        
$index=my_bindec(substr($bindata,$i,INDEX_SIZE)); // выделяем значение индекса
        
$result.=$abc{$index}; // добавляем значение из алфавита по индексу
    
}
    return 
$result;
}
function 
user_decode($text,$abc){
    
$text=(string)$text;
    
$abc=(string)$abc;
    
$len=strlen($text);
    
$bindata='';
    for(
$i=0;$i<$len;$i++){
        
$index=strpos($abc,$text{$i}); // значение индекса
        
$bindata.=my_decbin($index,INDEX_SIZE);
    }
    
$binlen=strlen($bindata);
    
$data='';
    for(
$i=0;$i<$binlen;$i+=8)$data.=chr(my_bindec(substr($bindata,$i,8)));
    
$data=rtrim($data,chr(0));
    return 
$data;
}

?>


С алфавитом из 85 символов так ничего и не получилось. Функция пыталась брать из строки символы с индексом > 84. Попытался сделать подобие base64, вроде получилось, но некорректно работает с нулевым байтом.

http://www.softtime.ru/info/task.php?id_article=111

   
 
 автор: Unkind   (22.06.2007 в 13:38)   письмо автору
 
   для: SoftTime   (20.06.2007 в 12:08)
 

Вот если бы был разрешен еще один символ...Например, пробел, то и с этими нулевыми байтами можно было бы разобраться...

   
 
 автор: Trianon   (22.06.2007 в 14:28)   письмо автору
 
   для: SoftTime   (20.06.2007 в 12:08)
 

Увы, 80 баллов.
64 - Декодирование выполняется с ошибкой.
16 - высокий overhead. Впрочем, автор на это шел...
Тест вырубается набором данных вида "\0".
Самое интересное, что на длинном наборе данных, тест был пройден. :)

Автор работатет с длинющей битовой строкой.
Весьма смелое решение, поскольку длинная арифметика
- не такая уж простая вещь.
В то время как 25% довесок означает, что на каждые 4 байта исходных данных
добрасывается один пятый. И задачу вполне можно решать четверками байт.

Штрафных баллов : 80
Проверка на длинном тестовом наборе: 65792 байт
Ошибок декодирования тестового набора данных не выявлено 
Размер кода: 87724 байт, Overhead: 33.34 %
=== Относительная скорость кодирования: 6.29657580801 === 
= Относительная скорость декодирования: 6.92602833819 === 

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования