سؤال

مشكلتي الرئيسية هي محاولة إيجاد حل مناسب لتحويل هذا تلقائيا، على سبيل المثال:

d+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+

في هذا:

[d+c+d+f+]4

أي.ابحث عن التكرارات بجوار بعضها البعض، ثم قم بإنشاء "حلقة" أقصر من هذه التكرارات.ولم أجد حتى الآن حلاً مناسبًا لذلك، وأتطلع إلى الرد.ملاحظة.لتجنب الارتباك، العينة المذكورة أعلاه ليست هي الشيء الوحيد الذي يحتاج إلى "تكرار"، فهو يختلف من ملف إلى آخر.أوه، وهذا مخصص لبرنامج C++ أو C#، وكلاهما جيد، على الرغم من أنني منفتح على أي اقتراحات أخرى أيضًا.أيضًا، الفكرة الرئيسية هي أن كل العمل سيتم تنفيذه بواسطة البرنامج نفسه، دون إدخال المستخدم باستثناء الملف نفسه.إليكم الملف كاملا للإشارة، مع اعتذاري عن تمدد الصفحة:#0 @16 v225 y10 w250 t76

l16 $ ed $ EF $ a9 p20،20> ecegb> d u003Cbgbgecgecu003Cgn> D+ u003Cb>D+F+A+> C+u003C/b> u003Ca+f+a+f+d+u003Cb> u003Cb>F+D+u003C/b>u003Cbf+n> u003Cb>C u003Ca>CEGBGEGECu003C/a> u003Ca>ECu003C/a>u003C/b>u003Caen> u003Cb>u003Ca>D+C+D+F+D+C+D+F+D+C+D+F+D+C+D+F+R1^1u003C/a>u003C/b>

/ L8 R1R1R1R1 F+u003Ca+> F+G+CG+R4 A+C+A+G+CG+R4F+u003Ca+> F+G+CG+R4 A+C+A+G+CG+R4F+u003Ca+> F+G+CG+R4 A+C+A+G+CG+R4 F+u003Ca+> f+g+cg+r4 a+c+a+g+r4g+16f16c+a+2^g+f+g+4 f+ff+4fd+f4 d+c+d+4c+cu003Ca+2^4n> C4D+u003Cg+2^4r4^na+> C+D+4G+4A+4 R1^2^4^A+2^G+F+G+4 F+FF+4FD+F4 D+C+D+4C+Cu003Ca+2^4n> C4D+u003Cg+2^4r4^na+> c+d+4g+4a+4 r1^2^4^ r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1

#4@22v250y10

l8 o3 rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+rg+ / / / / r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1

#2@4v155y10

l8 $ $ $ f8 $ 8f o4 r1r1r1 d+4f4f+4g+4 a+4r1^4^2 / d+4^fr2 f+4^fr2d+4^fr2 f+4^fr2d+4^fr2 f+4 ^fr2d+4^fr2 f+4^fr2> d+4^fr2 f+4^fr2d+4^fr2 f+4^fr2 <f+4^g+r2 f+4^fr2f+4^g+r2 f+4^fr2f+4^g+r2 f+4^fr2f+4^g+r2 f+4^fr2f+4^g+r2 f+4^fr2f+4^g+r2 f+4^fr2f+ 4^g+r2 f+4^fr2f+4^g+r2 f+4^fr2> a+4^g+r2 f+1a+4^g+r2 f+1 f+4^fr2 d+1 f +4^fr2 d+2^d+4^r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1

#3 @10 v210 y10

R1^1 O3 C8R8D8R8 C8R8C8R8R8R8C8R8R8R8R8R8R8R8R8R8R8R8R8R8R8R8R8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8 c4@10d8@21c8u003Cb8> @10d16d16d16d16d16r16 c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8c4@10d8@21c8u003Cb8> c8@10d8@21c8 c4@10d8@21c8@10b16b16> c16c16

#7@16v230y10

l16 $ ed $ ef $ a9 cceeggbbggeecceeu003Cbb> D+D+F+F+A+A+F+F+D+D+u003Cbb> D+D+u003Caa> cceeggeeccu003Caa> نسخةu003Cg+g+bb> D+D+FFD+D+

#5@4v155y10

l8 $ ed $ f8 $ 8f o4 r1r1r1r1 d+4r1^2^4 /u003Ca+4^> CR2 C+4^CR2u003Ca+4^> CR2 C+4^CR2u003Ca+4^> CR2 C+4^CR2u003Ca+4^> CR2 C+4^CR2 A+4^> CR2 C+4^CR2u003Ca+4^> CR2 C+4^C R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1R1 R2 F+4^FR2 D+1F+4^FR2 D+1 C+4^CR2u003Ca+1n> C+4^CR2

هل كانت مفيدة؟

المحلول

لست متأكدا إذا كان هذا هو ما تبحث عنه.

أخذت السلسلة "testtesttest4notaduped+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+testtesttest" وقمت بتحويلها إلى "[اختبار]4 4notadupe[ د+ج+د+و+]4 [اختبار]3 "

أنا متأكد من أن شخصًا ما سيتوصل إلى حل أفضل وأكثر كفاءة لأنه بطيء بعض الشيء عند معالجة ملفك بالكامل.وإنني أتطلع إلى إجابات أخرى.

        string stringValue = "testtesttesttest4notaduped+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+testtesttest";

        for(int i = 0; i < stringValue.Length; i++)
        {
            for (int k = 1; (k*2) + i <= stringValue.Length; k++)
            {
                int count = 1;

                string compare1 = stringValue.Substring(i,k);
                string compare2 = stringValue.Substring(i + k, k);

                //Count if and how many duplicates
                while (compare1 == compare2) 
                {
                    count++;
                    k += compare1.Length;
                    if (i + k + compare1.Length > stringValue.Length)
                        break;

                    compare2 = stringValue.Substring(i + k, compare1.Length);
                } 

                if (count > 1)
                {
                    //New code.  Added a space to the end to avoid [test]4 
                    //turning using an invalid number ie: [test]44.
                    string addString = "[" + compare1 + "]" + count + " ";

                    //Only add code if we are saving space
                    if (addString.Length < compare1.Length * count)
                    {
                        stringValue = stringValue.Remove(i, count * compare1.Length);
                        stringValue = stringValue.Insert(i, addString);
                        i = i + addString.Length - 1;
                    }
                    break;
                }
            }
        }

نصائح أخرى

يمكنك استخدام خوارزمية Smith-Waterman لإجراء محاذاة محلية، ومقارنة السلسلة بنفسها.

http://en.wikipedia.org/wiki/Smith-Waterman_algorithm

يحرر:لتكييف الخوارزمية من أجل المحاذاة الذاتية، تحتاج إلى فرض القيم في القطر على الصفر - أي معاقبة الحل التافه المتمثل في محاذاة السلسلة بأكملها تمامًا مع نفسها.ثم ستظهر المحاذاة "ثاني أفضل" بدلاً من ذلك.ستكون هذه أطول سلسلتين فرعيتين متطابقتين.كرر نفس الشيء للعثور على سلاسل فرعية متطابقة أقصر بشكل تدريجي.

LZW استطيع المساعدة:يستخدم قاموس البادئات للبحث عن الأنماط المتكررة ويستبدل هذه البيانات بمراجع للإدخالات السابقة.أعتقد أنه لن يكون من الصعب تكييفه مع احتياجاتك.

لماذا لا تستخدم فقط System.IO.ضغط?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top