Math 基于范围的数字猜测游戏
我想找出一个范围内两个数字之间的差异,但我需要能够环绕到范围的开头,就像一个循环列表一样 范围是9 所以如果数字是6,猜测是5,答案应该是1,但是如果数字是8,猜测是2,那么答案应该是3 我的第一个想法是将数字增加10,如下所示:Math 基于范围的数字猜测游戏,math,clojure,Math,Clojure,我想找出一个范围内两个数字之间的差异,但我需要能够环绕到范围的开头,就像一个循环列表一样 范围是9 所以如果数字是6,猜测是5,答案应该是1,但是如果数字是8,猜测是2,那么答案应该是3 我的第一个想法是将数字增加10,如下所示: n is the correct number, g is the guess, r is the result. ( let [ r (min (- (+ n 10) g) (- g n)) ] (if (> 0 r) ( * -1 r )
n is the correct number, g is the guess, r is the result.
( let
[ r (min (- (+ n 10) g) (- g n)) ]
(if (> 0 r) ( * -1 r ) r) )
)
。。。这对换行有效,但问题是,如果数字10换行,结果会增加1。仅仅从结果中减去1或数字在所有情况下都不起作用
根据所讨论的数字,结果是负数,因此if语句将其交换为正数
这不是一个clojure问题,它实际上是一个数学问题,我在任何语言中都会遇到这个问题,但碰巧我就是用这个来写的。我才刚刚开始使用clojure(或任何函数式语言),所以完全可能是我做错了事情,或者非常不符合逻辑
感谢您的帮助如果您在循环中包含零,则问题将变小,即A-B mod R或B-A mod R 你可以通过减少你读到的数字和增加你打印的数字来获得不允许猜测零的效果,尽管如果你允许他们猜测零的数字,你的游戏在数学上会更容易
(defn mod- [x y r]
(let [res (rem (- x y) r)]
(if (neg? res)
(+ res r)
res)))
(min (mod- A B r) (mod- B A r))
你确定如果数字是8,猜测是2,答案应该是3而不是6吗?如果是这种情况,那么以下函数如何计算差异:
(defn difference [rrange number-to-guess guess]
(-> rrange
(- guess)
(+ number-to-guess)
(mod rrange)))
以下是测试
user=> (= 1 (difference 9 6 5))
true
user=> (= 6 (difference 9 8 2))
true
user=> (= 1 (difference 9 6 5))
true
user=> (= 6 (difference 9 8 2))
true