문제

대답하면서 이 코드 골프 질문, 답변에서 문제가 발생했습니다.

나는 이것을 테스트해왔고 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 줄이 대시를 출력하고 있는 경우, 해당 문자가 찾고 있는 문자와 정확히 동일한지 확인하세요. 처럼 보인다 대시.유니코드에는 다양한 종류의 대시가 있습니다. 코드나 입력에 이상한 유니코드 대시 문자가 있을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top