【算法】用c#实现自定义字符串编码及围栏解码方法

这篇具有很好参考价值的文章主要介绍了【算法】用c#实现自定义字符串编码及围栏解码方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编写一个函数/方法,它接受2个参数、一个字符串和轨道数,并返回ENCODED字符串。

编写第二个函数/方法,它接受2个参数、一个编码字符串和轨道数,并返回DECODED字符串。

然后使用围栏密码对其进行解码。

这种密码用于通过将每个字符沿着一组“竖状轨道”依次放在对角线上来对字符串进行编码。首先开始对角向下移动。当你到达底部时,反转方向,对角向上移动,直到你到达顶部轨道。继续,直到到达字符串的末尾。然后从左到右读取每个“尾号”以导出编码字符串。

例如,字符串“WEAREDISCOVEREDFLEATONCE”可以在三轨系统中表示如下:
W E C R L T E

E R D S O E E F E A O C

A I V D E N

编码的字符串将是:
WECRLTEERDSOEEFEAOCAIVDEN

对于编码和解码,假设尾号的数量>=2,并且传递空字符串将返回空字符串。

请注意,为了简单起见,上面的示例排除了标点符号和空格。然而,也有一些测试包括标点符号。不要过滤掉标点符号,因为它们是字符串的一部分。


算法实现:

 1 using System;
 2 using System.Linq;
 3 
 4 public class RailFenceCipher
 5 {
 6    public static string Encode(string s, int n)
 7    {
 8        var mod = (n - 1) * 2;
 9        return string.Concat(s.Select((c, i) => new { c, i })
10           .OrderBy(a => Math.Min(a.i % mod, mod - a.i % mod))
11           .Select(a => a.c));
12    }
13 
14    public static string Decode(string s, int n)
15    {
16        var mod = (n - 1) * 2;
17        var pattern = Enumerable.Range(0, s.Length)
18           .OrderBy(i => Math.Min(i % mod, mod - i % mod));
19        return string.Concat(s.Zip(pattern, (c, i) => new { c, i })
20           .OrderBy(a => a.i).Select(a => a.c));
21    }
22 }

测试用例:

  1 using NUnit.Framework;
  2 using System;
  3 using System.Collections.Generic;
  4 using System.Linq;
  5 public class SolutionTest
  6 {
  7     [Test]
  8     public void BasicTests()
  9     {
 10         string[][] config =
 11         {
 12             new[] { "Hello, World!", "Hoo!el,Wrdl l" },               // encode
 13             new[] { "Hello, World!", "Hlo ol!el,Wrd" },               // encode
 14             new[] { "Hello, World!", "H !e,Wdloollr" },               // encode
 15             new[] { "H !e,Wdloollr", "Hello, World!" },               //  decode
 16             new[] { "", "" },                            // encode
 17             new[] { "", "" },                            //  decode
 18             new[] { "WEAREDISCOVEREDFLEEATONCE", "WECRLTEERDSOEEFEAOCAIVDEN" },   // encode
 19             new[] { "WECRLTEERDSOEEFEAOCAIVDEN", "WEAREDISCOVEREDFLEEATONCE" },   //  decode
 20             new[] { "WEAREDISCOVEREDFLEEATONCE", "WIREEEDSEEEACAECVDLTNROFO" },   // encode
 21             new[] { "WIREEEDSEEEACAECVDLTNROFO", "WEAREDISCOVEREDFLEEATONCE" },   //  decode
 22             new[] { "WEAREDISCOVEREDFLEEATONCE", "WCLEESOFECAIVDENRDEEAOERT" },   // encode
 23             new[] { "WECRLTEERDSOEEFEAOCAIVDEN", "WLSADOOTEEECEAEECRFINVEDR" }    //  decode
 24         };
 25         int[] rails = { 3, 2, 4, 4, 3, 3, 3, 3, 4, 4, 5, 5 };
 26         for (int i = 0; i < config.Length; i++)
 27         {
 28             var actual = i % 2 == 0 || i == 1
 29                 ? RailFenceCipher.Encode(config[i][0], rails[i])
 30                 : RailFenceCipher.Decode(config[i][0], rails[i]);
 31 
 32             Assert.AreEqual(config[i][1], actual);
 33         }
 34     }
 35 
 36     /* *****************
 37      *   RANDOM TESTS
 38      * *****************/
 39 
 40     private class Sol
 41     {
 42         private static IEnumerable<T> Fencer<T>(int n, IEnumerable<T> str)
 43         {
 44             var rails = Enumerable.Range(0, n).Select(r => new List<T>()).ToList();
 45             int[] data = { 0, 1 };
 46             int x = 0, dx = 1;
 47             foreach (var t in str)
 48             {
 49                 rails[data[x]].Add(t);
 50                 if (data[x] == n - 1 && data[dx] > 0 || data[x] == 0 && data[dx] < 0)
 51                     data[dx] *= -1;
 52                 data[x] += data[dx];
 53             }
 54             return rails.SelectMany(lst => lst);
 55         }
 56 
 57         public static string Encode(string s, int n) => new string(Fencer(n, s).ToArray());
 58 
 59         public static string Decode(string s, int n)
 60         {
 61             char[] arr = new char[s.Length];
 62             int[] j = { 0 };
 63             Fencer(n, Enumerable.Range(0, s.Length)).ToList().ForEach(i => arr[i] = s[j[0]++]);
 64             return new string(arr);
 65         }
 66     }
 67 
 68     private Random rnd = new Random();
 69 
 70     private int Rand(int start, int end) { return start + rnd.Next(end - start); }
 71 
 72     [Test]
 73     public void FixedStringVariousRails()
 74     {
 75         var msg = "WEAREDISCOVEREDFLEEATONCE";
 76         Console.WriteLine($"Input for these tests:\n{msg}");
 77 
 78         for (int r = 0; r < 10; r++)
 79         {
 80             var rails = Rand(2, 11);
 81             var exp = Sol.Encode(msg, rails);
 82             Assert.AreEqual(exp, RailFenceCipher.Encode(msg, rails));
 83 
 84             rails = Rand(2, 11);
 85             exp = Sol.Decode(msg, rails);
 86             Assert.AreEqual(exp, RailFenceCipher.Decode(msg, rails));
 87         }
 88     }
 89 
 90     private static string lorem = "Amet non facere minima iure unde, provident, "
 91                                   + "veritatis officiis asperiores ipsa eveniet sit! Deserunt "
 92                                   + "autem excepturi quibusdam iure unde! Porro alias distinctio "
 93                                   + "ipsam iure exercitationem molestiae. Voluptate fugiat quasi maiores!jk";
 94     private static List<string> lorarr = lorem.Split(' ').ToList();
 95 
 96     [Test]
 97     public void RandomTests()
 98     {
 99         Console.WriteLine($"Base string for these tests (or a shuffled version):\n{lorem}");
100 
101         for (int r = 0; r < 50; r++)
102         {
103             var msg = Shuffle();
104             int rails = Rand(2, 51);
105             var exp = Sol.Encode(msg, rails);
106             Assert.AreEqual(exp, RailFenceCipher.Encode(msg, rails));
107 
108             msg = Shuffle();
109             rails = Rand(2, 51);
110             exp = Sol.Decode(msg, rails);
111             Assert.AreEqual(exp, RailFenceCipher.Decode(msg, rails));
112         }
113     }
114 
115     private string Shuffle()
116     {
117         Shuffle(lorarr);
118         return string.Join(" ", lorarr);
119     }
120 
121     public static void Shuffle<T>(List<T> deck)
122     {
123         var rnd = new Random();
124         for (int n = deck.Count - 1; n > 0; --n)
125         {
126             int k = rnd.Next(n + 1);
127             T temp = deck[n];
128             deck[n] = deck[k];
129             deck[k] = temp;
130         }
131     }
132 }

 文章来源地址https://www.toymoban.com/news/detail-661411.html

到了这里,关于【算法】用c#实现自定义字符串编码及围栏解码方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#,字符串匹配(模式搜索)原生(Native)算法的源代码

    算法没什么可说的,就是一段一段匹配呗。 运行效果:  源代码: using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm {     /// summary     /// 字符串匹配(模式搜索)算法集锦     /// /summary     public static partial class PatternSearch     {   

    2024年02月01日
    浏览(44)
  • C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码

     M.O.Rabin Rabin-Karp算法,是由M.O.Rabin和R.A.Karp设计实现的一种基于移动散列值的字符串匹配算法。 通常基于散列值的字符串匹配方法:(1)首先计算模式字符串的散列函数;(2)然后利用相同的散列函数计算文本中所有可能的M个字符的子字符串的散列函数值并寻找匹配。但是

    2024年01月19日
    浏览(47)
  • C#,字符串匹配(模式搜索)KMP算法的源代码与数据可视化

      D.E.Knuth   J.H.Morris KMP 算法(Knuth-Morris-Pratt 算法)是其中一个著名的、传统的字符串匹配算法,效率比较高。 KMP算法由 D.E.Knuth , J.H.Morris 和 V.R.Pratt 在 Brute-Force 算法的基础上提出的模式匹配的改进算法。因此人们称它为“克努特—莫里斯—普拉特算法”,简称KMP算法。K

    2024年01月25日
    浏览(51)
  • Python中的字符串与字符编码

    Hello,这里是Token_w的博客,欢迎您的到来 今天文章讲解的是Python中的字符串与字符编码,其中有基础的理论知识讲解,也有实战中的应用讲解,希望对你有所帮助 整理不易,如对你有所帮助,希望能得到你的点赞、收藏支持。感谢 Python中的字符编码是个老生常谈的话题,同

    2024年02月12日
    浏览(60)
  • C语言实现删除字符串中重复字符的算法

    C语言实现删除字符串中重复字符的算法 问题描述: 给定一个字符串,我们需要编写一个C语言函数,以删除字符串中的重复字符。例如,对于输入字符串\\\"hello world\\\",函数应该返回\\\"hel wrd\\\"。 算法思路: 为了解决这个问题,我们可以使用一个哈希表来跟踪每个字符的出现次数。

    2024年02月04日
    浏览(43)
  • Java实现两字符串相似度算法

    编辑距离:是衡量两个字符串之间差异的度量,它表示 将一个字符串转换为另一个字符串所需的最少编辑操作次数 (插入、删除、替换)。 计算方法可以有多种,其中一种 常见 的方法是 将编辑距离归一化为0到1之间的范围 (归一化编辑距离(Normalized Edit Distance)), 将编

    2024年02月05日
    浏览(73)
  • 使用Java实现高效的字符串匹配算法

    摘要:字符串匹配是计算机领域中的一个重要问题,有着广泛的应用场景。在本篇博客文章中,我们将介绍几种高效的字符串匹配算法,并给出使用Java语言实现的代码示例,希望能对读者理解和应用这些算法有所帮助。 一、KMP算法 KMP算法(Knuth-Morris-Pratt算法)是一种经典的

    2024年02月16日
    浏览(40)
  • Python字符串的编码和解码

    不同计算机之间进行数据传输,实际上传输的是二进制数据。 将str类型转换成bytes类型,需要用到字符串的encode()方法 Str.encode(encoding=’utf-8’,                Errors=’strict/ignore/replace’) 将bytes类型转换成str类型,需要用到bytes类型的decode()方法 Bytes.decode(encodin

    2024年01月22日
    浏览(47)
  • C++中的字符串编码处理

    今天由于在项目中用到一些与C++混合开发的东西 ,需要通过socket与C++那边交换数据,没啥特别的,字节码而已,两边确定一种编码规则就行了。我们确定的UTF-8。关于C++的 这种又是宽字节 又是MessageBoxW 又是MessageBoxA 的 ,说实话相比C#而言 搞的确实非常的和稀泥 搞的非常的糊

    2024年02月04日
    浏览(44)
  • 算法大神教你写代码实现回文字符串检测

    作者:禅与计算机程序设计艺术 很多公司面临着处理海量数据,因此需要对数据进行快速有效的分析和处理,其中数据清洗是一个非常重要的环节。如何快速准确地识别出文本中的所有回文子串,成为一个值得研究的热点问题。 在本篇教程中,我将给大家介绍一种基于滑动

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包