Pregunta

este código de golf , me encontré con un problema en mi respuesta .

He estado probando esto y ni siquiera puedo conseguir estas dos comparaciones para trabajar en el código, a pesar del hecho de que el IRB tiene el comportamiento correcto. I realmente necesitan un poco de ayuda aquí.

Este es el código, a continuación de que habrá una explicación del problema.

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

El problema se produce en la asignación de negate.

Necesito negar que es verdad cuando el personaje justo antes de una expresión es un guión, pero la condición no es ni siquiera trabajando. Tanto n == '-' y n[0] == '-', la forma de la cita no importa, terminan FALSO cada vez. Sin embargo, he estado usando esta comparación exacta y n == '(' funciona correctamente cada vez!

¿Qué está pasando? ¿Por qué no n == '-' trabajo, cuando n == '(' hace? Este está codificado en UTF-8 w / o lista de materiales, saltos de línea UNIX.

¿Qué hay de malo en mi código?

¿Fue útil?

Solución

Usted tiene:

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

Como n es siempre una cadena de un caracter, si (chars[0] == '(' && n[0] == '-')) es cierto, entonces la condición anterior, (!chars[0].nil? && chars[0] != ' ' && n == '-'), también es cierto. Su código, no entrará en la segunda parte de la if si n[0]=='-'.

Si su línea p n está emitiendo un guión, asegúrese de que es exactamente el mismo carácter que está buscando, no un personaje que ve como un guión. Unicode tiene muchos tipos de guiones, tal vez usted tiene un carácter Unicode tablero raro en el código o en su entrada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top