2009-05-30 15 views
0

this code golf questionの回答では、私は答えの中で問題を見つけました。再現不可能な文字列の比較、elsifの失敗

私はこれをテストしていますが、IRBには正しい動作があるという事実にもかかわらず、この2つの比較がコードで機能することさえできません。私は実際にここでいくつかの助けが必要です。

ここにコードがありますが、その問題の説明になります。

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 == '('はどうしますか?これは、UNIXの改行ではなく、UTF-8でエンコードされます。

私のコードで何が問題になっていますか?あなたが持っている

答えて

3

nとして

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

(chars[0] == '(' && n[0] == '-'))がtrueの場合、その前の状態、(!chars[0].nil? && chars[0] != ' ' && n == '-')は、また真なり、常に1文字の文字列です。 n[0]=='-'の場合、コードはifの2番目の部分に入力されません。

p n行にダッシュが出力されている場合は、それがまったく同じ文字であることを確認してください。のような文字ではなく、のようになります。 Unicodeには多くの種類のダッシュがあります。コードや入力内容にユニコード文字があります。

+0

ありがとうございました。以前の声明が私のコードを犯したことはありませんでした。新鮮な目に感謝します。 –