Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подкиньте задачки по перлу, учу язык :) 
:(
    Опции темы
arto
Дата 16.10.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



а доказательство сколько строк будет занимать?
PM MAIL ICQ   Вверх
KSURi
Дата 16.10.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Док-во чего? Я имел ввиду вот это:
Код

perl -ne '($a,$b)=split' ';print eval$a>eval$b?$a:$b,"\n"'
(4+4)**2+7 3+(2*1)**2
(4+4)**2+7


Это сообщение отредактировал(а) KSURi - 16.10.2007, 23:38


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
under_sun
Дата 17.10.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: нет
Всего: 17



Цитата

а вы сами знаете решение?

Да, я сдавал эту задачку в универе.


KSURi, хочу напомнить, что выражения могут быть не только числовыми, но и буквенными smile 
--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
KSURi
Дата 17.10.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Код

C:\>perl -ne "($a,$b)=split' ';print eval$a>eval$b?$a:$b,qq{\n}"
(1+a)*7 (b+2)*2
(1+a)*7




--------------------
Died at Life.pl line 21
PM Jabber   Вверх
under_sun
Дата 17.10.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: нет
Всего: 17



eval -ом одним здесь ничего не сделать, т.к. он не понимает символьную арифметику )).
(a*7 будет 0 и a+с тоже)
т.е. в твоем коде a*5 и a*7 будут равны, и все выражения в, которых нет цифр, тоже....


  
--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
KSURi
Дата 17.10.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Ну начальное условие не совсем точно было написано...


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
amg
Дата 19.10.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Задача не то чтобы сложная, но довольно муторная (если решать ее так, как я это делал). Хотя, может, есть способ гораздо проще.
Код

while (<DATA>) {
  chomp;        # убираем конец строки
  my $inp = $_; # сохраняем на будущее исходное выражение
  
  # Возведение в степень заменяем умножением
  warn "Error: $&\n" and next if m/\^\D/;
  s/(\([^)(]+\)|\d+|[a-z])\^(\d+)/$2 ? ("$1*"x($2-1)).$1 : 1/eg;

  # Добавляем недостающие знаки умножения
  s/(\d+|[a-z]|\))(?=\d|[a-z]|\()/$1*/g;

  s/-/+M*/g;          # заменяем - на "-1" (M)
  s/^\+|(?<=\()\+//g; # убираем + в начале и после открывающей скобки

  # Пропускаем получившееся выражение через perl: не поругается ли
  (my $test = $_) =~ s/[a-zM]/1/g;
  defined(eval $test) or warn "Error in $inp=$_: $@\n" and next;

  1 while (s/\(([^)(]+)\)\*\(([^)(]+)\)/ mult($1,$2) /ge or
           s/\(([^)(]+)\)\*(\d+|[a-zM])/ mult($1,$2) /ge or
           s/(\d+|[a-zM])\*\(([^)(]+)\)/ mult($1,$2) /ge or
           s/(^|\+|\()\(([^)(]+)\)(\+|\)|$)/$1$2$3/g);

  my %h;
  foreach (split /\+/, $_) {
    $_ = join '*', sort split '\*', $_;
    s/^([a-z])/1*$1/;
    s/^([\dM*]+)$/$1*Z/;
    my ($v,$k) = m/^([^a-zZ]*)\*(.+)$/;
    $h{$_}++ unless defined $k;
    $v =~ s/M/-1/g;
    $v = eval($v); die $@ if $@;
    $h{$k} += $v;
  }

  my $res = '';
  foreach (sort keys %h) {
    next if $h{$_} == 0;
    $h{$_} = "+$h{$_}" if $h{$_} > 0;
    $res .= "$h{$_}$_";
  }

  $res =~ s/(?<!\d)1(?=[a-z])//g;
  $res =~ s/^\+//;
  $res =~  s/[*Z]//g;
  $res =~ s/([a-z])(\1+)/ "$1^".(length($2)+1) /eg;
  $res = '0' unless $res;
  printf "%30s = %s\n", $inp, $res;
}

sub mult {
  my @a = split /\+/, $_[0]; 
  my @b = split /\+/, $_[1];
  my $result;
  foreach my $a (@a) {
    foreach my $b (@b) {
      $result .= "$a*$b+";
    }
  } 
  return '(' . substr($result,0,-1) . ')';
}

__DATA__
(a+b)(3+4+5-2*(a-2b)*3+2a-12b)
-4*(a+b)(a-3)
(x+z)(x+z)(x+z)
(x+z)^3
a+2bc-(b+c)^2+2*a
3a-(b*b+c^2)

Получается 
Код

(a+b)(3+4+5-2*(a-2b)*3+2a-12b) = 12a-4a^2-4ab+12b
                 -4*(a+b)(a-3) = 12a-4a^2-4ab+12b
               (x+z)(x+z)(x+z) = x^3+3x^2z+3xz^2+z^3
                       (x+z)^3 = x^3+3x^2z+3xz^2+z^3
             a+2bc-(b+c)^2+2*a = 3a-b^2-c^2
                  3a-(b*b+c^2) = 3a-b^2-c^2
Дальше понятно - просто сравнить.
PS Исправил код (см. ниже)

Это сообщение отредактировал(а) amg - 20.10.2007, 13:40
PM MAIL   Вверх
under_sun
Дата 19.10.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: нет
Всего: 17



amg, классное решение! smile  Особенно понравилась вот эта сторочка: 
Цитата
s/-/+M*/g;

Согласен, что довольно муторная задача. Довольно много случаев.
Цитата

Хотя, может, есть способ гораздо проще.

Может и есть, но явно не у меня с моими 190 строками кода  smile

Неправильно обработанные примеры:
Код

x(a+b(c+d)) = 1(ax+1(bc+bd))
a3 = a3


И 0 - тоже многочлен )).

p.s.
Если откровенно, у меня тоже работает не все )).



--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
amg
Дата 20.10.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Исправил свой код от ошибок, про которые сказал under_sun, уже начал было комментарии вносить и код оптимизировать, хотел даже операцию деления реализовать, потом догадался на CPAN глянуть и понял, что все это зря. Конечно же, оказалось, что символьная алгебра на perl'е давным-давно реализована, причем в полном объеме. 
PM MAIL   Вверх
tishaishii
Дата 7.11.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Есть группа менеджеров, каждый работает над группой проектов. Необходимо уровнять количество проектов у каждого менеджера так, чтобы минимально прервать связь менеджера со своими проектами.

Т.е. есть массив целых неотрицательных чисел. Находим среднее арифметическое.
Далее - проблема: если просто заполнить массив средними значениями, то получится, что смешаем все проекты и поровну раздадим их всем менеджерам, а значит гарантированно разорвём большинство связей менеджера со своими проектами. Необходимо действовать вычитанием и сложением - обменом минимальным количеством проектов между менеджерами.

Попытайся решить.
PM MAIL ICQ Skype   Вверх
ZLOvar
Дата 4.6.2009, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 4.6.2009
Где: Москва

Репутация: нет
Всего: 1



Всем привет, я тоже задачку хочу! только полегче чем верхнее))
 smile  smile  smile  smile 
--------------------
Если хочешь чтобы работало - используй написанное.Если хочешь что-то понять - пиши сам. (с)
PM MAIL WWW   Вверх
Suppir
Дата 4.6.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Вот задачка:

ЕСТЬ:
Строка $a, где-то в середине строки расположена запись даты 04.05.2007.
Дата может быть с начальными нулями и без: 04.05.2007 или 4.5.2007 или 04.5.2007.
Дата может быть любой в интервале от 01.01.1900 до "ближайшей субботы" - иначе выдавать ошибку.

НУЖНО:
Нужно в строке $b найти любое упоминание об этой дате.
В строке $b дата может быть в следующих форматах:
04.05.2007
4/5/2007 г.
04 мая 2007
4 мае 2007года
и подобные этим варианты


Это сообщение отредактировал(а) Suppir - 4.6.2009, 11:17
PM MAIL   Вверх
ZLOvar
Дата 4.6.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 4.6.2009
Где: Москва

Репутация: нет
Всего: 1



Suppir, а можно показать в коде? (мне так легче будет)
зарание спасибо)
--------------------
Если хочешь чтобы работало - используй написанное.Если хочешь что-то понять - пиши сам. (с)
PM MAIL WWW   Вверх
shamber
Дата 4.6.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



ZLOvar, вам как? Нужна задача и ее решение в одном посте ?
PM MAIL Jabber   Вверх
Suppir
Дата 4.6.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



ZLOvar, так я предлагаю вам написать решение это задачи в Perl-коде smile Или вам не понятны условия задачи?
.
1. Есть строка $a, в ней записана дата в формате 04.05.2007 (или 4.4.2007 или 04.4.2007). Нужно написать регулярное выражение, которое находит эту дату.
2. Написать условие, которое проверяет, чтобы найденная дата была в интервале от 01.01.1990 до "ближайшей субботы" (например, у этой субботы дата 06.06.2009)
3. Написать регулярное выражение, которое найдет эту же дату в следующих форматах: 
04.05.2007
4/5/2007 г.
04 мая 2007
4 мае 2007года
.
Во всех строках даты могут располагаться в любом месте (начале, середине, конце). Желательно, чтобы все эти проверки были оптимизированы - представьте, что вам нужно "прочесать" миллион строк.

Это сообщение отредактировал(а) Suppir - 4.6.2009, 12:54
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1341 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.