Я смотрел на недавний Код Гольф на удаление повторяющихся символов в строке. я обдумал это и подумал, что алгоритм RLE решит его, на самом деле, я уверен, что это разрешит удаление дубликатов, я написал реализацию здесь на C, чтобы посмотреть, как далеко я смогу пойти с этим
char *rle(const char *src){
char *p=(char *)src;
char *q=(char *)src+1;
char *rle_enc=NULL, *tmp_rle, buf[10];
int run=1;
while (*p){
while(*q){
if (*p==*q++) run++,p++;
}
sprintf(buf,"%d%c",run,*(p-1));
p++;
if (!rle_enc){
if ((rle_enc=malloc(strlen(buf)+1))!=NULL){
strcpy(rle_enc,buf);
}
}else{
if ((tmp_rle=realloc(rle_enc,(strlen(rle_enc)+strlen(buf)+1)))!=NULL){
rle_enc=tmp_rle;
strcat(rle_enc,buf);
}
}
q=(p+1);
run=1;
}
return rle_enc;
}
Конечно, вот главное для этого:
int main(int argc, char **argv){
char *test1 = "HHHHHHeeeeeelllllloooooooo";
char *test2 = "nbHHkRvrXbvkn";
char *p = rle(test1);
printf("s = %s\n", test1);
printf("p = %s\n", p);
if (p) free(p);
return 0;
}
Согласно Code Golf на мета, он должен быть многократно используемым и решать множество проблем, НО в самом коротком наборе символов, достаточно справедливо, я думал, что я просто изменил бы переменные на 1 букву и компактный код, чтобы сделать его маленьким ... но что-то было не совсем правильно с ним, так как это заставило меня задуматься о самом алгоритме RLE, вот страница в Wikipedia о том, что он должен сказать, и реализация на Java.
Код, похоже, делает то, что должен, поэтому я подумал, что теперь нужно просто просмотреть закодированный строковый результат из rle
и найти те, которые имеют 1, за которым следует буква.
Однако я заметил ограничение алгоритма RLE, он подходит только для тех, у которых есть набор повторяющихся символов, смежных друг с другом. Но он не прошел тестовый пример для Code Golf, который выглядит обманчиво простым, что приводит меня к этому вопросу:
Является ли алгоритм RLE некорректным? Где бы он использовался в наши дни? Я предполагаю, что собираю пыль из-за большого объема данных и информации, которая распространяется вокруг этой RLE, которая больше не соответствует цели ...
Редактировать: Спасибо Лунной Тени, Джону и Стиву за публикацию своих ответов.
Есть фундаментальный урок, который я до сих пор не усвоил - никогда не переходите на OTT и не мыслите комплексно, когда дело доходит до такого рода вещей, что является ошибкой с моей стороны и показывает, как большое мышление может мешать и я могу погрузиться в это слишком глубоко и увлечься, не глядя под прямым углом !!!!! Еще раз спасибо! :)
С уважением,
Том.