1

範囲内の2つの数値の違いを見つけたいのですが、循環リストのように、範囲の先頭に折り返すことができる必要があります。

範囲は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

数字が 8 で、推測が 2の場合、答えは 6 ではなく 3 になるはずですか? 差を計算する次の関数についてはどうでしょうか。

(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 に答える
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 に答える