标签: infix-notation

评估一串简单的数学表达式

挑战

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

编写一个函数,该函数采用单个参数,该参数是简单数学表达式的字符串表示形式,并将其作为浮点值进行计算."简单表达"可以包括以下任何一种:正十进制数或负十进制数,+,-,*,/,(,).表达式使用(正常)中缀表示法.操作员应按其出现的顺序进行评估,即不像BODMAS中那样进行 评估,但当然应该正确观察括号.该函数应该为此表单的任何可能表达式返回正确的结果.但是,该函数不必处理格式错误的表达式(即语法错误的表达式).

表达的例子:

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...
Run Code Online (Sandbox Code Playgroud)

规则

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

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

我的解决方案

我现在在这里发布了我的C#解决方案(403个字符).更新: …

math parsing code-golf infix-notation text-parsing

76
推荐指数
21
解决办法
1万
查看次数

如何使用堆栈在一次扫描中评估中缀表达式?

我想知道是否有一种方法可以使用2个堆栈在单个传递中解决中缀表达式?堆栈可以是一个用于操作员,另一个用于操作数...

通过分流码算法求解的标准方法是将中缀表达式转换为后缀(反向抛光)然后求解.我不想先将表达式转换为postfix.

如果表达式2*3-(6+5)+8如何,如何解决?

stack infix-notation

45
推荐指数
1
解决办法
6万
查看次数

Scala - 中缀vs点符号

一个是另一个最好的做法吗?我一直在阅读Odersky等人 Scala书.似乎infix用于很多Collections API函数,而dot则保留给程序员定义的函数.

methods scala call infix-notation

38
推荐指数
2
解决办法
1万
查看次数

如何建立一个右关联中缀运算符?

我有一个关联操作>>.问题是它的成本线性地取决于其左操作数的大小.所以由一系列类似的n应用程序形成的表达式>>

a >> a >> a >> a >> a >> ... >> a
Run Code Online (Sandbox Code Playgroud)

它具有二次成本n,因为默认中缀运算符是左关联的.如何使它成为右关联,以便这样的表达式的成本保持线性n

scala associative infix-notation

31
推荐指数
1
解决办法
6642
查看次数

使用Python中缀语法将"管道"输出从一个函数输出到另一个函数

我正在尝试使用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)

python pipeline infix-notation

25
推荐指数
4
解决办法
1万
查看次数

Push和Pop对Stacks意味着什么?

长话短说我的讲师很废话,并且通过高架投影仪向我们展示了中缀,并且他的巨大阴影阻挡了一切,所以我错过了重要的东西

他指的是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

如果有人可以向我解释推送流行音,那么我可以理解我会非常感激,我已经在网上看了很多东西我发现似乎比这更好了,所以我真的需要先了解一下这里

stack terminology infix-notation

24
推荐指数
4
解决办法
12万
查看次数

Haskell中缀函数应用程序优先级

我们f x y = x * y.我们可以通过两种方式应用此函数:f 5 6或者,使用中缀表示法5 `f` 6.运算符规则是否适用于最后一个表达式?这个应用程序有什么优先权?它只是另一种形式的功能应用程序,它也具有最高优先级吗?

我想编译器会看到这种特殊形式(由于``和/或名称以字母(?)开头),并且实际上将其视为普通函数应用程序,而不是将其视为运算符.

haskell function operators infix-notation operator-precedence

24
推荐指数
2
解决办法
1万
查看次数

Raku 中函数对象“power”运算符的实现

在 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))));.

我在下面的实现是针对一个带有一个参数的函数。

问题

  1. 如何使用适用于多个(或任何)签名的更好的实现来扩展或替换它?

  2. 如何定义该新电力运营商的“高优先级”?

  3. 有没有更好的方法来定义“身份函数”结果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)

infix-notation apl raku

22
推荐指数
2
解决办法
347
查看次数

了解Scala中的中缀方法调用和cons运算符(::)

我对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)

scala list infix-notation cons operator-keyword

19
推荐指数
1
解决办法
1万
查看次数

无法在函数内声明运算符.Clang bug或spec?

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)

c++ infix-notation clang language-lawyer name-lookup

19
推荐指数
1
解决办法
237
查看次数