1

我想找到一个范围内两个数字之间的差异,但我需要能够环绕到范围的开头,就像一个循环列表。

范围是 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 ) r) ) 
)

...这对环绕有用,但问题是数字 10 的存在将结果增加 1,如果它环绕。仅从结果中减去 1 或数字在所有情况下都不起作用。

根据所讨论的数字,结果是否定的,因此 if 语句将其交换为正值。

这不是一个 clojure 问题,它实际上是一个数学问题,我会在任何语言中遇到这个问题,但碰巧这就是我正在写的。我才刚刚开始使用 clojure(或任何功能语言),所以我完全有可能做错事或非常不习惯。

谢谢你的帮助

4

2 回答 2

0

如果您在循环中包含零,则问题会变得更小 A - B mod R 或 B - A mod R

R = 9
8 - 3 mod 9 = 5
3 - 8 mod 9 = 4
min(5 3) = 3

您可以通过减少您读取的数字并增加您打印的数字来获得不允许猜测零的效果,尽管如果您允许他们猜测数字零,您的游戏在数学上会更容易。

(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))
于 2012-11-07T18:46:49.350 回答
0

您确定对于数字为 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
于 2012-11-08T15:47:12.770 回答