|
|
|
| Предыдущая тема уже очень длинная, поэтому продолжение обсуждения переносится сюда.
http://www.softtime.ru/forum/read.php?id_forum=7&id_theme=38855 | |
|
|
|
|
|
|
|
для: cheops
(18.06.2007 в 10:38)
| | А в той форме, куда нужно вводить ответ нужно ввести имя. И никакого пароля.
Вроде Вы говорили, что если послать ответ еще раз, то он перезапишется. Следовательно, я могу, например, удалить ответ Trianon'а, введя его имя.
Я, надеюсь, ошибаюсь. | |
|
|
|
|
|
|
|
для: Unkind
(18.06.2007 в 14:09)
| | Внешне - этого не видно.
Форма прошита сессией.
Я отправил под именем Unkind сообщение из двух слов vulnerability test
Отлупа никакого не было.
Посмотрим, что скажет начальник транспортного цеха. | |
|
|
|
|
|
|
|
для: Unkind
(18.06.2007 в 14:09)
| | Нет, результат не будет перезаписан - они все сохраняются, но публикуется только последний, если будет какое-то недоразумение - обязательно разберёмся. Сообщения модерируются. | |
|
|
|
|
|
|
|
для: cheops
(18.06.2007 в 16:34)
| | А решений много накопилось? :) | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2007 в 16:41)
| | Если ваше последнее сообщение не считать :), то два. | |
|
|
|
|
|
|
|
для: cheops
(18.06.2007 в 16:47)
| | Это очень грустно... Я надеялся, что человек пять будет. Хотя бы... | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2007 в 17:13)
| | Ещё не вечер. | |
|
|
|
|
|
|
|
для: cheops
(18.06.2007 в 19:08)
| | А что это за категории задач? Например, тут: http://www.softtime.ru/article/index.php?id_article=110
Категория - 2 | |
|
|
|
|
|
|
|
для: Unkind
(20.06.2007 в 12:13)
| | Сложность задачи (параметр субъективный). | |
|
|
|
|
|
|
|
для: cheops
(21.06.2007 в 10:13)
| | А как его понимать?
Чем больше значение, тем сложнее?
До какого значения бывает сложность? | |
|
|
|
|
|
|
|
для: mr Bin
(21.06.2007 в 18:17)
| | Да, чем больше значение, тем больше сложность, пока больше 3 не было. | |
|
|
|
|
|
|
|
для: cheops
(21.06.2007 в 21:29)
| | мне следующую задачу придумывать? | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2007 в 00:42)
| | Кстати, помните была тема, в которой был разговор об отображении счетчика новых сообщений? Могли бы что-нибудь на эту тему дать... | |
|
|
|
|
|
|
|
для: Unkind
(22.06.2007 в 00:57)
| | Тема хорошая, но для этого надо набросать самый примитивный форум. И уже к нему приделывать ластриды.
Не к лайту же их присобачивать.... | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2007 в 00:42)
| | >мне следующую задачу придумывать?
Да, но сначала нужно оценить предыдущие ответы. | |
|
|
|
|
|
|
|
для: cheops
(22.06.2007 в 11:11)
| | ага. Сейчас поглядим :) | |
|
|
|
|
|
|
|
для: 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) > 0 && $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*8 * 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/$n, 2);
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 в 14:40)
| | Что ж... наверное, надо показать свой пример?
А то, помнится, нашлись товарищи, утверждавшие, что задача не решается в принципе.
Уже можно? Или кто-нибудь всё же внесет коррективы? | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2007 в 17:21)
| | Показывайте. | |
|
|
|
|
|
|
|
для: 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;
}
?>
|
Мне не очень нравится этот код, точнее, примененный в нем алгоритмический прием.
Но решение абсолютно честное - выглядит еще более коряво. | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2007 в 17:13)
| | Задачка сложновата. Особенно для тех, кто ни разу не занимался кодированием. | |
|
|
|
|
|
|
|
для: Drago
(18.06.2007 в 20:17)
| | Других, к сожалению, нет.
Да и попросили, помнится, заковыристую. | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2007 в 21:04)
| | Лучше придумайте такую задачку, которая многим понадобится для использования на своём сайте, но делать этого они пока не хотели...
Без личного интереса - много ответов не будет. | |
|
|
|
|
|
|
|
для: cheops
(18.06.2007 в 10:38)
| | ну так какое решение лучше всего? | |
|
|
|
|