Полибианский квадрат

Discussion in 'PHP' started by .::BARS::., 27 Mar 2011.

  1. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    Помогите, пожалуйста, сделать сабж...

    Дано:
    1.Открытый текст;
    2.Квадратная таблица, заполненная буквами латинского алфавита в случайном порядке.

    При шифровании в этом квадрате находят букву открытого текста и записывают в шифртекст букву, расположенную ниже ее в том же столбце. Если буква текста оказывается в нижней строке таблицы, то для шифртекста берут самую верхнюю букву из того же столбца.

    нужно именно пхп...
    в нете полно всякого но на пыхе нет...
    а для счастья не хватает
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    .::BARS::. найдите на C и перепишите, даже синтаксис сильно не изменится

    Что именно не получается? Или это "ой, дали задание, а мне лень думать, напишу на античат"?
     
    _________________________
  3. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    дело в том что я нахожу на делфи и оооочень примитив...
     
  4. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Аха)) Даже текст поста автор писан скорее всего не сам)
    Видел 1в1 вопрос чтоб написали на других языках)))) Ну прям буква в букву.
    Могу линки дать))))
     
  5. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    сам написал
     
  6. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    =))) есть такое... там на делфи....
     
  7. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    PHP:
            echo '<form method="post">
            Исходный текст:<br />
            <textarea rows="10" cols="40" name="text">'
    $_POST['text'] .'</textarea><br />
            <input type="submit" name="go" value="Шифровать!" />
            </form>'
    ;
            if(isset(
    $_POST['go'])){
                
    $text $_POST['text'];
                
    $alphabet = array('а''б''в''г''д''е''ё''ж''з''и''й''к''л''м''н''о''п''р''с''т''у''ф''х''ц''ч''ш''щ''ь''ы''ъ''э''ю''я'' '',''.');
                
                
    shuffle($alphabet);
                
                
    $c=0;
                echo 
    '<br><br><table border=\'1\'>';
                for (
    $i=0$i<6$i++){
                    echo 
    '<tr>';
                    for (
    $j=0$j<6$j++){
                        echo 
    '<td>'.$alphabet[$c].'</td>';
                        
    $new_arr[$i][$j]=$alphabet[$c];
                        
    $c++;
                    }
                    echo 
    '</tr>';
                }
                echo 
    '</table><br><br>';
                
                echo 
    array_search($text[4],$new_arr[1]);
                
    $strlen strlen($text);
                for(
    $i=0$i<$strlen$i++){
                        for (
    $j=0$j<6$j++){
                            if (
    array_search($text[$i],$new_arr[$j])){
                                
    $number_a_coll=array_search($text[$i],$new_arr[$j]);
                                
    $number_a_st=$j;
                                if (
    $number_a_st==5){
                                    
    $number_a_st=0;
                                }else{
                                    
    $number_a_st++;
                                }
                                echo 
    $number_a_coll;
                                
    $cryptogram .= $new_arr[$number_a_st][$number_a_coll];
                            }
                        }
                        if (!
    array_search($text[$i],$alphabet)){
                            
    $cryptogram .= $text[$i];
                        }
                }
                
                echo 
    '<b>Зашифрованный текст:</b><br /><textarea rows="10" cols="40">';
                echo 
    $cryptogram;
                echo 
    '</textarea>';
            }
    кому интересно
    последнии пропуски заполнил пробелом и . ,
     
  8. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Вообщем получилось вот что )

    Тут я не генерировал массив,а записал вручную, т.к сутьбыла не в сгенерировать,записать в фаил,расшифровать.

    PHP:

    $height
    =3// высота квадрта,при генирации или задаем ее или вычисляем
    $width11;  // длинна. Зная строку узнаем count() . Я посчитал вручную))
    $kvadrat = array("1" => array(=> "а","б","в","г","д","е","ё","ж","з","и","к"),
                     
    "2" => array(=> "л","м","н","о","п","р","с","т","у","ф","х"),
                     
    "3" => array(=> "ц","ч","щ","ь","ъ","ы","э","ю","я"," ","."));


        
    $text "мача";        // текст исходный     
    $text_array str_split($text);    // разбиваем текст на массив
    $count count($text_array); // узнаем кол-во элементов
    $c=0;
    foreach (
    $text_array as $a) { // в цикле проходим все эллементы строки

    for ($i=1$i<=$height$i++) { // в цикле ищем в каждой строке букву
    $q1=array_search($a,$kvadrat[$i]);// ищем во всех строках букву
    if($q1 !="") {$st $i;$pl=$q1;} // записываем ключи массива
    }

    $st1=$st+1; if($st1 $height) {$st1=1;} // если больше чем строк то берем первую
    //echo "$a -> [$st][$pl] -->[$st1][$pl].<br>"; // для дебага выводим
    $result[$c]= $kvadrat[$st1][$pl];
    $c++; // счетчик букв =)
    }

    //print_r($result);
    echo "Зашифровали \"$text\" в \"";
    for (
    $i=0$i<=count($result); $i++) {
    echo 
    $result[$i];
    }
    echo 
    "\"";

    Может местами не очень оптимизированно, но старался понятнее.
    Комментировал где мог)
     
    1 person likes this.
  9. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    -=Zhenek=-, суть квадрата не просто делать замену по массиву с верхнего на нижний со сдвигом... а еще и заполнение массива рандомно...
    =))

    хотя впринцыпе суть уловлена...

    только уже сам разобрался..
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    .::BARS::. массивы - это слишком тяжело, можно обойтись и строкой:
    PHP:
    /*
     abcdef
     ghijkl
     mnopqr
     stuvwx
     yz1234
     567890
    */

    $alpha 'abcdefghijklmnopqrstuvwxyz1234567890';

    $row_size sqrt(strlen($alpha));
    if (
    is_float($row_size)) die 'Алфавит не умещается в таблицу';
    function 
    encode($str$dir=1)
    {
        global 
    $alpha$row_size;
        
    $alpha_size $row_size*$row_size;
        
    $arr str_split($str);
        
    $out = array();
        foreach(
    $arr as $val)
        {
            
    $tmp strpos($alpha$val);
            if (
    $tmp === false) {die('Буквы нет в алфавите');}
            
    $out[] = $alpha[($tmp $dir $row_size $alpha_size) % $alpha_size];
        }
        return 
    implode(''$out);
    }
    function 
    decode($str)
    {
        return 
    encode($str, -1);
    }

    $str  'valvalval';
    $tmp  encode($str);
    $tmp2 decode($tmp);
    echo 
    $str.'--'.$tmp.'--'.$tmp2;
     
    _________________________
  11. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Поидее только полученную таблицу нужно записать.
    И при расшифровке считывать и засшифровывать.
    Поэтому я выбрал массивы.
    Считать с файла в массив проще. а в коде не особо запутанно))) На то массивы и придумали))