На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Рассуждения на тему "С++ vs интерпретируемые языки"
    D_KEY, а давай ты и я внесем в свой код правки - в качестве разделителей дополнительно считать разделителями < > ' " ) ( , . - + : ; ! ?
    Ну и посмотрим, сколько нам потребуется кликов для доработки? :)

    Скрытый текст
    Если че, у меня все готово ... :lol:

    ExpandedWrap disabled
      #!/usr/bin/perl
       
      open (FD,$ARGV[0]) || die "Shit!";
      map {$Freq{$_}++;} split /[-+\(\)\.,:\+\s;><"'\?!]+/, join "", <FD>;
      close (FD);
      map {print $_." : ".$Freq{$_}."\n";} sort {$Freq{$b}<=>$Freq{$a}} keys %Freq;
    Мои программные ништякиhttp://majestio.info
      Цитата JoeUser @
      А этого не хотел Eric-S, типа "давай без либ!".

      Хотел или нет, это неважно. Просто, помоему, задача, слишком синтетическая, чтобы дать практически полезный результат.
      Это именно что холивар, тоесть пиписькомер. А внешний размер, далеко не главное.
      Вы бы чем-нибудь более полезным занялись!

      А если же по коду... Ну очевидно же, что разбивать строки на новые строки не эффективно. Надо запоминать начало и конец слова в объекте. А уже эти объекты обрабатывать.
      Сообщение отредактировано: Eric-S -
      Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
        Цитата Eric-S @
        А если же по коду... Ну очевидно же, что разбивать строки на новые строки не эффективно. Надо запоминать начало и конец слова в объекте. А уже эти объекты обрабатывать.

        Ну так это делается с помощью конечного автомата. Однако и регулярки - тот же конечный автомат, только предварительно компилируемый во время исполнения. Более того, в сишной библиотеке PCRE ничего не разбивается - там возвращается массив индексов соответствия паттерну. В Perl'е встроенный механизм другой. Поэтому тебе наверное стоит написать именно разработчику языка о том, что он не прав :lol:
        Мои программные ништякиhttp://majestio.info
          Регулярки тормозить будут, мама не горюй.
          error: 'long long long' is too long for GCC
            Цитата applegame @
            Регулярки тормозить будут, мама не горюй.

            За удобства нужно платить. Тем не менее, при составлении регулярок есть некоторое (хотя и слабое) соответствие составлению запросов на SQL. И на SQL-ле можно составить запрос так, что сервер попросит прощения человеческим голосом.

            Не спорю, лучше зарядить уж связку Bison/Flex - но, имхо, это уж очень узко-специализированные применения, где выжимать нужно по максимуму. Регулярок "в быту" за глаза хватает.
            Мои программные ништякиhttp://majestio.info
              Цитата JoeUser @
              За удобства нужно платить. Тем не менее, при составлении регулярок есть некоторое (хотя и слабое) соответствие составлению запросов на SQL.
              Удобства? По мне так из пушки по воробьям. Неужели в перле нет простого сплита без регулярок? И кстати, твоя программа осилит файло в UTF-8?
              Вот решение задачи на D (текст должен быть в UTF-8), без оптимизаций, файло тупо грузится целиком в оперативу:
              ExpandedWrap disabled
                import std.file;
                import std.stdio;
                import std.array;
                import std.algorithm;
                 
                void main(string[] args) {
                    int[string] words;
                    readText(args[1])
                        .splitter!(c => canFind(" \n\r\t<>'\")(,.-+:;!?", c))
                        .filter!(w => !w.empty)
                        .each!(w => words[w]++);
                    words
                        .byKeyValue
                        .array
                        .sort!((a, b) => a.value > b.value)
                        .each!(p => writefln("%s: %s", p.key, p.value));    
                }

              Цитата JoeUser @
              Не спорю, лучше зарядить уж связку Bison/Flex - но, имхо, это уж очень узко-специализированные применения, где выжимать нужно по максимуму. Регулярок "в быту" за глаза хватает.
              Накой для такой примитивной задачи Bison/Flex? :blink:

              Тестовй файлик: Прикреплённый файлПрикреплённый файлtest.txt (15,28 Кбайт, скачиваний: 111)
              Сообщение отредактировано: applegame -
              error: 'long long long' is too long for GCC
                Цитата applegame @
                Неужели в перле нет простого сплита без регулярок?

                Нету. Может библиотечные и есть, но языковая конструкция - только на регулярках.

                Цитата applegame @
                И кстати, твоя программа осилит файло в UTF-8?

                Нужно добавить в начало "use encoding 'utf8';" тогда осилит.

                Цитата applegame @
                Вот решение задачи на D

                Ниче так - кросава :)

                Цитата applegame @
                Накой для такой примитивной задачи Bison/Flex?

                Да в начале разговора вообще шла тема запредельных нагрузок, поэтому и решил, что построить автоматы надо заранее.
                Мои программные ништякиhttp://majestio.info
                  Цитата applegame @
                  Вот решение задачи на D

                  Очень похоже на Ruby :)

                  ExpandedWrap disabled
                    H = {}
                    File.open("Testo.txt","r:UTF-8"){|f| f.read}
                     .split(/[-+\(\)\.,:\+\s;><"'\?!]+/)
                      .collect{|w| H[w] = H[w].to_i.succ}
                    H.sort_by(&:last)
                      .reverse!.each {|k,v| puts "#{k} : #{v}\n"}
                  Мои программные ништякиhttp://majestio.info
                    Цитата applegame @
                    Накой для такой примитивной задачи Bison/Flex?
                    Вообще-то bison не нужен, достаточно одного flex'а. Программа должна получиться строк на десять, не больше.
                    Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                      Цитата amk @
                      Вообще-то bison не нужен, достаточно одного flex'а.

                      У тебя есть практика использования?
                      Мои программные ништякиhttp://majestio.info
                        Цитата amk @
                        Программа должна получиться строк на десять, не больше.
                        Прекрасно, давай ее сюды.
                        error: 'long long long' is too long for GCC
                          Цитата JoeUser @
                          Я пользовался когда-то lex и C.
                          Цитата applegame @
                          Прекрасно, давай ее сюды.
                          А она что, кому-нибудь нужна? Просто мне лень ставить нужные для проверки кода программы.

                          Добавлено
                          Если бы мне эту задачу пришлось решать, я бы её на питоне решал.
                          ExpandedWrap disabled
                            from re import finditer
                            from collections import Counter
                            from sys import argv
                            wordcount = Counter()
                            for line in open(argv[1], 'rt', encoding='cp1251'):
                                for word in finditer('[^-+().,:\s;><"\'?!]', line)
                                    wordcount[word] += 1
                            for count, wors in sorted((c, w) for w, c in wordcount.items()):
                                print(word, count)

                          Вот примерно так.
                          Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                            Цитата amk @
                            '[^-+().,:\s;><"\'?!]'

                            Подозрительная регулярка - имхо, кривая.
                            Мои программные ништякиhttp://majestio.info
                              Да, перед s надо двойной бэкслэш поставить
                              А всё остальное там правильно. В квадратных скобках почти все спецсимволы теряют своё специальное значение.
                              Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                                Цитата amk @
                                почти все спецсимволы

                                Со знаком минус нужно быть аккуратнее, если нужен именно символ "-" - нужно его ставить последним, перед закрывающей скобкой.

                                Добавлено
                                Равно как и "шапочка" ^, чтобы она не значила отрицания.

                                Добавлено
                                shm, раз уж пошла такая пьянка ... запили работающий код питона на ideone.com, читаем не из файла, а из строки с переводами строк, возвратами каретки и всякими там табуляциями. Будет нагляднее.
                                Мои программные ништякиhttp://majestio.info
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,2018 ]   [ 18 queries used ]   [ Generated: 11.12.19, 17:24 GMT ]