LINUX.ORG.RU

манипуляции с текстом ч.2


0

2

есть строка типа

aasffdjhdghneeraasdaeaashndasghs


может состоять из совершенно любых символов любых кодировок
нужно убрать все повторяющиеся символы т.е привести к виду:

asfdjhgner


Ответ на: комментарий от serles

Хватит уже бездумно выпонять любой код который тебе скидывают, пока какую нибудь гадость не скинули. Включи голову и посмотри в исходник там есть слово sort в последней строчке, как думаешь для чего оно?

TDrive ★★★★★
()
#!/usr/bin/env ruby

require 'set'

File.open(ARGV[0], 'r').each{ |line| puts line.chomp.split('').to_set.to_a.join('') }

руби как всегда лаконичен

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

то есть вот

#!/usr/bin/env ruby

File.open(ARGV[0], 'r').each{ |line| puts line.chomp.split('').uniq.join('') }

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)
#include <stdio.h>
#include <stdlib.h>

int main(int c, char **v){
    char *s = NULL, *p, last;
    size_t sz;
    ssize_t L;
    while ((L = getline(&s, &sz, stdin)) > 0){
        last = 0;
        p = s;
        do{
            char ch = *p;
            if(ch != last){
                printf("%c", ch);
                last = ch;
            }
        }while(*(++p));
        printf("\n");
        free(s);
        s = NULL;
    }
}
gcc 1.c && echo "asdfffffffffsdaaaaaaaaaasdffffewwwwwwwwqqqqq" | ./a.out 
asdfsdasdfewq
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от TDrive

Прошу прощения, не ругайте.
Я далек от программирования, мне просто нужно решить мою задачу, и без вашей помощи мне не обойтись!
За sort - спасибо, вылечили.
Всем, кто помогал - преогромнейшее спасибо!
Топик можно закрывать.

serles
() автор топика
Ответ на: комментарий от emulek

echo "ААБААВГФФЫЦЦЫ" | sed -r ':l;s/(.)(.*)\1/\1\2/;tl'
АБВГФЫЦ

Не работает. Должно быть "АБАВГФЫЦЫ". И вобще, у тебя в sed какой-то ужас написан!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ziemin

С кириллицей работает:

echo "ЗЗЗЗддддрааааввввстттттвввввууууй,,,    ЖЖЖопппааааа, Нооввввыыыый Гоооодддд" | ./a.out 
Здравствуй, Жопа, Новый Год

а версию с хрюникодом пусть китайцы разрабатывают, им хрюникод нужен.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ziemin

Тьфу, блин! Это где сказано было? Если должно не быть повторов вообще, то просто заполняем табличку — гистограмму. И по ней сверяем. Могу написать реализацию.

Естественно, тоже никакого хрюникода. Быдлокодингом не занимаюсь

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Это где сказано было?

На пример в топике внимательно посмотри.

Естественно, тоже никакого хрюникода. Быдлокодингом не занимаюсь

Тогда будет работать только у тебя.

ziemin ★★
()
Ответ на: комментарий от ziemin
#include <stdio.h>
#include <stdlib.h>

char histo[256] = {0};

int main(int c, char **v){
    char *s = NULL, *p, last;
    size_t sz;
    ssize_t L;
    while ((L = getline(&s, &sz, stdin)) > 0){
        p = s;
        do{
            unsigned char ch = *p;
            if(histo[ch] == 0){
                ++histo[ch];
                printf("%c", ch);
            }
        }while(*(++p));
        printf("\n");
        free(s);
        s = NULL;
    }
}
gcc 2.c && echo "ЗЗЗЗддддрааааввввстттттвввввууууй,,,    ЖЖЖопппааааа, Нооввввыыыый Гоооодддд" | ./a.out
Здравстуй, ЖопНыГ
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ziemin

Будет работать у всех с нормальной кириллической локалью.

Желающие поонанировать на китайский, могут внести патч с wchar.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Да, естественно, с нормальной гистограммой у онанистов не получится. Им придется значительно дольше мучиться.

Скажем, можно отсортировать все буквы строки, затем выкинуть повторы и оставшееся занести в таблицу. Далее, считывая символы строки второй раз, проверять в таблице, есть ли текущий символ: если есть, то печатать его и обнулять в таблице.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от serles
Фантастика! 151М[br]
real 1m28.737s

Какая ж это фантастика? Вот если секудна — то да.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Зачем это всё? По биту на символ и учесть, что реально заполненность 10%. Средненький массивчик получится. Правда при изменении юникода придётся обновления выпускать, но это мелочь.

ziemin ★★
()
Ответ на: комментарий от ziemin

По биту на символ

Ты сильно проиграешь в битовых операциях. В моем случае тоже неправильно сделано: правильней uint64_t в качестве гистограммы использовать — тогда будет наиболее высокая производительность.

И еще раз: если ты используешь хрюникод, то быстрей будет сначала отсортировать и выдрать непохожие символы, а затем вывести их в нужном порядке!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ты сильно проиграешь в битовых операциях.

Затор будет на чтении с диска. Да и с чего бы это проверка бита и установка бита такие серьёзные операции? в x86 есть команда bts, которая это делает сразу (проверяет и устанавливает). По сравнению с сортировками, дополнительными массивами, вторыми проходами это страшная нагрузка?

ziemin ★★
()
Ответ на: комментарий от ziemin

Ну, допустим. Но только вот ты учти, что у тебя в хрюникоде 2³² символов. Т.е. даже если ты будешь битовый массив использовать, то его размер составит 500МБ!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ziemin

И что, ты еще и индексы реальной заполненности будешь хранить?

Вот же нефиг делать! Ставь КОИ8-Р и не парься!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

И что, ты еще и индексы реальной заполненности будешь хранить?

Кто бы говорил. А вдруг у тебя входная строка 2³²символа? А ты её всю читаешь.

ziemin ★★
()
Ответ на: комментарий от ziemin

А вдруг у тебя входная строка 2³²символа?

У меня — тупой пример. Для реальных условий работы с файлами я бы mmap использовал, и никаких косяков бы не было! Ведро само разберется, что читать, откуда читать и где это складывать.

А входная строка на 2³² символа поломает все выложенные здесь реализации.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Вот и я про реальные условия. С текущим количеством символов в юникоде, массив получится небольшой. Индексы заполненности - ерунда.

ziemin ★★
()
Ответ на: комментарий от serles

Что бы тупо удалял все повторяющиеся символы!

Помогите отсортировать символы построчно в файле

Ты уж определись.

Убери тогда sort в последней строчке.

Nervous ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.