質問

このコードゴルフ質問をhref="https://stackoverflow.com/questions/928563/code-golf-evaluating-mathematical-expressions">

私はこれをテストしてきたし、私もこれら2つの比較は、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の割り当てで発生する。

私は式の前の文字がダッシュであるが、条件さえ働いていないときに真であることを否定する必要があります。 n == '-'n[0] == '-'両方とも、引用の形式は重要ではありません、FALSE毎回羽目になる。しかし、私はこの正確な比較とn == '('を使用してきたことは毎回正しく動作します!

何が起こっているの? n == '-'がないのに、なぜ、仕事をn == '('ないのですか?これは、BOM、UNIXの改行O / W 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ラインはダッシュを出力している場合は、

、それはあなたが探している正確に同じ文字ではなく、をいくつかの文字であることを確認してください。のダッシュのように見えます。 Unicodeはダッシュの多くの種類があり、多分あなたはあなたのコードにしたり、入力に奇妙なUnicodeのダッシュ文字を持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top