LOLimAcat
2021-09-14T14:35:15+00:00
比如2*(3+5.2/(1-6.5)),这种,不管用什么语言,只要不用eval()类似的系统函数就可以
这应该是什么学历的编程水平,初中、高中、大专、本科几年?
我写了个perl的示例,看看大家觉得这个能过关吗 scalar=python的length, 理论上可以无压力转为python代码
这应该是什么学历的编程水平,初中、高中、大专、本科几年?
我写了个perl的示例,看看大家觉得这个能过关吗 scalar=python的length, 理论上可以无压力转为python代码
展开代码 ...
use strict; use warnings;
use 5.010;
# 计算带括号的四则表达式
sub say_ar{
# 打印数组
return join(',', @_);
}
sub orphan{
my @elems = @_;
# 返回单个数值
my @nums = ();
my $prefix = 1;
my $divide = 0; # 除法开关
for (my $i = 0; $i < scalar(@elems); $i++){
my $cur = $elems[$i];
if ($cur eq '+'){
push(@nums, $prefix);
$prefix = 1;
$divide = 0;
} elsif ($cur eq '-'){
push(@nums, $prefix);
$prefix = -1;
$divide = 0;
} elsif ($cur eq '*'){
$divide = 0;
} elsif ($cur eq '/'){
$divide = 1;
} else {
if ($divide == 0) {
$prefix = $prefix*$cur; # 转数值
} else {
$prefix = $prefix/$cur;
$divide = 0;
}
}
}
push(@nums, $prefix);
# say join(',', @nums);
my $sum = 0;
for (my $j = 0; $j < scalar(@nums); $j++){
$sum = $sum + $nums[$j];
}
# say 'orphan get '.say_ar(@elems).' return '.$sum;
return $sum;
}
sub scan{
my $fm = shift;
my @chars = split(//, $fm);
my @syms = ();
my $digit = 0;
my $num = 0;
my $num_editing = 0;
my @fm_curs = ();
for (my $i = 0; $i < scalar(@chars); $i++){
# say 'i = '.$i.'char = '.$chars[$i].' syms = '.say_ar(@syms);
my $cur = $chars[$i];
if ($cur eq '('){
push(@fm_curs, scalar(@syms));
$num_editing = 0;
} elsif ($cur eq ')'){
my $fm_cur = pop(@fm_curs);
# say 'fm_cur = '.$fm_cur;
my @temp_syms = ();
my $syms_len = scalar(@syms);
for (my $j = $fm_cur; $j < $syms_len; $j++){
push(@temp_syms, $syms[$j]);
}
if ($num_editing == 1){
push(@temp_syms, $num);
$num_editing = 0;
}
my $res = orphan(@temp_syms);
for (my $j = 1; $j <= ($syms_len - $fm_cur); $j++){
pop(@syms);
}
push(@syms, $res);
$num = 0;
} elsif ($cur eq '+' || $cur eq '-' || $cur eq '*' ||$cur eq '/') {
if ($num_editing == 1){
push(@syms, $num); $num = 0; $num_editing = 0;
}
$digit = 0;
push(@syms, $cur);
} elsif ($cur eq '.'){
$digit = 1;
} else {
# 数值
if ($digit == 0){
$num = $num*10+$cur;
} else {
$num = $num +0.1**$digit*$cur;
$digit++;
}
$num_editing = 1;
# say 'get num='.$num;
}
}
if ($num_editing == 1){
push(@syms, $num);
}
my $final = orphan(@syms);
return $final;
}
my @list = ('1.5', '+', '2', '*', '3');
my $ufm = '1.5+2*3';
$ufm = '2*(3+5.2/(1-6.5))';
$ufm = '(1/3+1/2)*11/20'; # 0.4583
#$ufm = '11/20';
print scan($ufm);
use 5.010;
# 计算带括号的四则表达式
sub say_ar{
# 打印数组
return join(',', @_);
}
sub orphan{
my @elems = @_;
# 返回单个数值
my @nums = ();
my $prefix = 1;
my $divide = 0; # 除法开关
for (my $i = 0; $i < scalar(@elems); $i++){
my $cur = $elems[$i];
if ($cur eq '+'){
push(@nums, $prefix);
$prefix = 1;
$divide = 0;
} elsif ($cur eq '-'){
push(@nums, $prefix);
$prefix = -1;
$divide = 0;
} elsif ($cur eq '*'){
$divide = 0;
} elsif ($cur eq '/'){
$divide = 1;
} else {
if ($divide == 0) {
$prefix = $prefix*$cur; # 转数值
} else {
$prefix = $prefix/$cur;
$divide = 0;
}
}
}
push(@nums, $prefix);
# say join(',', @nums);
my $sum = 0;
for (my $j = 0; $j < scalar(@nums); $j++){
$sum = $sum + $nums[$j];
}
# say 'orphan get '.say_ar(@elems).' return '.$sum;
return $sum;
}
sub scan{
my $fm = shift;
my @chars = split(//, $fm);
my @syms = ();
my $digit = 0;
my $num = 0;
my $num_editing = 0;
my @fm_curs = ();
for (my $i = 0; $i < scalar(@chars); $i++){
# say 'i = '.$i.'char = '.$chars[$i].' syms = '.say_ar(@syms);
my $cur = $chars[$i];
if ($cur eq '('){
push(@fm_curs, scalar(@syms));
$num_editing = 0;
} elsif ($cur eq ')'){
my $fm_cur = pop(@fm_curs);
# say 'fm_cur = '.$fm_cur;
my @temp_syms = ();
my $syms_len = scalar(@syms);
for (my $j = $fm_cur; $j < $syms_len; $j++){
push(@temp_syms, $syms[$j]);
}
if ($num_editing == 1){
push(@temp_syms, $num);
$num_editing = 0;
}
my $res = orphan(@temp_syms);
for (my $j = 1; $j <= ($syms_len - $fm_cur); $j++){
pop(@syms);
}
push(@syms, $res);
$num = 0;
} elsif ($cur eq '+' || $cur eq '-' || $cur eq '*' ||$cur eq '/') {
if ($num_editing == 1){
push(@syms, $num); $num = 0; $num_editing = 0;
}
$digit = 0;
push(@syms, $cur);
} elsif ($cur eq '.'){
$digit = 1;
} else {
# 数值
if ($digit == 0){
$num = $num*10+$cur;
} else {
$num = $num +0.1**$digit*$cur;
$digit++;
}
$num_editing = 1;
# say 'get num='.$num;
}
}
if ($num_editing == 1){
push(@syms, $num);
}
my $final = orphan(@syms);
return $final;
}
my @list = ('1.5', '+', '2', '*', '3');
my $ufm = '1.5+2*3';
$ufm = '2*(3+5.2/(1-6.5))';
$ufm = '(1/3+1/2)*11/20'; # 0.4583
#$ufm = '11/20';
print scan($ufm);