gpt4 book ai didi

math - 计算一串简单的数学表达式

转载 作者:行者123 更新时间:2023-12-02 00:12:01 24 4
gpt4 key购买 nike

关闭。这个问题是off-topic .它目前不接受答案。




9年前关闭。










锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。








挑战

这是挑战(我自己的发明,但如果它以前出现在网络的其他地方,我不会感到惊讶)。

Write a function that takes a single argument that is a string representation of a simple mathematical expression and evaluates it as a floating point value. A "simple expression" may include any of the following: positive or negative decimal numbers, +, -, *, /, (, ). Expressions use (normal) infix notation. Operators should be evaluated in the order they appear, i.e. not as in BODMAS, though brackets should be correctly observed, of course. The function should return the correct result for any possible expression of this form. However, the function does not have to handle malformed expressions (i.e. ones with bad syntax).

Examples of expressions:

1 + 3 / -8                            = -0.5       (No BODMAS)
2*3*4*5+99 = 219
4 * (9 - 4) / (2 * 6 - 2) + 8 = 10
1 + ((123 * 3 - 69) / 100) = 4
2.45/8.5*9.27+(5*0.0023) = 2.68...


规则

我预计这里会有某种形式的“作弊”/狡猾,所以请让我预先警告!通过作弊,我指的是 eval的使用或动态语言(如 JavaScript 或 PHP)中的等效函数,或者同样即时编译和执行代码。 (我认为我的“无 BODMAS”规范几乎可以保证这一点。)除此之外,没有任何限制。我预计这里会有一些 Regex 解决方案,但很高兴看到更多。

现在,我主要对这里的 C#/.NET 解决方案感兴趣,但任何其他语言也完全可以接受(特别是 F# 和 Python 用于功能/混合方法)。我还没有决定是否接受最短或最巧妙的解决方案(至少对于语言而言)作为答案,但我欢迎 任何语言的任何形式的解决方案 ,除了我上面刚刚禁止的!

我的解决方案

我现在已经发布了我的 C# 解决方案 here (403 个字符)。 更新: My new solution 上大大击败了旧的294 个字符 ,在一些可爱的正则表达式的帮助下!我怀疑这会很容易被一些语法较轻的语言(特别是函数/动态语言)打败,并且已经被证明是正确的,但我很好奇是否有人仍然可以在 C# 中击败它。

更新

我已经看到了一些非常狡猾的解决方案。感谢所有发帖的人。尽管我还没有测试过它们中的任何一个,但我会相信人们并假设他们至少可以使用所有给定的示例。

只是为了说明,重入(即线程安全)不是该功能的要求,尽管它是一个奖励。

格式

为了便于比较,请按以下格式发布所有答案:

Language

Number of characters: ???

Fully obfuscated function:

(code here)

Clear/semi-obfuscated function:

(code here)

Any notes on the algorithm/clever shortcuts it takes.

最佳答案

Perl(无评估)

字符数:167 106 (有关 106 个字符的版本,请参见下文)

完全混淆的功能:(如果将这三行合二为一,则为 167 个字符)

sub e{my$_="($_[0])";s/\s//g;$n=q"(-?\d++(\.\d+)?+)";
@a=(sub{$1},1,sub{$3*$6},sub{$3+$6},4,sub{$3-$6},6,sub{$3/$6});
while(s:\($n\)|(?<=\()$n(.)$n:$a[7&ord$5]():e){}$_}

清除/去混淆版本:
sub e {
my $_ = "($_[0])";
s/\s//g;
$n=q"(-?\d++(\.\d+)?+)"; # a regex for "number", including capturing groups
# q"foo" in perl means the same as 'foo'
# Note the use of ++ and ?+ to tell perl
# "no backtracking"

@a=(sub{$1}, # 0 - no operator found
1, # placeholder
sub{$3*$6}, # 2 - ord('*') = 052
sub{$3+$6}, # 3 - ord('+') = 053
4, # placeholder
sub{$3-$6}, # 5 - ord('-') = 055
6, # placeholder
sub{$3/$6}); # 7 - ord('/') = 057

# The (?<=... bit means "find a NUM WHATEVER NUM sequence that happens
# immediately after a left paren", without including the left
# paren. The while loop repeatedly replaces "(" NUM WHATEVER NUM with
# "(" RESULT and "(" NUM ")" with NUM. The while loop keeps going
# so long as those replacements can be made.

while(s:\($n\)|(?<=\()$n(.)$n:$a[7&ord$5]():e){}

# A perl function returns the value of the last statement
$_
}

我最初误读了规则,所以我提交了一个带有“eval”的版本。这是一个没有它的版本。

当我意识到 + 的字符代码中的最后一个八进制数字时,我有了最新的见解。 , - , / , 和 *是不同的,那 ord(undef)是 0。这让我可以设置调度表 @a作为数组,只需调用位置 7 & ord($3) 处的代码.

有一个明显的地方可以再剃一个字符 - 更改 q""进入 '' - 但这会使剪切和粘贴到 shell 中变得更加困难。

更短

字符数:124 106

通过 ephemient 进行编辑考虑到,现在减少到 124 个字符:(将两行合二为一)
sub e{$_=$_[0];s/\s//g;$n=q"(-?\d++(\.\d+)?+)";
1while s:\($n\)|$n(.)$n:($1,1,$3*$6,$3+$6,4,$3-$6,6,$6&&$3/$6)[7&ord$5]:e;$_}

更短

字符数:110 106

下面的 ruby​​ 解决方案让我更进一步,尽管我无法达到它的 104 个字符:
sub e{($_)=@_;$n='( *-?[.\d]++ *)';
s:\($n\)|$n(.)$n:(($1,$2-$4,$4&&$2/$4,$2*$4,$2+$4)x9)[.8*ord$3]:e?e($_):$_}

我不得不屈服并使用 '' .那颗 ruby send技巧对这个问题非常有用。

从石头中挤出水

字符数:106

一个小的扭曲,以避免被零除检查。
sub e{($_)=@_;$n='( *-?[.\d]++ *)';
s:\($n\)|$n(.)$n:($1,0,$2*$4,$2+$4,0,$2-$4)[7&ord$3]//$2/$4:e?e($_):$_}

这是此功能的测试工具:
perl -le 'sub e{($_)=@_;$n='\''( *-?[.\d]++ *)'\'';s:\($n\)|$n(.)$n:($1,0,$2*$4,$2+$4,0,$2-$4)[7&ord$3]//$2/$4:e?e($_):$_}' -e 'print e($_) for @ARGV' '1 + 3' '1 + ((123 * 3 - 69) / 100)' '4 * (9 - 4) / (2 * 6 - 2) + 8' '2*3*4*5+99' '2.45/8.5*9.27+(5*0.0023) ' '1 + 3 / -8'

关于math - 计算一串简单的数学表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/928563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com