نمایش نتایج 1 تا 8 از 8

نام تاپیک: تغییر الگوریتم ران لنس برای رشته ای از اعداد

  1. #1

    تغییر الگوریتم ران لنس برای رشته ای از اعداد

    سلام
    خسته نباشید

    آقا یه برنامه هست یه نوع فشرده سازی رو انجام میده (الگوریتمی به نام run length) که شاید بدونید چطوریه ولی من توضیح میدم که تو وقت صرفه جویی بشه و اونم اینطوریه که مثلا یه رشته ای به شکل
    wwwwwqqqqqwwwqq
    رو دریافت میکنه و به صورت
    5w5q3w2q
    کد میکنه؛ولی در مورد رشته ای از صفر و یک جواب نمیده ینی نمیتونه دیکد کنه،حالا من یه کاری کردم که به جای صفر قرار میده O و به جای یک l میزاره ولی میخاسم ببینم میتنید کمک کنید که نیازی نباشه کاراکتر جایگزین کنم و با همون اعداد عمل کنه؟

    خیلی ممنون

    این برنامه ی خودمه

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace run
    {
    class Program
    {
    static void Main(string[] args)
    {
    string input = "111111111111111100110000";
    Console.WriteLine(Encode(input));//Outputs: 12W1B12W3B24W1B14W
    Console.WriteLine(Decode(Encode(input)));//Outputs: WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWW WWBWWWWWWWWWWWWWW
    Console.ReadKey();
    }

    public static string Encode(string s)
    {
    StringBuilder sb = new StringBuilder();
    int count = 1;
    char current = s[0];
    for (int i = 1; i < s.Length; i++)
    {
    if (current == s[i])
    {
    count++;
    }
    else
    {
    sb.AppendFormat("{0}{1}", count, (current == '1' ? 'l' : 'O'));
    count = 1;
    current = s[i];
    }
    }
    sb.AppendFormat("{0}{1}", count, (current == '1' ? 'l' : 'O'));
    return sb.ToString();
    }

    public static string Decode(string s)
    {
    string a = "";
    int count = 0;
    StringBuilder sb = new StringBuilder();
    char current = char.MinValue;
    for (int i = 0; i < s.Length; i++)
    {
    current = s[i];
    if (char.IsDigit(current))
    a += current;
    else
    {
    count = int.Parse(a);
    a = "";
    for (int j = 0; j < count; j++)
    sb.Append((current == 'l' ? '1' : '0'));
    }
    }
    return sb.ToString();
    }
    }
    }


    اینم برنامه ی اولیه که فط در مورد حروف جواب میده

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace run
    {
    class Program
    {
    static void Main(string[] args)
    {
    string input = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWW WWWBWWWWWWWWWWWWWW";
    Console.WriteLine(Encode(input));//Outputs: 12W1B12W3B24W1B14W
    Console.WriteLine(Decode(Encode(input)));//Outputs: WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWW WWBWWWWWWWWWWWWWW
    Console.ReadLine();
    }
    public static string Encode(string s)
    {
    StringBuilder sb = new StringBuilder();
    int count = 1;
    char current = s[0];
    for (int i = 1; i < s.Length; i++)
    {
    if (current == s[i])
    {
    count++;
    }
    else
    {
    sb.AppendFormat("{0}{1}", count, current);
    count = 1;
    current = s[i];
    }
    }
    sb.AppendFormat("{0}{1}", count, current);
    return sb.ToString();
    }
    public static string Decode(string s)
    {
    string a = "";
    int count = 0;
    StringBuilder sb = new StringBuilder();
    char current = char.MinValue;
    for (int i = 0; i < s.Length; i++)
    {
    current = s[i];
    if (char.IsDigit(current))
    a += current;
    else
    {
    count = int.Parse(a);
    a = "";
    for (int j = 0; j < count; j++)
    sb.Append(current);
    }
    }
    return sb.ToString();
    }
    }
    }

  2. #2

    نقل قول: تغییر الگوریتم ران لنس برای رشته ای از اعداد



    string s = "111111111111100000011111000011199999999922222222s sssssssss44rrrrrrrr";

    int k = 1;

    Dictionary<string, int> words = new Dictionary<string, int>();

    string str = string.Empty;

    s.Aggregate((c, d) =>
    {


    if (c == d)
    {
    k++;
    str += c;
    }
    else
    {
    words.Add(str, k);
    k = 1;
    str = d.ToString();
    }

    return d;
    });

    words.Add(str, k);
    Console.Write(words.Select(w => w.Key.First() + ":" + w.Value.ToString() + Environment.NewLine).Aggregate((s1, s2) => s1 + s2));


    Output:
    ///////


    1:13
    0:6
    1:5
    0:4
    1:3
    9:9
    2:8
    s:10
    4:2
    r:8


  3. #3
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

    نقل قول: تغییر الگوریتم ران لنس برای رشته ای از اعداد

    نقل قول نوشته شده توسط tooraj_azizi_1035 مشاهده تاپیک


    string s = "111111111111100000011111000011199999999922222222s sssssssss44rrrrrrrr";

    int k = 1;

    Dictionary<string, int> words = new Dictionary<string, int>();

    string str = string.Empty;

    s.Aggregate((c, d) =>
    {


    if (c == d)
    {
    k++;
    str += c;
    }
    else
    {
    words.Add(str, k);
    k = 1;
    str = d.ToString();
    }

    return d;
    });

    words.Add(str, k);
    Console.Write(words.Select(w => w.Key.First() + ":" + w.Value.ToString() + Environment.NewLine).Aggregate((s1, s2) => s1 + s2));


    Output:
    ///////


    1:13
    0:6
    1:5
    0:4
    1:3
    9:9
    2:8
    s:10
    4:2
    r:8

    اصلا روش خوبی نیست.


    برای این کار از character escaping استفاده میشه.

  4. #4

    نقل قول: تغییر الگوریتم ران لنس برای رشته ای از اعداد

    اصلا روش خوبی نیست.


    برای این کار از character escaping استفاده میشه.
    لطفاً قرار بدید یاد بگیریم.

  5. #5
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

    نقل قول: تغییر الگوریتم ران لنس برای رشته ای از اعداد

    متاسفانه الان فرصت نوشتن و تست کردن ندارم.ولی خروجیتون باید این شکلی بشه:
    hhhhhhhhhh222222222pppppppp3333\\\444444
    10h9\2\8p4\3\3\\6\4\


    اونحایی که دو تا \ گزاشتم سلیقه ای هست.خیلی ها سه تا میزان.همینطور \ آخر هم بستگی به خودتون داره.
    http://en.wikipedia.org/wiki/Escape_sequence

  6. #6

    نقل قول: تغییر الگوریتم ران لنس برای رشته ای از اعداد

    با استفاده از عبارات باقاعده:


    string s = "111111111111100000011111000011199999999922222222s sssssssss
    44rrrrrrr0000000222222mmxxxvvvvvvv55555tttyy";


    listBox1.Items.AddRange(Regex.Matches(s, @"(\d)\1*|([a-z,A-Z])\2*")
    .OfType<Match>().Select(m => string.Format("{0} : {1}", m.Value, m.Length)).ToArray());




    Matches رو می تونی با foreach تست کنی.

  7. #7
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

    نقل قول: تغییر الگوریتم ران لنس برای رشته ای از اعداد

    [a-z,A-Z]
    اون کاما اضافه نیست؟

  8. #8

    نقل قول: تغییر الگوریتم ران لنس برای رشته ای از اعداد

    فکر می کنم حق با شماست تست نکردم.

تاپیک های مشابه

  1. سوال: تغییر کد مربوط به فیلد عددی برای رشته
    نوشته شده توسط vapa_71 در بخش C#‎‎
    پاسخ: 9
    آخرین پست: سه شنبه 26 دی 1391, 09:36 صبح
  2. تغییر الگوریتم دایکسترا
    نوشته شده توسط Maryam_61 در بخش الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها
    پاسخ: 1
    آخرین پست: سه شنبه 26 دی 1385, 08:02 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •