comparaison de chaînes unreproducible, l'échec ELSIF forces
-
06-09-2019 - |
Question
En répondant à cette question de golf Code , je suis tombé sur un problème dans ma réponse .
J'ai testé et je ne peux pas même ces deux comparaisons pour travailler dans le code, en dépit du fait que la CISR a le bon comportement. I vraiment besoin d'aide ici.
Voici le code ci-dessous qui sera d'une explication du problème.
def solve_expression(expr)
chars = expr.split '' # characters of the expression
parts = [] # resulting parts
s,n = '','' # current characters
while(n = chars.shift)
if (s + n).match(/^(-?)[.\d]+$/) || (!chars[0].nil? && chars[0] != ' ' && n == '-') # only concatenate when it is part of a valid number
s += n
elsif (chars[0] == '(' && n[0] == '-') || n == '(' # begin a sub-expression
p n # to see what it breaks on, ( or -
negate = n[0] == '-'
open = 1
subExpr = ''
while(n = chars.shift)
open += 1 if n == '('
open -= 1 if n == ')'
# if the number of open parenthesis equals 0, we've run to the end of the
# expression. Make a new expression with the new string, and add it to the
# stack.
subExpr += n unless n == ')' && open == 0
break if open == 0
end
parts.push(negate ? -solve_expression(subExpr) : solve_expression(subExpr))
s = ''
elsif n.match(/[+\-\/*]/)
parts.push(n) and s = ''
else
parts.push(s) if !s.empty?
s = ''
end
end
parts.push(s) unless s.empty? # expression exits 1 character too soon.
# now for some solutions!
i = 1
a = parts[0].to_f # left-most value is will become the result
while i < parts.count
b,c = parts[i..i+1]
c = c.to_f
case b
when '+': a = a + c
when '-': a = a - c
when '*': a = a * c
when '/': a = a / c
end
i += 2
end
a
end
Le problème se produit dans l'attribution des negate
.
Je dois nier être vrai dans le cas juste avant une expression est un tableau de bord, mais la condition est même pas de travail. Les deux n == '-'
et n[0] == '-'
, sous forme de citation n'a pas d'importance, liquidation FAUX chaque fois. Et pourtant, je l'ai utilisé cette comparaison exacte et n == '('
fonctionne correctement à chaque fois!
Qu'est-ce qui se passe? Pourquoi ne pas n == '-'
travail, quand n == '('
fait? Ceci est codé en UTF-8 w / o BOM, linebreaks UNIX.
Quel est le problème avec mon code?
La solution
Vous avez:
if (s + n).match(/^(-?)[.\d]+$/) || (!chars[0].nil? && chars[0] != ' ' && n == '-')
s += n
elsif (chars[0] == '(' && n[0] == '-') || n == '('
n
est toujours une chaîne d'un caractère, si (chars[0] == '(' && n[0] == '-'))
est vrai, alors la condition précédente, (!chars[0].nil? && chars[0] != ' ' && n == '-')
, sera également vrai. Votre code ne sera jamais entrer dans la deuxième partie du if
si n[0]=='-'
.
Si votre ligne est p n
fournir en sortie un tableau de bord, assurez-vous qu'il est exactement le même caractère que vous recherchez, pas un caractère ressemble un tiret. Unicode a de nombreux types de traits, peut-être que vous avez un étrange caractère de tableau de bord unicode dans votre code ou sur votre entrée.