Другие языки программирования и технологии

Помогите пожалуйста с решением задачи, если можно объясните как расшифровать.

Для передачи сообщений по телеграфу каждая буква русского алфавита (Е и Ё отождествлены) представляется в виде пятизначной комбинации из нулей и единиц, соответствующих двоичной записи номера данной буквы в алфавите (нумерация букв начинается с нуля). Например, буква А представляется в виде 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.
Нурбек Джакыпов
Нурбек Джакыпов
18 091
Лучший ответ
Нурбек Джакыпов но что-то пошло не так и из 120 вариантов нет приемлемого..
Нурбек Джакыпов Если будет ответ - сообщите.. Очень интересно что не так, хотя и перепроверено сто раз..
Нурбек Джакыпов Что-то не так со строкой из задания..
Похожее задание (строка ВМЙУИВЯ) программа решает..
https://otvet.mail.ru/question/82569825
Нурбек Джакыпов Проверил так же на задаче № 11.3 отсюда..
http://www.itmathrepetitor.ru/xi-olimpiada-po-kriptografii-i-matemati/
(программа нашла ответ ПАРОХОД)
Существует всего 5! = 120 вариантов "перепутываний" 5 проводов. Тебе надо программно перебрать их все и из получившихся 120 слов выбрать осмысленное.

Набери в Google "генерация перестановок" и получишь множество примеров, как сгенерировать все варианты "перепутывания".
Виктор Кустов
Виктор Кустов
84 290
Любопытно... А перепутаны только ДВА провода или ЛЮБЫЕ? В том числе и все ПЯТЬ?!
Владимир Истомин Да это неважно! Всего возможных перестановок 10, в которых биты меняются местами. Включаешь перебор всех вариантов и определяешь среди них осмысленный: тупая задача!..
Владимир Истомин В случае множественного перепутывания просто больше возможных вариантов, только и всего !
Андрей Андреич С путаницей только двух проводов пока ничего не получается..
Пока что переделываю программу для путаницы всех пяти проводов..
Андрей Андреич Исходя из решения аналогичных задач, перепутано любое количество проводов
Почувствуй себя Тьюрингом, взламывающим Энигму!
Напиши программу для перестановки битов в коде, и распечатай все комбинации, их не очень много. А дальше просто выбери из них осмысленную.