为了账号安全,请及时绑定邮箱和手机立即绑定

使随机字符串循环猜测控制台程序一次猜测一个字符而不是一次猜测所有字符

使随机字符串循环猜测控制台程序一次猜测一个字符而不是一次猜测所有字符

C#
PIPIONE 2022-07-10 10:37:54
该代码旨在通过创建一个随机字符串开始,该字符串具有用户选择的字符数。然后,它会随机循环字符,直到一个字符与字符串匹配,在这种情况下,它会锁定它并将其着色为青色。任何已尝试用于字符串的字符都将被忽略。问题在于程序同时猜测所有字符,而不是按预期一个接一个地猜测并在完成当前字符后继续下一个字符。这导致完成较小的字符串和较长的字符串之间的差异是对数而不是加法。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ConsoleApp3{    class Program    {        private static Random random = new Random();        public static string RandomString(int length)        {            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";            return new string(Enumerable.Repeat(chars, length)              .Select(s => s[random.Next(s.Length)]).ToArray());        }        static void Main(string[] args)        {            Console.WriteLine("How many characters in the password?");            string delta = Console.ReadLine();            try            {                int passwordlength = Convert.ToInt32(delta);                // BARRIER                string password = RandomString(passwordlength);                Random r = new Random();                string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";                List<string> dictionary = new List<string>(new string[] { password });                string word = dictionary[r.Next(dictionary.Count)];                List<int> indexes = new List<int>();                Console.ForegroundColor = ConsoleColor.Red;                StringBuilder sb = new StringBuilder();                for (int i = 0; i < word.Length; i++)                {                    sb.Append(letters[r.Next(letters.Length)]);                    if (sb[i] != word[i])                    {                        indexes.Add(i);                    }                }                Console.WriteLine(sb.ToString());                var charsToGuessByIndex = indexes.ToDictionary(k => k, v => letters);                while (indexes.Count > 0)                {                    int index;                    Thread.Sleep(50);                    Console.Clear();
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

using System;

using System.Diagnostics;

using System.Linq;

using System.Text;

using System.Threading;


namespace ConsoleApp3

{

    class Program

    {

        private static Random random = new Random();

        static string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";


        public static string generatePassword(int length)

        {

            var sb = new StringBuilder();

            for (int i = 0; i < length; i++)

            {

                sb.Append(chars.OrderBy(o => Guid.NewGuid()).First());

            }

            return sb.ToString();

        }


        public static StringBuilder generateNotPassword(int length, string password)

        {

            var sb = new StringBuilder();

            for (int i = 0; i < length; i++)

            {

                sb.Append(chars.Where(w => password[i] != w).OrderBy(o => Guid.NewGuid()).First());

            }

            return sb;

        }


        static void Main(string[] args)

        {

            Console.WriteLine("How many characters in the password?");

            var passwordlength = int.Parse(Console.ReadLine());

            var password = generatePassword(passwordlength);

            var notPassword = generateNotPassword(passwordlength, password);


            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();

            for (int i = 0; i < passwordlength; i++)

            {

                var notfound = true;

                while (notfound)

                {


                    foreach (var c in chars)

                    {

                        if (password[i] == c)

                        {

                            notPassword[i] = c;

                            notfound = false;

                        }

                        Thread.Sleep(50);

                        Console.Clear();

                        var output = notPassword.ToString();

                        for (int ii = 0; ii < output.Length; ii++)

                        {

                            var iii = (!notfound && i == ii) ? ii - 1 : ii;

                            Console.ForegroundColor = i > iii ? ConsoleColor.Red : ConsoleColor.Cyan;

                            var o = i <= iii ? '█' : output[ii];

                            Console.Write(o);

                        }

                        Console.WriteLine();

                        TimeSpan ts = stopWatch.Elapsed;

                        Console.WriteLine

                            (String.Format(

                           "RunTime {0:00}:{1:00}:{2:00}.{3:00}",

                           ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10));

                        if (!notfound) break;

                    }



                }

            }

            Console.ForegroundColor = ConsoleColor.Green;


            Console.WriteLine($"Guessed  Password = {notPassword}");

            Console.WriteLine($"Original Password = {password}");

            //https://www.asciiart.eu/electronics/electronics

            Console.WriteLine(@"

                                  ____

                             ____|    \

                            (____|     `._____

                             ____|       _|___

                            (____|     .'

                                 |____/


                            ");

            Console.ReadLine();

        }

    }

}


查看完整回答
反对 回复 2022-07-10
  • 1 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信