Автор Тема: Простейший рейтинг.  (Прочитано 5130 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Простейший рейтинг.
« : 19 Апреля 2002, 04:08:32 »
Вот никак не могу придумать...
Помогите, плиз...
Есть файл где много-много строчек...
Нужен скрипт который делает следующую вещь:
считывает энти самые строчки и ищет повторения, а потом распечатыает результат, убирая повторяющиеся строчки, НО, напротив каждой строчки ввыводит сколько раз она встречается в файле, по убыванию,  например, есть файл:
строка1
строка2
строка1
Результат работы скрипта:
строка1 ..................2раза
строка2 ..................1раз
Ну к чему все это, лучше бы водки выпили...

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Простейший рейтинг.
« Ответ #1 : 19 Апреля 2002, 04:09:16 »
Да, чуть не забыл:) формат у файла конечно же текстовой.
Ну к чему все это, лучше бы водки выпили...

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
вот
« Ответ #2 : 19 Апреля 2002, 04:41:19 »
#!/usr/bin/perl
open (FILE, "my @file=;
close FILE;
my %count=();
foreach my $strk(@file){ $count{$strk}++;}
map {print "$_ => $count{$_}\\n"} keys %count;
 в исканиях.

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Простейший рейтинг.
« Ответ #3 : 19 Апреля 2002, 23:53:13 »
ЭЭЭ... этот кусочек кода подсчитывает сколько раз повоторяется но НЕ сортирует записи в порядке убывания (мне нужно, чтобы записи выводились в порядке убывания повторений). Как это сделать, а?
Ну к чему все это, лучше бы водки выпили...

Оффлайн ESE

  • Фанат
  • Постоялец
  • ***
  • Сообщений: 172
  • +0/-0
  • 2
    • Просмотр профиля
    • http://comp.hobi.ru
Простейший рейтинг.
« Ответ #4 : 20 Апреля 2002, 01:44:05 »
#!/usr/bin/perl
# reyting для Глебушки :)
print "Content-type: text/html\\n\\n";
open Data,"data.txt";@dat1=;@dat2=@dat1;close Data;
while (<@dat1>){my $string=$_;
if ($result{$string} ne ""){next;}else {$result{$string}=0;}
foreach $line (<@dat2>){if ($line eq $string){$result{$string}++;}}
if ($string ne ""){print "строка $string встретилась $result{$string} раз
\\n";
push(@sorts,"$result{$string}\\:::$string");
}}
print "Теперь сортитуем по убыванию
\\n";
@sort=@sorts;
$test=1;
while (<@sorts>){
($reyting,$name)=split(/:::/);
if ($reyting >=$test){$test=$reyting}#получили max значение
      }
for ($n=$test;$n>=1;$n--){#от мax к минимальному
while (<@sort>){
($reyting,$name)=split(/:::/);
if ($reyting ==$n){print "$name => $reyting
\\n"}
}}


вот такое решение пришло мне в голову :)
У програмиста две руки: левая и !левая
welcome

Оффлайн ESE

  • Фанат
  • Постоялец
  • ***
  • Сообщений: 172
  • +0/-0
  • 2
    • Просмотр профиля
    • http://comp.hobi.ru
Простейший рейтинг.
« Ответ #5 : 20 Апреля 2002, 03:29:12 »
А вот и не спиши эту галемотью использовать.Я тестировал на файле из 10 строк - работает. Из 10 кБт виснет! Циклы гоняет :(

Надо как-то подругому.....
У програмиста две руки: левая и !левая
welcome

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Простейший рейтинг.
« Ответ #6 : 20 Апреля 2002, 13:28:36 »
Цитировать
10 кБт виснет! Циклы гоняет

Тыды не пойдёт, а я уж обрадовался:), файлы предполагаются быть достаточно большими... Поэтому скорость выполнения  важна...
Цитировать
Надо как-то подругому.....

Как? Не подскажите:). А то у меня вообще никаких идей нет что делать с какадувовским кодом дальше..., Green Kakadu, ESE, помогите!!!!!!!!!
Ну к чему все это, лучше бы водки выпили...

Оффлайн ESE

  • Фанат
  • Постоялец
  • ***
  • Сообщений: 172
  • +0/-0
  • 2
    • Просмотр профиля
    • http://comp.hobi.ru
Простейший рейтинг.
« Ответ #7 : 20 Апреля 2002, 15:26:20 »
По скорости у
Цитировать
Green Kakadu
гораздо быстрее работает :)

А над рейтингом подумаем....
У програмиста две руки: левая и !левая
welcome

Оффлайн ESE

  • Фанат
  • Постоялец
  • ***
  • Сообщений: 172
  • +0/-0
  • 2
    • Просмотр профиля
    • http://comp.hobi.ru
Простейший рейтинг.
« Ответ #8 : 20 Апреля 2002, 22:48:59 »
Вот оно!
100 кБт за 1 секунду! и компактно получилось

#!/usr/bin/perl
print "Content-type: text/html\\n\\n";
open FILE, "data.txt";
@file=;
close FILE;
foreach $line (@file){$res{$line}++;}
foreach $line ( @file ) {
if ($res{$line} >=$test){$test=$res{$line}
} }
$is=1;
for ($n=$test;$n>=1;$n--){
    foreach $line ( keys %res ) {
    if ($res{$line}==$n){print "На $is месте $line зашедший к нам $n раз(а)\\n
";$is++}}}
« Последнее редактирование: 21 Апреля 2002, 00:54:11 от ESE »
У програмиста две руки: левая и !левая
welcome

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Простейший рейтинг.
« Ответ #9 : 21 Апреля 2002, 01:54:39 »
ESE
Спасибо! Ща пойду тестить на файлах до 200кбт, в файле из 40 строчек работает нормльно, вроде бы:).
Большое Человеческое Спасибо!!!
Ну к чему все это, лучше бы водки выпили...

Оффлайн ESE

  • Фанат
  • Постоялец
  • ***
  • Сообщений: 172
  • +0/-0
  • 2
    • Просмотр профиля
    • http://comp.hobi.ru
Простейший рейтинг.
« Ответ #10 : 21 Апреля 2002, 10:30:51 »
Я на мегобайтном проверял, работало. По времении приблизительно 3-4 секунды процес занял.
У програмиста две руки: левая и !левая
welcome

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Простейший рейтинг.
« Ответ #11 : 23 Апреля 2002, 22:11:12 »

#!/usr/bin/perl
open (FILE, "my @file=;
close FILE;
my %count=();
foreach my $strk(@file){ $count{$strk}++;}
map {print "$_ => $count{$_}\\n"} sort {$count{$b}<=>$count{$a}} keys %count;


я тогда забыл про сортировку ;)
 в исканиях.

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Простейший рейтинг.
« Ответ #12 : 23 Апреля 2002, 23:43:32 »
Green Kakadu
Брависимо! Код в полтора раза меньше! Интересно, работает тоже в полтора раза быстрее:-)?
Ну к чему все это, лучше бы водки выпили...

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Простейший рейтинг.
« Ответ #13 : 25 Апреля 2002, 01:27:49 »
Цитировать
Интересно, работает тоже в полтора раза быстрее:-)?

навряд ли, просто  ESE довольно своеобразную логику там применил - в Perl есть встроенная функция сортировки.
 в исканиях.

Оффлайн ESE

  • Фанат
  • Постоялец
  • ***
  • Сообщений: 172
  • +0/-0
  • 2
    • Просмотр профиля
    • http://comp.hobi.ru
Простейший рейтинг.
« Ответ #14 : 25 Апреля 2002, 21:55:04 »
Ну вот вариант покороче первого варианта
open FILE, "data.txt";
@file=;close FILE;
foreach $line (@file){$res{$line}++;
if ($res{$line} >=$test){$test=$res{$line}}}
$is=1;
for ($n=$test;$n>=1;$n--){
    foreach $line ( keys %res ) {
    if ($res{$line}==$n){print "На $is месте $line зашедший к нам $n раз(а)\\n
";$is++}}}


Ну а по поводу сортировки я к сожалению плохо знаком с оператором sort но как-то пытался его применять, результат был такой : 1 17 2 22 3 38  43 5 56 6 7 тоесть сортировка происходила по первой цифре

:beer:
У програмиста две руки: левая и !левая
welcome

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28