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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top