Frage

Bei der Beantwortung href="https://stackoverflow.com/questions/928563/code-golf-evaluating-mathematical-expressions">, lief ich über ein Problem in meiner Antwort .

Ich habe die Prüfung dieses, und ich kann nicht einmal diese beiden Vergleiche in dem Code zu arbeiten, trotz der Tatsache, dass IRB das richtige Verhalten. I wirklich benötige Hilfe hier.

Hier ist der Code, unter dem eine Erläuterung des Problems sein.

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

Das Problem tritt bei der Zuordnung von negate.

ich verneinen muß um wahr zu sein, wenn das Zeichen unmittelbar vor einem Ausdruck ein Strich ist, aber der Zustand nicht einmal funktioniert. Sowohl n == '-' und n[0] == '-', die Form des Zitats keine Rolle spielt, aufzuwickeln FALSCH jedes Mal. Doch ich habe mit genau dieses Vergleichs und n == '(' funktioniert richtig jedes Mal!

Was ist hier los? Warum n == '-' nicht funktioniert, wenn n == '(' tut? Dies wird codiert in UTF-8 w / o BOM, UNIX Zeilenumbrüchen.

Was ist mit meinem Code falsch?

War es hilfreich?

Lösung

Sie haben:

if (s + n).match(/^(-?)[.\d]+$/) || (!chars[0].nil? && chars[0] != ' ' && n == '-')
      s += n
elsif (chars[0] == '(' && n[0] == '-') || n == '('

Wie n ist immer eine Eins-Zeichenkette, wenn (chars[0] == '(' && n[0] == '-')) wahr ist, dann die vorherige Bedingung, (!chars[0].nil? && chars[0] != ' ' && n == '-') wird auch wahr sein. Ihr Code wird nie den zweiten Teil des if wenn n[0]=='-' eingeben.

Wenn Sie Ihre p n Leitung einen Strich ausgibt, sicher sein, es ist genau das gleiche Zeichen, das Sie suchen, nicht irgendein Zeichen, dass sieht aus wie ein Bindestrich. Unicode hat viele Arten von Strichen, vielleicht haben Sie ein seltsames Unicode-Strichzeichen im Code oder auf Ihrer Eingabe.

scroll top