مقارنة سلسلة غير محله، قوات الفشل elvif
-
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
.
أحتاج إلى أن أكون صادقا عندما تكون الشخصية قبل التعبير عبارة عن اندفاعة، ولكن الحالة ليست تعمل حتى. كلاهما 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 غريب في التعليمات البرمجية أو على مدخلاتك.