次の条件が見つかり、リストされた結果が返されるまで値を生成するだけのシーケンスを作成しようとしています。
ケースヘッド=
- 0-戻り値{:origin [0を除くすべてが生成されます]:pattern 0}
- 1-{:origin nil:pattern[all-generated-values]}を返します
- 繰り返し値-{:origin [values-before-repeat]:pattern [values-after-repeat]
{{
; n = int
; x = int
; hist - all generated values
; Keeps the head below x
(defn trim-head [head x]
(loop [head head]
(if (> head x)
(recur (- head x))
head)))
; Generates the next head
(defn next-head [head x n]
(trim-head (* head n) x))
(defn row [x n]
(iterate #(next-head % x n) n))
; Generates a whole row -
; Rows are a max of x - 1.
(take (- x 1) (row 11 3))
行の終わりに達する前に停止するケースの例:
[9 8 4 5 6 7 4 ]-「4」が繰り返されるので、停止します。前を原点として返し、残りをパターンとして返します。
{:origin [9 8] :pattern [4 5 6 7]}
[4 5 6 1]-「1」が見つかったのでSTOPなので、すべてをパターンとして返します
{:origin nil :pattern [4 5 6 1]}
[ 30 ]-「0」が見つかったので停止します
{:origin [3] :pattern [0]}
:それ以外の場合、シーケンスがx-1の長さに達した場合:
{:origin [all values generated] :pattern nil}
問題
繰り返し値が見つかった時点でグループを分割するためにpartition-byを使用して成功しましたが、これを怠惰に実行したいと思います。take-while、condp、またはforループの:while句を使用して、繰り返しが見つかったときにパーティション化する条件を作成する方法はありますか?
いくつかの試み
(take 2 (partition-by #(= 1 %) (row 11 4)))
(for [p (partition-by #(stop-match? %) head) (iterate #(next-head % x n) n)
:while (or (not= (last p) (or 1 0 n) (nil? (rest p))]
{:origin (first p) :pattern (concat (second p) (last p))}))
#アップデート
私が本当にやりたいのは、値が繰り返されているかどうかを調べ、インデックスを使用せずにseqを分割することです。それは可能ですか?このようなもの -
{{
(defn row [x n]
(loop [hist [n]
head (gen-next-head (first hist) x n)
steps 1]
(if (>= (- x 1) steps)
(case head
0 {:origin [hist] :pattern [0]}
1 {:origin nil :pattern (conj hist head)}
; Speculative from here on out
(let [p (partition-by #(apply distinct? %) (conj hist head))]
(if-not (nil? (next p)) ; One partition if no repeats.
{:origin (first p) :pattern (concat (second p) (nth 3 p))}
(recur (conj hist head) (gen-next-head head x n) (inc steps)))))
{:origin hist :pattern nil})))
}