застрял на PHP Морзе декодер

Я делаю php Морзе кодировщик и декодер для школы.
У меня уже работает кодер, но я не могу понять, как заставить работать декодер.

код ниже это то, что у меня есть для моего декодера.
я попытался сделать декодер таким же, как мой кодер, переключая буквы с кодами.
Это не сработало, потому что это могло бы запутать азбуку Морзе и объединить их.

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

Я попробовал кучу вещей, но на самом деле я не знаю, что я делаю, и я не могу понять это.
Я новичок в php, поэтому я стараюсь сделать его максимально простым.

Любая помощь приветствуется!

<?php
$break = "<br>" ;
$Words = $_POST['morse2'];

//get the morse, seperate each letter and then decode and echo the outcome

$seperation = explode(" ", $Words);
var_dump($seperation) ;
echo $break ;

// foreach($seperation){
// str_replace("/ "," ",$seperation);
// }
$seperation = str_replace("/ "," ",$Words);
$seperation = str_replace(".- ","a",$Words);
$seperation = str_replace("-... ","b",$Words);
$seperation = str_replace("-.-. ","c",$Words);
$seperation = str_replace("-.. ","d",$Words);
$seperation = str_replace(". ","e",$Words);
$seperation = str_replace("..-. ","f",$Words);
$seperation = str_replace("--. ","g",$Words);
$seperation = str_replace(".... ","h",$Words);
$seperation = str_replace(".. ","i",$Words);
$seperation = str_replace(".--- ","j",$Words);
$seperation = str_replace("-.- ","k",$Words);
$seperation = str_replace(".-.. ","l",$Words);
$seperation = str_replace("-- ","m",$Words);
$seperation = str_replace("-. ","n",$Words);
$seperation = str_replace("--- ","o",$Words);
$seperation = str_replace(".--. ","p",$Words);
$seperation = str_replace(".-. ","r",$Words);
$seperation = str_replace("... ","s",$Words);
$seperation = str_replace("- ","t",$Words);
$seperation = str_replace("..- ","u",$Words);
$seperation = str_replace("...- ","v",$Words);
$seperation = str_replace("-.-- ","y",$Words);
$seperation = str_replace("--.. ","z",$Words);
$seperation = str_replace("--.- ","q",$Words);
$seperation = str_replace(".-- ","w",$Words);
$seperation = str_replace("-..- ","x",$Words);

$seperation = str_replace(".---- ","1",$Words);
$seperation = str_replace("..--- ","2",$Words);
$seperation = str_replace("...-- ","3",$Words);
$seperation = str_replace("....- ","4",$Words);
$seperation = str_replace("..... ","5",$Words);
$seperation = str_replace("-.... ","6",$Words);
$seperation = str_replace("--... ","7",$Words);
$seperation = str_replace("---.. ","8",$Words);
$seperation = str_replace("----. ","9",$Words);
$seperation = str_replace("----- ","0",$Words);

echo $seperation;

/*Here's a tiny piece of my encoder to show you how i did that
basically the same as the decoder, real simple.
$Words = $_POST['morse'];
$Words = str_replace(" ","/ ",$Words);
$Words = str_replace("a",".- ",$Words);
$Words = str_replace("b","-... ",$Words);
$Words = str_replace("c","-.-. ",$Words);
echo $Words;
/*
?>

3

Решение

Это интересный вопрос. Я разделил его на две функции: кодер и декодер. Они оба имеют одинаковый массив, который мы получаем из get_morse() функция (я просто разделил это на отдельную функцию, чтобы она делала меньше строк). get_morse() имеет пробел после каждого азбуки Морзе, чтобы он не загромождался при его кодировании. Мы можем легко обрезать это с trim() при декодировании (когда мы разбиваем строку на пробелы, чтобы получить букву, представленную каждым кодом).

function get_morse() {
return array(" " => "/ ", "a" => "*- ", "b" => "-*** ", "c" => "-*-* ", "d" => "-** ", "e" => "* ", "f" => "**-* ", "g" => "--* ", "h" => "**** ", "i" => "** ", "j" => "*--- ", "k" => "-*- ", "l" => "*-** ", "m" => "-- ", "n" => "-* ", "o" => "--- ", "p" => "*--* ", "q" => "--*- ", "r" => "*-* ", "s" => "*** ", "t" => "- ", "u" => "**- ", "v" => "***- ", "w" => "*-- ", "x" => "-**- ", "y" => "-*-- ", "z" => "--** ");
}

Тогда кодировщик очень прост,

function morse_encoder($word) {
return str_replace(array_keys(get_morse()), get_morse(), strtolower($word));
}

Он в основном заменяет каждую букву (которая является ключом в массиве Морзе) каждым соответствующим кодом Морзе (который является значением в массиве). Итак, вы получаете 'a' => "*- " в массиве, и заменить все буквы (ключи) на значение в массиве.

Декодер, вероятно, может быть еще более упрощен с некоторыми array_* функции, но это будет работать и декодировать его правильно. Мы будем использовать тот же массив, что и раньше, исходя из get_morse(),

function morse_decoder($word) {
$morse = array_map("trim", get_morse());
$output = "";
foreach (explode(" ", $word) as $value) {
$output .= array_search($value, $morse);
}
return strtoupper($output);
}

Мы разделяем закодированную строку пробелами, это дает нам массив с каждым отдельным кодом Морзе в качестве отдельного элемента. Затем мы можем зациклить это и «повернуть» процедуру, которую мы делали при кодировании; найти каждый элемент в массиве, соответствующий коду Морзе, и заменить его своим ключом; это соответствующее письмо.

Использование этих функций будет

echo morse_encoder("sos");          // Output: *** --- ***
echo morse_decoder("*** --- ***");  // Output: SOS

Живая демо

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]