سؤال

في الرد هذا الرمز السؤال الجولف, لقد ركضت مشكلة في إجابتي.

لقد كنت اختبر هذا ولا يمكنني حتى الحصول على هاتين المقارنتين للعمل في التعليمات البرمجية، على الرغم من حقيقة أن 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] == '-', ، شكل الاقتباس لا يهم، ينتهي كاذبة في كل مرة. ومع ذلك، لقد كنت أستخدم هذه المقارنة بالضبط و n == '(' يعمل بشكل صحيح في كل مرة!

ما الذي يجري؟ لماذا لا n == '-' العمل، متى n == '(' هل؟ يتم ترميز هذا في UTF-8 W / O BOM، UNIX Leverbreaks.

ما الخطأ في قانون بلدي؟

هل كانت مفيدة؟

المحلول

لديك:

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

كما n هو دائما سلسلة حرف واحد، إذا (chars[0] == '(' && n[0] == '-')) صحيح، ثم الشرط السابق، (!chars[0].nil? && chars[0] != ' ' && n == '-'), ، سيكون أيضا صحيحا. الرمز الخاص بك لن يدخل الجزء الثاني من if إذا n[0]=='-'.

إذا كان لديك p n الخط هو إخراج اندفاعة، تأكد من أنه هو بالضبط نفس الشخصية التي تبحث عنها، وليس بعض الأحرف التي يشبه اندفاعة. يحتوي Unicode على أنواع كثيرة من شرطات، وربما لديك حرف داش Unicode غريب في التعليمات البرمجية أو على مدخلاتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top