这是挑战(我自己的发明,但如果以前出现在网络的其他地方,我不会感到惊讶).
编写一个函数,该函数采用单个参数,该参数是简单数学表达式的字符串表示形式,并将其作为浮点值进行计算."简单表达"可以包括以下任何一种:正十进制数或负十进制数,+,-,*,/,(,).表达式使用(正常)中缀表示法.操作员应按其出现的顺序进行评估,即不像在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个字符).更新: …
按字符计数的最短代码,用于从输入字符串生成波形.
通过提升(第1行)较高字符并使(第1行)降低较低字符来生成波.相等的字符保持在同一行(没有提升或降级).
输入仅由小写字符和数字组成,字母被认为高于数字.
Input:
1234567890qwertyuiopasdfghjklzxcvbnm
Output:
z
l x v n
k c b m
j
h
g
y p s f
t u o a d
w r i
9 q e
8 0
7
6
5
4
3
2
1
Input:
31415926535897932384626433832795028841971693993751058209749445923078164062862
Output:
9 9 8 6 6
9 6 8 7 3 3 4 2 4 8 9 88
3 4 5 2 5 5 2 33 3 7 5 2 4 9 9 99 …Run Code Online (Sandbox Code Playgroud) (编辑:什么是Code Golf:Code Golf是用你喜欢的任何语言按字符数最短的代码解决特定问题的挑战. 更多关于Meta StackOverflow的信息.)
Code Golfers,这是对字符串操作的挑战.
电子邮件地址验证,但当然没有正则表达式(或类似的解析库).这不是关于电子邮件地址,而是你可以写下下面给出的不同字符串操作和约束的时间.
规则如下(是的,我知道,这不符合RFC,但这些将成为此挑战的5条规则):
在@之前,该组中至少有1个字符:
A-Z, a-z, 0-9, . (period), _ (underscore)
Run Code Online (Sandbox Code Playgroud)@必须存在,恰好一次
john@smith.com
^
Run Code Online (Sandbox Code Playgroud)句点(.)必须在@之后恰好存在一次
john@smith.com
^
Run Code Online (Sandbox Code Playgroud)@和以下之间至少有1个[AZ,az]字符.(期)
john@s.com
^
Run Code Online (Sandbox Code Playgroud)决赛后至少2个[AZ,az]字符.期
john@smith.ab
^^
Run Code Online (Sandbox Code Playgroud)请发布方法/函数,这将采用字符串(建议的电子邮件地址),然后返回布尔结果(true/false),具体取决于有效的电子邮件地址(true)或无效(false).
Samples:
b@w.org (valid/true) @w.org (invalid/false)
b@c@d.org (invalid/false) test@org (invalid/false)
test@%.org (invalid/false) s%p@m.org (invalid/false)
j_r@x.c.il (invalid/false) j_r@x.mil (valid/true)
r..t@x.tw (valid/true) foo@a%.com (invalid/false)
Run Code Online (Sandbox Code Playgroud)
祝好运!
这是一个面试问题我对它的解决方案感到困惑,我认为我需要堆栈来推送和弹出这些运算符和操作数,但是我需要两个堆栈,一个用于运算符,一个用于操作数?或者只是一个堆栈吗?我认为我们需要两个堆栈但是有没有办法解决使用一个堆栈?
我也有点困惑,这将如何工作,每次我得到一个运算符我会弹出我的两个最顶层的操作数并将结果推入操作数堆栈
preferance首先是括号,然后是divide,multioply和last减法然后加法
但是如何检查何时弹出两个操作数并进行必要的关节操作?
好吧,我想在文本文件中有一个这样的字符串:
((( var1 AND var2 AND var3) OR var4) AND ((var5 OR var6) AND var7))
Run Code Online (Sandbox Code Playgroud)
在将其解析为c程序并处理并正确设置变量之后,它将最终看起来像这样:
((( 1 AND 0 AND 0) OR 1) AND ((0 OR 1) AND 1))
Run Code Online (Sandbox Code Playgroud)
是否有任何有用的库用于评估表示为这样的一个字符串的表达式?我以为我可以用字符串作为参数调用一个perl程序,它可以很容易地返回结果,但不确定C中是否有一个库可以做到这一点,或者是否有任何已知的算法可以解决这样的表达?
编辑:我实际上正在寻找的东西会吐出这个表达的答案,也许解析是一个坏词.即1或0
在一个坚果壳中,它包含一堆随机表达式(已知是正确的格式),需要被评估为0或1.(上面计算结果为1,因为它导致(1和1).
实现python程序的最佳方法是采用字符串并根据运算符优先级输出结果(例如:"4 + 3*5"将输出19).我已经搜索了解决这个问题的方法,但它们太复杂了,我正在寻找一个(相对)简单的问题.
澄清:我需要比eval()略高一些的东西 - 我希望能够添加其他运算符(例如最大运算符 - 4 $ 2 = 4),或者,我对此在学术上比对专业更感兴趣 - 我想要知道怎么做.
这不是学校作业或任何事情,但我意识到这是一个主要的学术问题.但是,我一直在努力做的是解析"数学"文本并提出答案.
例如 - 我可以弄清楚如何解析'5 + 5'或'3*5' - 但是当我尝试正确地将操作链接在一起时我失败了.
(5 + 5)*3
这大多只是让我烦恼,我无法弄明白.如果有人能指出我的方向,我真的很感激.
编辑 感谢您的所有快速回复.对不起,我没有更好地解释.
首先 - 我没有使用正则表达式.我也知道已有的库可以作为字符串使用数学表达式并返回正确的值.所以,我主要是看着这个,因为,遗憾的是,我并没有"明白".
第二 - 我尝试过的事情(可能是误入歧途),但我在计算'('和')'并首先评估最深的项目.在简单的例子中,这有效; 但我的代码不漂亮,更复杂的东西崩溃.当我'计算'最低级别时,我正在修改字符串.
所以...(5 + 5)*3
会变成10*3
然后评估为30
但它感觉"错了".
我希望这有助于澄清事情.我肯定会查看提供的链接.
嗯,这是语言不可知的,我更喜欢用C#或F#来做,但是这次我更感兴趣的是"无论如何这样做".
我想要完成的是:
a)我想学习它 - 这次是关于我的自我,这是一个有趣的项目,我想向自己展示我对这个东西非常擅长
b)我对EBNF知之甚少(虽然我还不知道,运算符优先级如何在EBNF中起作用 - Irony.NET做得对,我查看了这些例子,但这对我来说有点不祥)
c)我的解析器应该能够这样:5*(3 +(2 - 9*(5/7))+ 9)例如,给我正确的结果
d)坦率地说,这似乎是为我编写编译器甚至是解释器的最大问题.我甚至可以生成64位汇编代码(我可以手动编写汇编程序),但公式解析器...
e)另一种想法:即使是简单的计算机(比如我的旧款Sharp 1246S只有大约2kB的RAM)也能做到这一点......它不会那么难,对吧?甚至非常非常古老的编程语言都有公式评估... BASIC是从1964年开始的,他们已经可以计算出我所提出的公式类型作为例子
f)一些想法,一些灵感就足够了 - 我根本不知道如何做运算符优先级和括号 - 但是,我知道它涉及AST并且许多人使用堆栈
所以你怎么看?
language-agnostic compiler-construction parsing interpreter formula
我需要一种方法来将一个方程式作为一个字符串给出并找到它的数学答案,最大的警告是我不能使用eval().
我知道方程只会包含数字,四个数学运算符(即*/+ - )和括号,它可能在字符串中有空格,也可能没有空格.这里有几个例子.
4 * 4
4+6/3
(3 / 2)*(4+8)
(4+8) * 2
Run Code Online (Sandbox Code Playgroud)
我猜这是必须要用某种正则表达式完成的?
parsing ×4
code-golf ×3
math ×3
c ×2
expression ×2
.net ×1
c# ×1
c++ ×1
eval ×1
evaluate ×1
evaluation ×1
formula ×1
interpreter ×1
php ×1
python ×1
regex ×1
text-parsing ×1