Другие языки программирования и технологии
Помогите пожалуйста с решением задачи, если можно объясните как расшифровать.
Для передачи сообщений по телеграфу каждая буква русского алфавита (Е и Ё отождествлены) представляется в виде пятизначной комбинации из нулей и единиц, соответствующих двоичной записи номера данной буквы в алфавите (нумерация букв начинается с нуля). Например, буква А представляется в виде 00000, буква Б - 00001, буква Ч - 10111, буква Я - 11111. Передача пятизначной комбинации производится по кабелю, содержащему пять проводов. Каждый двоичный разряд передается по отдельному проводу. При приеме сообщения Криптоша перепутал провода, поэтому вместо переданного слова получен набор букв БВОТБАМЁДЙН. Найдите переданное слово
program Kriptosha;
// Строка для расшифровки
const str: string = 'БВОТБАМЁДЙН';
// Возвращает символ по коду
function getSymbol(code: array of byte): char;
begin
var dec: real := code[0]*(2**0) + code[1]*(2**1) + code[2]*(2**2)
+ code[3]*(2**3) + code[4]*(2**4);
Result := chr(dec.round + 1040);
end;
// Возвращает код по символу
function getCode(symbol: char): array of byte;
begin
var code: array of byte;
setlength(code, 5);
var bin: string := System.convert.toString(ord(symbol)-1040, 2);
for var i := 0 to 4 do begin
try code[i] := bin[bin.length-i].ToDigit;
except on e: System.indexOutOfRangeException do
code[i] := 0;
end;
end;
Result := code;
end;
// Возвращает все варианты размещения проводов (перепутаны 2)
function getWires2(): array[,] of byte;
begin
var wires: array[,] of byte;
var tmp: byte;
for var i := 0 to 3 do begin
for var j := i+1 to 4 do begin
setlength(wires, length(wires, 0)+1, 5);
for var k := 0 to 4 do wires[high(wires), k] := k;
tmp := wires[high(wires), i];
wires[high(wires), i] := wires[high(wires), j];
wires[high(wires), j] := tmp;
end;
end;
Result := wires;
end;
// Для getWires5() - Возвращает все возможные вставки
function getChilds(parent: array of byte): array[,] of byte;
begin
var res: array[,] of byte;
setlength(res, length(parent)+1, length(parent)+1);
for var i := 0 to length(res, 0)-1 do begin
for var j := 0 to length(parent)-1 do res[i, j] := parent[j];
for var j := length(res, 1)-1 downto i+1 do res[i,j] := res[i,j-1];
res[i,i] := length(parent);
end;
Result := res;
end;
// Для getWires5() - Добавляет к общему результату полученные вставки
function addChilds(arrTo: array[,] of byte; arrFrom: array[,] of byte):
array[,] of byte;
begin
var size := length(arrTo, 0);
setlength(arrTo, length(arrTo, 0) + length(arrFrom, 0), length(arrFrom, 1));
for var i := 0 to length(arrFrom, 0)-1 do
for var j := 0 to length(arrFrom, 1)-1 do
arrTo[size+i, j] := arrFrom[i,j];
Result := arrTo;
end;
// Возвращает все варианты размещения проводов (перепутаны все)
function getWires5(): array[,] of byte;
begin
var w: array[,] of byte := ((0));
var res, tmp: array[,] of byte;
for var i := 0 to 3 do begin
res := nil;
for var j := 0 to length(w, 0)-1 do begin
tmp := getChilds(w.Row(j));
res := addChilds(res, tmp);
end;
w := res;
end;
Result := res;
end;
// Возвращает слова согласно расстановок проводов
function getVariants(str: string; wires: array[,] of byte): array of string;
begin
var variants: array of string;
var cur, res: array of byte;
for var i := 0 to high(wires) do begin
setlength(variants, length(variants)+1);
for var j := 1 to length(str) do begin
cur := getCode(str[j]);
setlength(res, 5);
for var k := 0 to 4 do res[k] := cur[wires[i, k]];
variants[i] += getSymbol(res);
end;
end;
Result := variants;
end;
begin
//var wires2 := getWires2();
//var variants := getVariants(str, wires2);
var wires5 := getWires5();
var variants := getVariants(str, wires5);
foreach var variant in variants do writeln(variant);
end.
// Строка для расшифровки
const str: string = 'БВОТБАМЁДЙН';
// Возвращает символ по коду
function getSymbol(code: array of byte): char;
begin
var dec: real := code[0]*(2**0) + code[1]*(2**1) + code[2]*(2**2)
+ code[3]*(2**3) + code[4]*(2**4);
Result := chr(dec.round + 1040);
end;
// Возвращает код по символу
function getCode(symbol: char): array of byte;
begin
var code: array of byte;
setlength(code, 5);
var bin: string := System.convert.toString(ord(symbol)-1040, 2);
for var i := 0 to 4 do begin
try code[i] := bin[bin.length-i].ToDigit;
except on e: System.indexOutOfRangeException do
code[i] := 0;
end;
end;
Result := code;
end;
// Возвращает все варианты размещения проводов (перепутаны 2)
function getWires2(): array[,] of byte;
begin
var wires: array[,] of byte;
var tmp: byte;
for var i := 0 to 3 do begin
for var j := i+1 to 4 do begin
setlength(wires, length(wires, 0)+1, 5);
for var k := 0 to 4 do wires[high(wires), k] := k;
tmp := wires[high(wires), i];
wires[high(wires), i] := wires[high(wires), j];
wires[high(wires), j] := tmp;
end;
end;
Result := wires;
end;
// Для getWires5() - Возвращает все возможные вставки
function getChilds(parent: array of byte): array[,] of byte;
begin
var res: array[,] of byte;
setlength(res, length(parent)+1, length(parent)+1);
for var i := 0 to length(res, 0)-1 do begin
for var j := 0 to length(parent)-1 do res[i, j] := parent[j];
for var j := length(res, 1)-1 downto i+1 do res[i,j] := res[i,j-1];
res[i,i] := length(parent);
end;
Result := res;
end;
// Для getWires5() - Добавляет к общему результату полученные вставки
function addChilds(arrTo: array[,] of byte; arrFrom: array[,] of byte):
array[,] of byte;
begin
var size := length(arrTo, 0);
setlength(arrTo, length(arrTo, 0) + length(arrFrom, 0), length(arrFrom, 1));
for var i := 0 to length(arrFrom, 0)-1 do
for var j := 0 to length(arrFrom, 1)-1 do
arrTo[size+i, j] := arrFrom[i,j];
Result := arrTo;
end;
// Возвращает все варианты размещения проводов (перепутаны все)
function getWires5(): array[,] of byte;
begin
var w: array[,] of byte := ((0));
var res, tmp: array[,] of byte;
for var i := 0 to 3 do begin
res := nil;
for var j := 0 to length(w, 0)-1 do begin
tmp := getChilds(w.Row(j));
res := addChilds(res, tmp);
end;
w := res;
end;
Result := res;
end;
// Возвращает слова согласно расстановок проводов
function getVariants(str: string; wires: array[,] of byte): array of string;
begin
var variants: array of string;
var cur, res: array of byte;
for var i := 0 to high(wires) do begin
setlength(variants, length(variants)+1);
for var j := 1 to length(str) do begin
cur := getCode(str[j]);
setlength(res, 5);
for var k := 0 to 4 do res[k] := cur[wires[i, k]];
variants[i] += getSymbol(res);
end;
end;
Result := variants;
end;
begin
//var wires2 := getWires2();
//var variants := getVariants(str, wires2);
var wires5 := getWires5();
var variants := getVariants(str, wires5);
foreach var variant in variants do writeln(variant);
end.
Существует всего 5! = 120 вариантов "перепутываний" 5 проводов. Тебе надо программно перебрать их все и из получившихся 120 слов выбрать осмысленное.
Набери в Google "генерация перестановок" и получишь множество примеров, как сгенерировать все варианты "перепутывания".
Набери в Google "генерация перестановок" и получишь множество примеров, как сгенерировать все варианты "перепутывания".
Любопытно... А перепутаны только ДВА провода или ЛЮБЫЕ? В том числе и все ПЯТЬ?!
Владимир Истомин
Да это неважно! Всего возможных перестановок 10, в которых биты меняются местами. Включаешь перебор всех вариантов и определяешь среди них осмысленный: тупая задача!..
Владимир Истомин
В случае множественного перепутывания просто больше возможных вариантов, только и всего !
Андрей Андреич
С путаницей только двух проводов пока ничего не получается..
Пока что переделываю программу для путаницы всех пяти проводов..
Пока что переделываю программу для путаницы всех пяти проводов..
Андрей Андреич
Исходя из решения аналогичных задач, перепутано любое количество проводов
Почувствуй себя Тьюрингом, взламывающим Энигму!
Напиши программу для перестановки битов в коде, и распечатай все комбинации, их не очень много. А дальше просто выбери из них осмысленную.
Напиши программу для перестановки битов в коде, и распечатай все комбинации, их не очень много. А дальше просто выбери из них осмысленную.
Похожие вопросы
- Помогите, пожалуйста, с решением задачи из задачника Абрамяна.
- Помогите пожалуйста оптимизировать решение задачи (Зайчик) на C++
- Помогите пожалуйста с решением задач в паскале
- Помогите составить алгоритм решения задачи
- Помогите пожалуйста составить решение с задачей по программированию(на любом языке программирования)
- Помогите пожалуйста, решить данную задачу методом пузырька!!!
- Всем добрый вечер! Помогите пожалуйста решить данную задачу по информатике.
- Помогите пожалуйста,как эту задачу написать в Паскале?
- помогите пожалуйста, люди добрые. задача на C#.
- Помогите пожалуйста решить эти задачи
Похожее задание (строка ВМЙУИВЯ) программа решает..
https://otvet.mail.ru/question/82569825
http://www.itmathrepetitor.ru/xi-olimpiada-po-kriptografii-i-matemati/
(программа нашла ответ ПАРОХОД)