|
|
|
|
|
для: SoftTime
(20.06.2007 в 12:08)
| | Увы, 80 баллов.
64 - Декодирование выполняется с ошибкой.
16 - высокий overhead. Впрочем, автор на это шел...
Тест вырубается набором данных вида "\0".
Самое интересное, что на длинном наборе данных, тест был пройден. :)
Автор работатет с длинющей битовой строкой.
Весьма смелое решение, поскольку длинная арифметика
- не такая уж простая вещь.
В то время как 25% довесок означает, что на каждые 4 байта исходных данных
добрасывается один пятый. И задачу вполне можно решать четверками байт.
Штрафных баллов : 80
Проверка на длинном тестовом наборе: 65792 байт
Ошибок декодирования тестового набора данных не выявлено
Размер кода: 87724 байт, Overhead: 33.34 %
=== Относительная скорость кодирования: 6.29657580801 ===
= Относительная скорость декодирования: 6.92602833819 ===
|
| |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|