Irriproducibili confronto di stringhe, le forze ELSIF fallimento
-
06-09-2019 - |
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?
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.