PDA

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



Mohammad Hosseini
چهارشنبه 11 اردیبهشت 1392, 20:42 عصر
سلام
خسته نباشید

آقا یه برنامه هست یه نوع فشرده سازی رو انجام میده (الگوریتمی به نام 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 = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWW WWBWWWWWWWWWWWWWW";
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();
}
}
}

tooraj_azizi_1035
پنج شنبه 12 اردیبهشت 1392, 17:13 عصر
string s = "111111111111100000011111000011199999999922222222ss ssssssss44rrrrrrrr";

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

FastCode
پنج شنبه 12 اردیبهشت 1392, 17:41 عصر
string s = "111111111111100000011111000011199999999922222222ss ssssssss44rrrrrrrr";

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 استفاده میشه.

tooraj_azizi_1035
پنج شنبه 12 اردیبهشت 1392, 21:17 عصر
اصلا روش خوبی نیست.


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


لطفاً قرار بدید یاد بگیریم.:لبخندساده:

FastCode
پنج شنبه 12 اردیبهشت 1392, 21:33 عصر
متاسفانه الان فرصت نوشتن و تست کردن ندارم.ولی خروجیتون باید این شکلی بشه:
hhhhhhhhhh222222222pppppppp3333\\\444444
10h9\2\8p4\3\3\\6\4\

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

tooraj_azizi_1035
سه شنبه 17 اردیبهشت 1392, 10:34 صبح
با استفاده از عبارات باقاعده:


string s = "111111111111100000011111000011199999999922222222ss ssssssss
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 تست کنی.

FastCode
سه شنبه 17 اردیبهشت 1392, 11:09 صبح
[a-z,A-Z]اون کاما اضافه نیست؟

tooraj_azizi_1035
سه شنبه 17 اردیبهشت 1392, 11:15 صبح
فکر می کنم حق با شماست تست نکردم.