【问题标题】:Generating random doable math problems swift快速生成随机可行的数学问题
【发布时间】:2017-03-31 02:34:12
【问题描述】:

我正在寻找创建一个函数,该函数返回一个可以在脑海中执行的数学方程(显然这有点主观,但我不确定如何表达它)。

我想使用 +,-,*,/,% 和 () 操作。

目前我有这个功能:

func createMathString() -> String{

let firstNum = Int(arc4random_uniform(300))
let secNum = Int(arc4random_uniform(300))
let exp = Int(arc4random_uniform(4))
print("\(firstNum) \(self.expressions[exp]) \(secNum)")
return "\(firstNum) \(self.expressions[exp]) \(secNum)"

}

其中 self.expression 是一个包含 +、-、*、/ 的数组。

此函数返回一个字符串,然后使用此函数对其进行解释:

let question = createMathString()
                let mathExpression = NSExpression(format: question)
                let mathValue = mathExpression.expressionValue(with: nil, context: nil) as? Int

我的问题:

1) 随着数字的增加,除法和乘法变得越来越困难

2) 我不确定是否必须添加 ( )。 (并非每个问题都包含它们,取决于术语的数量。

3) 我希望这些问题足够简单,可以在别人的脑海中完成,但又不那么容易,我将随机数减少到 0-50。

我寻找可能的 API,但找不到适合我需要的 API。

【问题讨论】:

    标签: swift math


    【解决方案1】:

    我开始使用 Turbo Pascal 进行编程,正如 Niklaus Wirth 所说:Algorithms + Data Structure = Programs。您需要定义适合您的程序的数据结构。

    首先,一些基本的数据结构。 (Swift enum 比其他语言强大得多)

    enum MathElement : CustomStringConvertible {
        case Integer(value: Int)
        case Percentage(value: Int)
        case Expression(expression: MathExpression)
    
        var description: String {
            switch self {
            case .Integer(let value): return "\(value)"
            case .Percentage(let percentage): return "\(percentage)%"
            case .Expression(let expr): return expr.description
            }
        }
    
        var nsExpressionFormatString : String {
            switch self {
            case .Integer(let value): return "\(value).0"
            case .Percentage(let percentage): return "\(Double(percentage) / 100)"
            case .Expression(let expr): return "(\(expr.description))"
            }
        }
    }
    
    enum MathOperator : String {
        case plus = "+"
        case minus = "-"
        case multiply = "*"
        case divide = "/"
    
        static func random() -> MathOperator {
            let allMathOperators: [MathOperator] = [.plus, .minus, .multiply, .divide]
            let index = Int(arc4random_uniform(UInt32(allMathOperators.count)))
    
            return allMathOperators[index]
        }
    }
    

    现在是主类:

    class MathExpression : CustomStringConvertible {
        var lhs: MathElement
        var rhs: MathElement
        var `operator`: MathOperator
    
        init(lhs: MathElement, rhs: MathElement, operator: MathOperator) {
            self.lhs = lhs
            self.rhs = rhs
            self.operator = `operator`
        }
    
        var description: String {
            var leftString = ""
            var rightString = ""
    
            if case .Expression(_) = lhs {
                leftString = "(\(lhs))"
            } else {
                leftString = lhs.description
            }
            if case .Expression(_) = rhs {
                rightString = "(\(rhs))"
            } else {
                rightString = rhs.description
            }
    
            return "\(leftString) \(self.operator.rawValue) \(rightString)"
        }
    
        var result : Any? {
            let format = "\(lhs.nsExpressionFormatString) \(`operator`.rawValue) \(rhs.nsExpressionFormatString)"
            let expr = NSExpression(format: format)
            return expr.expressionValue(with: nil, context: nil)
        }
    
        static func random() -> MathExpression {
            let lhs = MathElement.Integer(value: Int(arc4random_uniform(10)))
            let rhs = MathElement.Integer(value: Int(arc4random_uniform(10)))
    
            return MathExpression(lhs: lhs, rhs: rhs, operator: .random())
        }
    }
    

    用法:

    let a = MathExpression(lhs: .Integer(value: 1), rhs: .Integer(value: 2), operator: .divide)
    let b = MathExpression(lhs: .Integer(value: 10), rhs: .Percentage(value: 20), operator: .minus)
    let c = MathExpression.random()
    
    let d = MathExpression(lhs: .Integer(value: 1), rhs: .Integer(value: 2), operator: .plus)
    let e = MathExpression(lhs: .Integer(value: 3), rhs: .Integer(value: 4), operator: .plus)
    let f = MathExpression(lhs: .Expression(expression: d), rhs: .Expression(expression: e), operator: .multiply)
    
    let x = MathExpression.random()
    let y = MathExpression.random()
    let z = MathExpression(lhs: .Expression(expression: x), rhs: .Expression(expression: y), operator: .plus)
    
    
    print("a: \(a) = \(a.result!)")
    print("b: \(b) = \(b.result!)")
    print("c: \(c) = \(c.result!)")
    
    print("f: \(f) = \(f.result!)") // the classic (1 + 2) * (3 + 4)
    print("z: \(z) = \(z.result!)") // this is completely random
    

    【讨论】:

    • 我很荣幸?。觉得很啰嗦
    • 知道如何改变它来解决 x 问题吗?
    • 什么 x 问题?你的意思是乘法和除法变得更难,而值变得更大?
    • 不,我只是好奇是否有一种方法可以生成代数方程,例如 (x - 15) / 10 = 6 -> 用户需要输入 75
    • 您可以扩展MathElement 以包含变量的枚举大小写。我现在不在电脑附近。无论如何发布一个新问题
    猜你喜欢
    • 2014-08-21
    • 2010-11-05
    • 1970-01-01
    • 2020-05-23
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多