Как объединить массив с другим массивом с некоторым шагом?

215
19 ноября 2017, 13:10

Имею следующую задачу:

Зашифрованный текст должен храниться в файле текстового формата вместе с ключом. Перед записью в файл зашифрованного текста и ключа предварительно перемешайте записываемые массивы (в получаемом массиве выделяются фиксированные позиции для хранения символов ключа; для корректной сборки ключа необходимо указать длину ключа в символах и шаг фиксированных позиций, т.е. через сколько символов шифрованного текста находятся символы ключа; указанные признаки можно записать в качестве первых двух байтов файла или же в других позициях файла).

Мне помогли с алгоритмом и с кодом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Input
{
    class Program
    {
        static void Main(string[] args)
        {
            int step, word;
            string text, key, result = string.Empty;
            Console.Write("Enter Text : ");
            text = Console.ReadLine();
            Console.Write("Enter Key : ");
            key = Console.ReadLine();
            Console.Write("Enter Step : ");
            step = int.Parse(Console.ReadLine());
            // MIX ARRAY
            word = 0;
            if (step <= text.Length)
            {
                for (int i = 0; i < key.Length; i++)
                {
                    result += key.Substring(i, 1);
                    for (int k = 0; k < step; k++)
                    {
                        try
                        {
                            result += text.Substring(word, 1);
                            word++;
                        }
                        catch
                        {
                            break;
                        }
                    }
                }
                if (word < text.Length)
                {
                    result += text.Substring(word, (text.Length - word));
                }
            }
            Console.WriteLine("Result Text : " + result);
            // DECIPHER ARRAY
            Console.WriteLine("text: " + text);
            Console.WriteLine("key: " + key);
            Console.ReadKey();
        }
    }
}

Только теперь я не могу правильно расшифровать перемешанную строку.
Входные данные: длина ключа в символах (key.Length), шаг (step), перемешанная строка (result).
Выходные данные: текст (text), ключ (key).

Answer 1

Ну готовых алгоритмов я не помню. Но можно легко написать свой.

static IEnumerable<T> Mix<T>(IEnumerable<T> s1, IEnumerable<T> s2, int step1, int step2 = 1)
{
    using (var e1 = s1.GetEnumerator())
    using (var e2 = s2.GetEnumerator())
    {
        bool firstFinished = false, secondFinished = false;
        while (!firstFinished && !secondFinished)
        {
            if (!firstFinished)
            {
                for (int i = 0; i < step1; i++)
                {
                    if (!e1.MoveNext())
                        firstFinished = true;
                    yield return firstFinished ? default(T) : e1.Current;
                }
            }
            if (!secondFinished)
            {
                for (int i = 0; i < step2; i++)
                {
                    if (!e2.MoveNext())
                        secondFinished = true;
                    yield return secondFinished ? default(T) : e2.Current;
                }
            }
        }
    }
}

Неполные группы дополняются значением default(T).

Пробуем:

var result = Mix(new [] {1, 2, 3, 4, 5, 6, 7, 8}, new[] {100, 200}, 3).ToArray();
foreach (var v in result) Console.Write(v + " ");

Результат:

1 2 3 100 4 5 6 200 7 8 0 0
READ ALSO
Как запретить ввод символов символов с клавиатуры в textBox?

Как запретить ввод символов символов с клавиатуры в textBox?

Пытаюсь создать калькулятор на Windows Forms, С#Добавил кнопки для ввода чисел и следовательно требуется ограничить ввод пользователя в TextBox

465
Передать MainViewModel в MainView с различными UcerControl WPF MVVM

Передать MainViewModel в MainView с различными UcerControl WPF MVVM

Добрый деньРеализовываю плагин под AutoCAD с запуском из программы, в результате чего использую библиотеку UcerControl'ов ну то есть просто в ней...

205
Клиент-сервер SSL на C#

Клиент-сервер SSL на C#

Дали в универе такое задание:

244