تحدي برمجي[006][سهل]: ضغط النصوص

  • afaki

المدخلات

سلسلة نصية تتكون من مجموعة من الحروف بما فيها الwhitespaces

المخرجات

سلسلة نصية تحتوي على الحرف متبوعاً بعدد مرات ظهوره في السلسلة النصية الأصلية مع مراعاة ترتيب الحروف حسب ورودها في السلسلة النصية الأصلية وتجاهل الwhitespaces.

أمثلة:

"aabbcc"

الناتج

"a2b2c2"

"carrot and cheese"

الناتج

"c2a2r2o1t1n1d1h1e3s1"

""

الناتج

""
يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

AhmedSalahAssar أضف ردا

JavaScript

    function compress(str){

    var cmpStr='',used=[];
    str = str.split("");

    for (index in str){
    var x = str[index];

    if ( x != ' ' && used.indexOf(x) == -1 ){
    var counter = 0;
        for (var i=0;i<=str.length;i++){
            if (str[i] == x){
                counter++;
                }
        }
                cmpStr+= x + counter;
                counter=0;
                used.push(x);
            }

        }
        return cmpStr;
    }

مثال :-


الارقام !! هل فكرت بها ؟ اذا كان المدخل يحوي ارقاما ؟

كـ "al3ab"

سيكون المخرج

"alllab"

!!

الارقام تعامل كالحروف

الناتج في مثالك هو

a2l231b1

بايثون:

testString = "carrot and cheese"
tempList = [n + str(testString.count(n)) for n in testString if n != " "]
finalList = []
for i in tempList:
    if i not in finalList: finalList.append(i)
print "".join(finalList)

PHP

  $text = "seeDevice.com";
   $str_array = str_split($text);
   $result = array();
   foreach($str_array as $char){
$char = trim(strtolower($char)); //Lower all chars. to detect upper and lower
if($char == '')continue; //Skip empty char.
if(isset($result[$char])){
    $result[$char] +=1;
}else{
    $result[$char] = 1;
}
  }

//Print result
foreach($result as $key=>$res){
echo "<span style='color:red'>".$key."</span>".$res;
}

وهل الاحرف فقط انجليزيه؟ ماذا عن الاحرف العربية او الspecial characters

afaki أضف ردا

نعم الحروف

ascii lowercase + white spces وايضاً الأرقام 0-9

السلام عليكم،الحل ب C++

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
main(){
    string text;    vector<char> C;
    cout<<"enter you text:\n";
    getline(cin,text);
    for(int i=0,f=0;i<text.size();i++){
        if(!(find(C.begin(),C.end(),text[i])!=C.end()) && (text[i]!=' '))   C.push_back(text[i]);

        if(f<C.size()){
            size_t x = std::count(text.begin(),text.end(),C[f]);
            cout<<C[f]<<x;
            f++;}
    }
    cout<<endl;
}
AhmedSalahAssar أضف ردا

أسف أخي ..

كيف تقوم بعمل الكود بهذا الشكل

بدون تداخل في الأكود في طريقة التنسيق ؟!

Critias أضف ردا

السلام عليكم،

لم افهمك بالضبط. لكن ان كنت تقصد كيفية كتابة الكود دون تداخله مع التعليق، مثلا:

Hello World 

يمكنك قفز اربع مسافات (فراغات' ') قبل كل سطر تكتبه كي يكون النص داخل الاطار.

AhmedSalahAssar أضف ردا

تمام أخي ..

شكراً علي الإفادة .. لإني عندما وضعت الكود

بعض النصوص تعامل معها علي إنها كود والأخر تركه كنص عادي ...

محمد عزيز الكناني أضف ردا

حلي البسيط ب Python و Pascal:

(استعمل ال Recursion قليلا في نسخة الباسكال)

Python

الكود :

صورة :

Pascal

الكود :

صورة من سطح مكتبي :

  • شكرا على هذا التمرين كنت احتاج لصقل مهارتي في ال Recursion (بدات في تعلمها منذ وقت قصير)
afaki أضف ردا

حلي يشبه حل @Utnapishtim ولكن بطريقة مختلفة

python

import string

def comp(s):
    valid_chrs = string.ascii_lowercase + "0123456789"
    temp = {i + str(s.count(i)) for i in s if i in valid_chrs}
    sorted_list = sorted(temp, key=lambda x: s.index(x[0]))
    return ''.join(sorted_list)

صحيح أن الموضوع قديم لكني عزمت على المشاركة فيه.

وهذا الحل بلغة السي:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

char check(char*,const char*,unsigned int);
int calu(const char*,char*);

int main (int argc,char **argv) {
    if(argc<2){
        write(2,"\n",1);
        return -1;
    }
    unsigned int size=0;
    int argc2=--argc;
    while (argc2--){
        size+=strlen(argv[argc2+1]);
    }
    char *txt=malloc(size);
    strcpy(txt,argv[1]);
    argc2=--argc;
    while (0<=--argc2){
        strcat(txt,argv[argc-argc2+1]);
    }
    char *res=malloc(size);
    for(int i=0;i<size;i++)
        res[i]=0;
    for(int i=0;i<size;i++){
        if (!check(res,txt,i)){
            printf("%c%d",*(txt+i),calu(txt,(txt+i)));
        }
    }
    printf("\n");
    free(res); 
    free(txt);
    return 0;
}

char check (char *lst,const char *txt,unsigned int n){
    int i=0,len=strlen(txt);
    while(i<len){
        if(txt[n]==lst[i])
            return 1;
        i++;
    }
    strncat(lst,(txt+n),1);
    return 0;
}
int calu(const char *txt, char *chr){
    int len=strlen(txt),num=0;
    for(int i=0;i<len;i++){
        if(txt[i]==*chr)
            num++;
    }
    return num;
}
samer_jabal أضف ردا

بالبايثون:

count=[]

order=[]

for i in text:

if order:
    if i==order[-1]:
        count[-1]+=1
    else:
        order.append(i)
else:
    order.append(i)
    count+=1,

zipped_text=""

for i in range(len(order)):

zipped_text+="%s%d" %(order[i], count[i])

print text

print zipped_text