재현할 수 없는 문자열 비교로 인해 elsif 실패가 발생함
-
06-09-2019 - |
문제
대답하면서 이 코드 골프 질문, 답변에서 문제가 발생했습니다.
나는 이것을 테스트해왔고 IRB가 올바른 동작을 가지고 있다는 사실에도 불구하고 코드에서 이 두 가지 비교가 작동하도록 할 수도 없습니다.나 정말 여기에 도움이 필요합니다.
다음은 문제에 대한 설명이 될 코드입니다.
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
문제는 할당에서 발생합니다. negate
.
표현식 바로 앞의 문자가 대시일 때 true가 되려면 부정이 필요하지만 조건이 작동하지도 않습니다.둘 다 n == '-'
그리고 n[0] == '-'
, 인용 형식은 중요하지 않으며 매번 FALSE로 끝납니다.그러나 나는 이 정확한 비교를 사용해왔고 n == '('
매번 올바르게 작동합니다!
무슨 일이야?왜 그렇지 않습니까? n == '-'
일하다, 언제 n == '('
하다?이는 BOM, UNIX 줄 바꿈 없이 UTF-8로 인코딩됩니다.
내 코드에 무슨 문제가 있나요?
해결책
당신은:
if (s + n).match(/^(-?)[.\d]+$/) || (!chars[0].nil? && chars[0] != ' ' && n == '-')
s += n
elsif (chars[0] == '(' && n[0] == '-') || n == '('
처럼 n
항상 1문자 문자열인 경우 (chars[0] == '(' && n[0] == '-'))
가 true이면 이전 조건은 (!chars[0].nil? && chars[0] != ' ' && n == '-')
, 또한 사실일 것이다.귀하의 코드는 절대 두 번째 부분에 입력되지 않습니다. if
만약에 n[0]=='-'
.
만약 당신의 p n
줄이 대시를 출력하고 있는 경우, 해당 문자가 찾고 있는 문자와 정확히 동일한지 확인하세요. 처럼 보인다 대시.유니코드에는 다양한 종류의 대시가 있습니다. 코드나 입력에 이상한 유니코드 대시 문자가 있을 수도 있습니다.