[Moscow.pm] (без темы)

Ruslan Zakirov ruz на bestpractical.com
Пн Апр 29 09:12:13 PDT 2013


2013/4/29 Andrew Shulga <pcontrol на mail.ru>

> Добрый день!
>
> Для  собственных  нужд понадобилось сделать кулькулятор молярной массы
> элементов.   Пример:   Cа2O5(NO2(HO)3)2    заранее  известен  вес  каждого
> элемента Са=40, О=16, N=14, H=1. В числовом виде формула будет такая:
> 40*2+16*5+(14+16*2+(1+16)*3)*2
> Итоговое значение элементов:
> Ca=80
> O=240
> N=28
> H=6
>
> Не  могу  придумать  алгоритм  для  подсчета  количества  элементов  в
> формуле. Подскажите кто-нибудь.
>
>

$ perl -E 'my $s = "Ca2O5(NO2(HO)3)2"; my %h = (Ca =>40, O=>16, N => 14, H
=>1); $e = join "|", keys %h; $s =~ s/($e|[0-9]+|\()/ my $res = ""; $res .=
pos($s)>0 && substr($s,pos($s)-1, 1) ne "("? $h{$1} || $1 eq "("? "+" : "*"
: ""; $res .= $h{$1} || $1; $res /ge; say $s; say eval "$s"'

40*2+16*5+(14+16*2+(1+16)*3)*2
354

$ perl -E 'package Boo; use overload "+" => sub { my $r = bless { }, "Boo";
$r->{$_} = $_[0]{$_}+$_[1]{$_} foreach keys %{$_[0]}, keys %{$_[1]}; $r },
"*" => sub { $_ *= $_[1] foreach values %{$_[0]}; $_[0] }; package main;
sub boo { bless { $_[0] => 1 }, "Boo" }; my $s = "Ca2O5(NO2(HO)3)2"; my %h
= (Ca =>40, O=>16, N => 14, H =>1); $e = join "|", keys %h; $s =~
s/($e|[0-9]+|\()/ my $res = ""; $res .= pos($s)>0 && substr($s,pos($s)-1,
1) ne "("? $h{$1} || $1 eq "("? "+" : "*" : ""; $res .= $h{$1}?
"boo(\"$1\")" : $1; $res /ge; say $s; use Data::Dumper; say Dumper eval
"$s"'

boo("Ca")*2+boo("O")*5+(boo("N")+boo("O")*2+(boo("H")+boo("O"))*3)*2
$VAR1 = bless( {
                 'H' => '6',
                 'O' => 15,
                 'N' => '2',
                 'Ca' => '2'
               }, 'Boo' );




>
>
>
>
>
>
> --
> С уважением,
> Andrew
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Best regards, Ruslan.
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20130429/436eb63a/attachment-0001.html>


Подробная информация о списке рассылки Moscow-pm