
![]() |
||
Наши проекты: | Журнал · Discuz!ML · Алгоритмы · Естественные науки · Wiki · DRKB · Помощь проекту |
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.231.229.89] |
![]() |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
![]() |
Сообщ. #16,
|
|
D_KEY, а давай ты и я внесем в свой код правки - в качестве разделителей дополнительно считать разделителями < > ' " ) ( , . - + : ; ! ?
Ну и посмотрим, сколько нам потребуется кликов для доработки? ![]() Скрытый текст Если че, у меня все готово ... ![]() ![]() ![]() #!/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
|
Сообщ. #17,
|
|
|
Хотел или нет, это неважно. Просто, помоему, задача, слишком синтетическая, чтобы дать практически полезный результат. Это именно что холивар, тоесть пиписькомер. А внешний размер, далеко не главное. Вы бы чем-нибудь более полезным занялись! А если же по коду... Ну очевидно же, что разбивать строки на новые строки не эффективно. Надо запоминать начало и конец слова в объекте. А уже эти объекты обрабатывать. Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
|
![]() |
Сообщ. #18,
|
|
Цитата Eric-S @ А если же по коду... Ну очевидно же, что разбивать строки на новые строки не эффективно. Надо запоминать начало и конец слова в объекте. А уже эти объекты обрабатывать. Ну так это делается с помощью конечного автомата. Однако и регулярки - тот же конечный автомат, только предварительно компилируемый во время исполнения. Более того, в сишной библиотеке PCRE ничего не разбивается - там возвращается массив индексов соответствия паттерну. В Perl'е встроенный механизм другой. Поэтому тебе наверное стоит написать именно разработчику языка о том, что он не прав ![]() Мои программные ништяки ≡ http://majestio.info
|
Сообщ. #19,
|
|
|
Регулярки тормозить будут, мама не горюй.
error: 'long long long' is too long for GCC
|
![]() |
Сообщ. #20,
|
|
Цитата applegame @ Регулярки тормозить будут, мама не горюй. За удобства нужно платить. Тем не менее, при составлении регулярок есть некоторое (хотя и слабое) соответствие составлению запросов на SQL. И на SQL-ле можно составить запрос так, что сервер попросит прощения человеческим голосом. Не спорю, лучше зарядить уж связку Bison/Flex - но, имхо, это уж очень узко-специализированные применения, где выжимать нужно по максимуму. Регулярок "в быту" за глаза хватает. Мои программные ништяки ≡ http://majestio.info
|
Сообщ. #21,
|
|
|
Цитата JoeUser @ Удобства? По мне так из пушки по воробьям. Неужели в перле нет простого сплита без регулярок? И кстати, твоя программа осилит файло в UTF-8?За удобства нужно платить. Тем не менее, при составлении регулярок есть некоторое (хотя и слабое) соответствие составлению запросов на SQL. Вот решение задачи на D (текст должен быть в UTF-8), без оптимизаций, файло тупо грузится целиком в оперативу: ![]() ![]() 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 - но, имхо, это уж очень узко-специализированные применения, где выжимать нужно по максимуму. Регулярок "в быту" за глаза хватает. ![]() Тестовй файлик: Прикреплённый файл ![]() error: 'long long long' is too long for GCC
|
![]() |
Сообщ. #22,
|
|
Цитата applegame @ Неужели в перле нет простого сплита без регулярок? Нету. Может библиотечные и есть, но языковая конструкция - только на регулярках. Цитата applegame @ И кстати, твоя программа осилит файло в UTF-8? Нужно добавить в начало "use encoding 'utf8';" тогда осилит. Цитата applegame @ Вот решение задачи на D Ниче так - кросава ![]() Цитата applegame @ Накой для такой примитивной задачи Bison/Flex? Да в начале разговора вообще шла тема запредельных нагрузок, поэтому и решил, что построить автоматы надо заранее. Мои программные ништяки ≡ http://majestio.info
|
![]() |
Сообщ. #23,
|
|
Цитата applegame @ Вот решение задачи на D Очень похоже на Ruby ![]() ![]() ![]() 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
|
Сообщ. #24,
|
|
|
Цитата applegame @ Вообще-то bison не нужен, достаточно одного flex'а. Программа должна получиться строк на десять, не больше. Накой для такой примитивной задачи Bison/Flex? Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
|
![]() |
Сообщ. #25,
|
|
Цитата amk @ Вообще-то bison не нужен, достаточно одного flex'а. У тебя есть практика использования? Мои программные ништяки ≡ http://majestio.info
|
Сообщ. #26,
|
|
|
Цитата amk @ Прекрасно, давай ее сюды. Программа должна получиться строк на десять, не больше. error: 'long long long' is too long for GCC
|
Сообщ. #27,
|
|
|
Цитата JoeUser @ Я пользовался когда-то lex и C.Цитата applegame @ А она что, кому-нибудь нужна? Просто мне лень ставить нужные для проверки кода программы. Прекрасно, давай ее сюды. Добавлено Если бы мне эту задачу пришлось решать, я бы её на питоне решал. ![]() ![]() 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) Вот примерно так. Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
|
![]() |
Сообщ. #28,
|
|
Цитата amk @ '[^-+().,:\s;><"\'?!]' Подозрительная регулярка - имхо, кривая. Мои программные ништяки ≡ http://majestio.info
|
Сообщ. #29,
|
|
|
Да, перед s надо двойной бэкслэш поставить
А всё остальное там правильно. В квадратных скобках почти все спецсимволы теряют своё специальное значение. Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
|
![]() |
Сообщ. #30,
|
|
Цитата amk @ почти все спецсимволы Со знаком минус нужно быть аккуратнее, если нужен именно символ "-" - нужно его ставить последним, перед закрывающей скобкой. Добавлено Равно как и "шапочка" ^, чтобы она не значила отрицания. Добавлено shm, раз уж пошла такая пьянка ... запили работающий код питона на ideone.com, читаем не из файла, а из строки с переводами строк, возвратами каретки и всякими там табуляциями. Будет нагляднее. Мои программные ништяки ≡ http://majestio.info
|