这是挑战(我自己的发明,但如果以前出现在网络的其他地方,我不会感到惊讶).
编写一个函数,该函数采用单个参数,该参数是简单数学表达式的字符串表示形式,并将其作为浮点值进行计算."简单表达"可以包括以下任何一种:正十进制数或负十进制数,+,-,*,/,(,).表达式使用(正常)中缀表示法.操作员应按其出现的顺序进行评估,即不像在BODMAS中那样进行 评估,但当然应该正确观察括号.该函数应该为此表单的任何可能表达式返回正确的结果.但是,该函数不必处理格式错误的表达式(即语法错误的表达式).
表达的例子:
Run Code Online (Sandbox Code Playgroud)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#解决方案(403个字符).更新: …
我想知道是否有一种方法可以使用2个堆栈在单个传递中解决中缀表达式?堆栈可以是一个用于操作员,另一个用于操作数...
通过分流码算法求解的标准方法是将中缀表达式转换为后缀(反向抛光)然后求解.我不想先将表达式转换为postfix.
如果表达式2*3-(6+5)+8如何,如何解决?
一个是另一个最好的做法吗?我一直在阅读Odersky等人的 Scala书.似乎infix用于很多Collections API函数,而dot则保留给程序员定义的函数.
我有一个关联操作>>.问题是它的成本线性地取决于其左操作数的大小.所以由一系列类似的n应用程序形成的表达式>>
a >> a >> a >> a >> a >> ... >> a
Run Code Online (Sandbox Code Playgroud)
它具有二次成本n,因为默认中缀运算符是左关联的.如何使它成为右关联,以便这样的表达式的成本保持线性n?
我正在尝试使用Python/Pandas(作为学习练习)粗略地复制R中的dplyr包.我坚持的是"管道"功能.
在R/dplyr中,这是使用管道运算符完成的%>%,其中x %>% f(y)相当于f(x, y).如果可能,我想使用中缀语法复制它(参见此处).
为了说明,请考虑以下两个功能.
import pandas as pd
def select(df, *args):
cols = [x for x in args]
df = df[cols]
return df
def rename(df, **kwargs):
for name, value in kwargs.items():
df = df.rename(columns={'%s' % name: '%s' % value})
return df
Run Code Online (Sandbox Code Playgroud)
第一个函数采用数据帧并仅返回给定的列.第二个采用数据帧,并重命名给定的列.例如:
d = {'one' : [1., 2., 3., 4., 4.],
'two' : [4., 3., 2., 1., 3.]}
df = pd.DataFrame(d)
# Keep only the 'one' column.
df …Run Code Online (Sandbox Code Playgroud) 长话短说我的讲师很废话,并且通过高架投影仪向我们展示了中缀,并且他的巨大阴影阻挡了一切,所以我错过了重要的东西
他指的是push和pop,push = 0 pop = x
他举了一个例子,但我看不出他是如何得到答案的,
2*3/(2-1)+5*(4-1)
Run Code Online (Sandbox Code Playgroud)
第1步反向: )1-4(*5+)1-2(/3*2好的,我可以看到
然后他继续编写x和o的操作,我完全迷失了
回答14-5*12-32*/+然后再次逆转得到+/*23-21*5-41
如果有人可以向我解释推送流行音,那么我可以理解我会非常感激,我已经在网上看了很多东西我发现似乎比这更好了,所以我真的需要先了解一下这里
我们f x y = x * y.我们可以通过两种方式应用此函数:f 5 6或者,使用中缀表示法5 `f` 6.运算符规则是否适用于最后一个表达式?这个应用程序有什么优先权?它只是另一种形式的功能应用程序,它也具有最高优先级吗?
我想编译器会看到这种特殊形式(由于``和/或名称以字母(?)开头),并且实际上将其视为普通函数应用程序,而不是将其视为运算符.
haskell function operators infix-notation operator-precedence
在 APL 中有幂运算符?,如果将其应用于函数,则会f叠加f. 如何在 Raku 中实现该运算符?
例如,使用以下定义f:
sub f(Int:D $i){ $i + 1 }
Run Code Online (Sandbox Code Playgroud)
该命令say (f ? 4)(10);应等效于say f(f(f(f(10))));.
我在下面的实现是针对一个带有一个参数的函数。
如何使用适用于多个(或任何)签名的更好的实现来扩展或替换它?
如何定义该新电力运营商的“高优先级”?
有没有更好的方法来定义“身份函数”结果f ? 0?
这是 APL 的描述?:
“Power Operator”。
(?是一个“带两个点的星星”,或者更正式的“Apl 功能符号 Star Diaeresis”。)
这是一个实现的尝试:
sub infix:<?>( &func, Int:D $times where $times >= 0 ) {
if $times == 0 {
sub func2($d) {$d}
} else …Run Code Online (Sandbox Code Playgroud) 我对Scala编程语言很陌生,在我在这里讲课时,正在尝试一些困扰我的想法.
我想我无法理解cons运算符是如何工作的,这里有一些我尝试过的东西:
我创建了一个伪随机数生成器,然后尝试创建一个随机值的列表:
scala> val gen = new java.util.Random
gen: java.util.Random = java.util.Random@1b27332
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
Run Code Online (Sandbox Code Playgroud)
但它试图将List(3)传递给nextnt方法.当我使用paratheses时,没有问题
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
Run Code Online (Sandbox Code Playgroud)
我对执行顺序感到好奇,所以我创建了一个检查它的函数
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
如输出中所示,执行顺序与外观顺序相同.然后我认为它可能是关于'nextInt'功能,然后我尝试了以下:
scala> 1 + …Run Code Online (Sandbox Code Playgroud) C的一个怪异角落案例是函数可以在其他函数中声明,例如
void foo(void)
{
void bar(void); // Behaves as if this was written above void foo(void)
bar();
}
Run Code Online (Sandbox Code Playgroud)
这已经贯彻到C++,至少对于大多数功能而言.如果有问题的函数恰好被称为operator ==,Clang似乎不会识别该模式.
struct foo
{
int value;
};
struct bar
{
foo value;
};
bool wot(const bar &x, const bar &y)
{
bool eq(const foo &, const foo &); // Declare function eq
bool operator==(const foo &, const foo &); // Declare function operator==
bool func = eq(x.value, y.value); // This line compiles fine
bool call = operator==(x.value, y.value); // Also OK …Run Code Online (Sandbox Code Playgroud) infix-notation ×10
scala ×3
stack ×2
apl ×1
associative ×1
c++ ×1
call ×1
clang ×1
code-golf ×1
cons ×1
function ×1
haskell ×1
list ×1
math ×1
methods ×1
name-lookup ×1
operators ×1
parsing ×1
pipeline ×1
python ×1
raku ×1
terminology ×1
text-parsing ×1