Domanda

Nel rispondere a questo codice domanda di golf , mi sono imbattuto in un problema nella mia risposta .

ho provato questo e non riesco nemmeno a ottenere questi due confronti per lavorare nel codice, nonostante il fatto che IRB ha il giusto comportamento. I davvero bisogno di aiuto qui.

Ecco il codice, di seguito che sarà una spiegazione 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

Il problema si verifica nell'assegnazione delle negate.

Ho bisogno negare per essere vero quando il personaggio poco prima di un'espressione è un trattino, ma la condizione non è ancora lavorando. Sia n == '-' e n[0] == '-', sotto forma di citazione non importa, finiscono FALSE ogni volta. Eppure, ho usato questo confronto esatto e n == '(' funziona correttamente ogni volta!

Che cosa sta succedendo? Perché non n == '-' lavoro, quando n == '(' fa? Questo è codificato in UTF-8 w / o BOM, a capo UNIX.

Cosa c'è di sbagliato con il mio codice?

È stato utile?

Soluzione

Hai:

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

Come n è sempre una stringa di un carattere, se (chars[0] == '(' && n[0] == '-')) è vero, allora la condizione precedente, (!chars[0].nil? && chars[0] != ' ' && n == '-'), sarà anche vero. Il tuo codice non potrà mai entrare nella seconda parte del if se n[0]=='-'.

Se la linea p n è l'output di un trattino, assicurarsi che sia esattamente lo stesso personaggio che stai cercando, non un personaggio che si presenta come un trattino. Unicode ha molti tipi di tratto, forse hai un personaggio strano unicode trattino nel codice o sul vostro ingresso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top