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

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

 

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

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

тема: Задача N 22. Кодирование данных (продолжение).
 
 автор: cheops   (18.06.2007 в 10:38)   письмо автору
 
 

Предыдущая тема уже очень длинная, поэтому продолжение обсуждения переносится сюда.

http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=38855

   
 
 автор: Unkind   (18.06.2007 в 14:09)   письмо автору
 
   для: cheops   (18.06.2007 в 10:38)
 

А в той форме, куда нужно вводить ответ нужно ввести имя. И никакого пароля.
Вроде Вы говорили, что если послать ответ еще раз, то он перезапишется. Следовательно, я могу, например, удалить ответ Trianon'а, введя его имя.
Я, надеюсь, ошибаюсь.

   
 
 автор: Trianon   (18.06.2007 в 14:57)   письмо автору
 
   для: Unkind   (18.06.2007 в 14:09)
 

Внешне - этого не видно.
Форма прошита сессией.
Я отправил под именем Unkind сообщение из двух слов vulnerability test
Отлупа никакого не было.
Посмотрим, что скажет начальник транспортного цеха.

   
 
 автор: cheops   (18.06.2007 в 16:34)   письмо автору
 
   для: Unkind   (18.06.2007 в 14:09)
 

Нет, результат не будет перезаписан - они все сохраняются, но публикуется только последний, если будет какое-то недоразумение - обязательно разберёмся. Сообщения модерируются.

   
 
 автор: Trianon   (18.06.2007 в 16:41)   письмо автору
 
   для: cheops   (18.06.2007 в 16:34)
 

А решений много накопилось? :)

   
 
 автор: cheops   (18.06.2007 в 16:47)   письмо автору
 
   для: Trianon   (18.06.2007 в 16:41)
 

Если ваше последнее сообщение не считать :), то два.

   
 
 автор: Trianon   (18.06.2007 в 17:13)   письмо автору
 
   для: cheops   (18.06.2007 в 16:47)
 

Это очень грустно... Я надеялся, что человек пять будет. Хотя бы...

   
 
 автор: cheops   (18.06.2007 в 19:08)   письмо автору
 
   для: Trianon   (18.06.2007 в 17:13)
 

Ещё не вечер.

   
 
 автор: Unkind   (20.06.2007 в 12:13)   письмо автору
 
   для: cheops   (18.06.2007 в 19:08)
 

А что это за категории задач? Например, тут: http://www.softtime.ru/article/index.php?id_article=110
Категория - 2

   
 
 автор: cheops   (21.06.2007 в 10:13)   письмо автору
 
   для: Unkind   (20.06.2007 в 12:13)
 

Сложность задачи (параметр субъективный).

   
 
 автор: mr Bin   (21.06.2007 в 18:17)   письмо автору
 
   для: cheops   (21.06.2007 в 10:13)
 

А как его понимать?

Чем больше значение, тем сложнее?
До какого значения бывает сложность?

   
 
 автор: cheops   (21.06.2007 в 21:29)   письмо автору
 
   для: mr Bin   (21.06.2007 в 18:17)
 

Да, чем больше значение, тем больше сложность, пока больше 3 не было.

   
 
 автор: Trianon   (22.06.2007 в 00:42)   письмо автору
 
   для: cheops   (21.06.2007 в 21:29)
 

мне следующую задачу придумывать?

   
 
 автор: Unkind   (22.06.2007 в 00:57)   письмо автору
 
   для: Trianon   (22.06.2007 в 00:42)
 

Кстати, помните была тема, в которой был разговор об отображении счетчика новых сообщений? Могли бы что-нибудь на эту тему дать...

   
 
 автор: Trianon   (22.06.2007 в 01:27)   письмо автору
 
   для: Unkind   (22.06.2007 в 00:57)
 

Тема хорошая, но для этого надо набросать самый примитивный форум. И уже к нему приделывать ластриды.
Не к лайту же их присобачивать....

   
 
 автор: cheops   (22.06.2007 в 11:11)   письмо автору
 
   для: Trianon   (22.06.2007 в 00:42)
 

>мне следующую задачу придумывать?
Да, но сначала нужно оценить предыдущие ответы.

   
 
 автор: Trianon   (22.06.2007 в 11:23)   письмо автору
 
   для: cheops   (22.06.2007 в 11:11)
 

ага. Сейчас поглядим :)

   
 
 автор: Trianon   (22.06.2007 в 14:40)   письмо автору
 
   для: Trianon   (22.06.2007 в 11:23)
 

Указанные баллы видны при выполнении user.php с нужными функциями из ответов претендентов под управлением следующего варианта тестовой обложки:

<form method=post action = ?>
Алфавит:
<input size=100 name=abc value="!$()*+,-./0123456789:=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~">
<br>Строки данных:<br>
<textarea cols=100 rows=10 name=list >
 AA==
 Quicks
brown
fox
jumps
over
dog
!!

я
</textarea>
<br><input type=submit value=Go />
</form>
<hr>
<?php
function bubble($abc){   // Любезно предоставлено Eugene77
for($unsorted=true$unsorted; ){
    
$unsorted=false;
    for(
$i=0$i<84$i++) {
        if(
$abc[$i]> $abc[$i+1]) {
            
$tmp $abc[$i];
            
$abc[$i] = $abc[$i+1];
            
$abc[$i+1] = $tmp;
            
$unsorted true;
        }
    }
}
return 
$abc;
}
//error_reporting(E_ALL-E_NOTICE);
include 'user.php';
//function user_encode($x, $abc) {return  base64_encode($x); }
//function user_decode($x, $abc) {return base64_decode($x); }

    
if(!isset($_POST['list'])|| @strlen($_POST['abc'])<2) exit;
    
$list get_magic_quotes_gpc()? stripslashes($_POST['list']):$_POST['list'];
    
$abc get_magic_quotes_gpc()? stripslashes($_POST['abc']):$_POST['abc'];
    
$abc bubble(str_replace(" """$abc));
    
$list explode("\r\n"$list);
    echo 
"<table border=1>";
    
$maxres 0;
    foreach(
$list as $msg)
    {
        if(isset(
$dm))   { $dm0 $dm$em0 $em; }
        if(
strlen($msg) > && $msg[0] == ' ')
            
$msg base64_decode($msg);
        
$em user_encode($msg$abc);
        
$dm user_decode($em$abc);
        
$res '';
        if(
$msg !== $dm$res '64 - данные не декодировались';
        else
        {
          
$abc0 count_chars($abc,1);
          
$abc1 count_chars($em,1);
          
$extra '';
          foreach(
$abc1 as $key =>$val)
            if(!isset(
$abc0[$key]))
             
$extra .= sprintf(" %02X"$key);
          if(
strlen($extra))
            
$res "32 - применены символы не из алфавита, с кодами $extra";
          else
          {
            
$l1 strlen($dm);
            
$l2 strlen($em);
            
$max floor(($l1*1.25 7)/8);
            if(
$l2 $max)
               
$res "16 - код длинее оптимального на ".($l2 $max)."  байт";
            else if(isset(
$dm0))
            {
              
$cmp = ($dm0 $dm) !== ($em0 $em);
              if(
$cmp)
                
$res "8 - сравнение кодов не соответствует сравнению данных";
            }
          }
        }
        
$maxres |= intval($res);
        echo 
"<tr>"
                
."<td>".htmlspecialchars($msg)."</td>"
                
."<td>".htmlspecialchars($em)."</td>"
                
."<td>".htmlspecialchars($dm)."</td>"
                
."<td>.  $res</td></tr>";
    }
    echo 
"</table> Штрафных баллов : ".$maxres;

        
$z=$y=$x='';
    for(
$x='.'$l 0$l 256$l++)
    
$x.= chr($l);
    for(
$k 0$k 256$k++)
      
$y .= $x;
    
$n strlen($y);
    for(
$k 0$k 256$k++)
      
$z .= $y;
    echo(
"<br/>Проверка на длинном тестовом наборе: $n байт");
    
$tm microtime(1);
    
base64_encode(base64_encode(base64_encode(base64_encode(base64_encode($z)))));//, $abc);
    
$tm1 microtime(1)-$tm;
    
$z '';
    
$tm microtime(1);
    
$p user_encode($y$abc);
    
$tm2 = (microtime(1)-$tm)/$tm1;
    
$tm microtime(1);
    
$q user_decode($p$abc);
    
$tm3 = (microtime(1)-$tm)/$tm1;
    
$nn strlen($p);
    
$nq round(($nn-$n)*100/$n2);

    if(
$q != $y)
    {
       echo 
"<br/>Тестовый набор данных декодирован с ошибкой:";
       
$m strlen($q);
       if(
$n != $m) echo("<br/>Размер копии: $m");
       
$m min($n$m);
       for(
$i $errs 0$i $n;$i++)
       
$errs += ord($y[$i]) != ord($q[$i]);
       if(
$errs) echo("<br/>В копии не совпадают с оригиналом $errs байт");
       ++
$errs;
    }

     echo 
"<br/>Ошибок декодирования тестового набора данных не выявлено
           <br/>Размер кода: 
$nn байт, Overhead: $nq %";

    if(!
$errs) echo "<br/>=== Относительная скорость кодирования: $tm2 ===
    <br/>= Относительная скорость декодирования: 
$tm3 === <br/>\r\n";
?>

   
 
 автор: Trianon   (22.06.2007 в 17:21)   письмо автору
 
   для: Trianon   (22.06.2007 в 14:40)
 

Что ж... наверное, надо показать свой пример?
А то, помнится, нашлись товарищи, утверждавшие, что задача не решается в принципе.
Уже можно? Или кто-нибудь всё же внесет коррективы?

   
 
 автор: Unkind   (22.06.2007 в 18:25)   письмо автору
 
   для: Trianon   (22.06.2007 в 17:21)
 

Показывайте.

   
 
 автор: Trianon   (22.06.2007 в 18:36)   письмо автору
 
   для: Unkind   (22.06.2007 в 18:25)
 


<?php   // Trianon

function user_encode($s,
$m='!$()*+,-./0123456789:=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~'
                        
)
{

$v ''$n strlen($s); $i $j 0;
  for(
$i=3$i $n;$i+=4)
  {
    
$b3 ord($s[$i-3]);
    
$b2 ord($s[$i-2]);
    
$b1 ord($s[$i-1]);
    
$b0 ord($s[$i]);
    
$b321 = ((($b3<<8)+$b2)<<8)+$b1// 3 старших байта
    
$b3210h= ($b321<<6)|($b0>>2);     // и еще 6 бит младшего
    
$r4 $b3210h 21;
    
$q4 = (($b3210h-$r4)/21);
    
$r4 = ($r4<<2)|($b0&3); // подобрали оставшиеся два бита

    
$r3 $q4%85;   $q3 = ($q4-$r3)/85;
    
$r2 $q3%85;   $q2 = ($q3-$r2)/85;
    
$r1 $q2%85;   $r0 = ($q2-$r1)/85;
 
// $r0 = $q1%85;   $q0 = ($q1-$r0)/85;

    
$v .= $m[$r0].$m[$r1].$m[$r2].$m[$r3].$m[$r4];
  }

  if((
$i -= 3)<$n)
  {   
$k $n-$i;
      
$b3 ord($s[$i++]);
      
$b2 $i $n ord($s[$i++]) : 0;
      
$b1 $i $n ord($s[$i++]) : 0;
      
$b321 = (((($b3<<8)+$b2)<<8)+$b1)<<6// 3 старших байта
    
$q4= ($b321-$b321%21)/21;
    
$r3 $q4%85;   $q3 = ($q4-$r3)/85;
    
$r2 $q3%85;   $q2 = ($q3-$r2)/85;
    
$r1 $q2%85;   $r0 = ($q2-$r1)/85;
 
// $r0 = $q1%85;   $q0 = ($q1-$r0)/85;
      
$v .= $m[$r0].$m[$r1];
      if(
$k>1$v .= $m[$r2];
      if(
$k>2$v .= $m[$r3];
  }
  return 
$v;
}

function 
user_decode($s,
$mm='!$()*+,-./0123456789:=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~'
                       
)
{
  static 
$m;
  if(!
$m)
  {
     
$m = array();
//  $mm
      
for($i 0$i 85$i++)
          
$m[$mm[$i]] = $i;
  }

  
$v ''$n strlen($s); $i $j 0;
  for(
$i=4$i $n$i+=5)
  {
      
$r0 $m[$s[$i-4]];
      
$r1 $m[$s[$i-3]];
      
$r2 $m[$s[$i-2]];
      
$r3 $m[$s[$i-1]];
      
$r4 $m[$s[$i]];

      
$r0123 = ((((($r0*85)+$r1)*85+$r2)*85)+$r3)*21+($r4>>2);
      
$b0 = (($r0123 &63)<<2)|($r4&3);
      
$r0123 >>=6$b1 $r0123&255;
      
$r0123 >>=8$b2 $r0123&255;
      
$r0123 >>=8$b3 $r0123&255;
      
$v .= chr($b3).chr($b2).chr($b1).chr($b0);
  }
  if((
$i-=4) <$n)
  {
      
$r0 $m[$s[$i++]];
      
$k  $n-$i;
      
$r1 $k>0$m[$s[$i++]] : 84;
      
$r2 $k>1$m[$s[$i++]] : 84;
      
$r3 $k>2$m[$s[$i++]] : 84;

      
$r0123 = (((($r0*85)+$r1)*85+$r2)*85+$r3)*21+20;
      
$b3 = ($r0123>>22)&255;
      
$b2 = ($r0123>>14)&255;
      
$b1 = ($r0123>>6)&255;
      
$v .= chr($b3);
      if(
$k 1)  $v .= chr($b2);
      if(
$k 2)  $v .= chr($b1);
      if(
$k 3)  $v .= chr($b0);
  }
  return 
$v;
}

?>


Мне не очень нравится этот код, точнее, примененный в нем алгоритмический прием.
Но решение абсолютно честное - выглядит еще более коряво.

   
 
 автор: Drago   (18.06.2007 в 20:17)   письмо автору
 
   для: Trianon   (18.06.2007 в 17:13)
 

Задачка сложновата. Особенно для тех, кто ни разу не занимался кодированием.

   
 
 автор: Trianon   (18.06.2007 в 21:04)   письмо автору
 
   для: Drago   (18.06.2007 в 20:17)
 

Других, к сожалению, нет.
Да и попросили, помнится, заковыристую.

   
 
 автор: mr Bin   (19.06.2007 в 09:31)   письмо автору
 
   для: Trianon   (18.06.2007 в 21:04)
 

Лучше придумайте такую задачку, которая многим понадобится для использования на своём сайте, но делать этого они пока не хотели...
Без личного интереса - много ответов не будет.

   
 
 автор: @ndry   (05.07.2007 в 23:03)   письмо автору
 
   для: cheops   (18.06.2007 в 10:38)
 

ну так какое решение лучше всего?

   
 
 автор: cheops   (06.07.2007 в 06:33)   письмо автору
 
   для: @ndry   (05.07.2007 в 23:03)
 

http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=39444

   
Rambler's Top100
вверх

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