【问题标题】:patterns for sequence "reverse-engineering"序列“逆向工程”的模式
【发布时间】:2014-05-30 17:57:08
【问题描述】:

想知道在支持此功能的核心或第 3 方库中是否有任何已建立的模式或什至可用的函数?

我使用seq 表达式编写了一个复杂的序列,该表达式需要一个开始时间和一个规则列表,这些规则指示何时允许某些事件在未来的时间线上发生以创建一个无限序列。很容易提供任何起始DateTime 值,然后开始向前迈进。生成的序列是 seq <DateTime> 对应于时间戳事件。

我想做的是能够在这个理论上的事件时间表上倒退。我希望能够说“返回十步并给我那个 DateTime”,以便我知道如果我将结果应用到原始序列作为输入,我最终会回到我开始的地方。

我是否必须颠倒复杂的逻辑才能使其发挥作用?或者是否有一种方法可以有效地“蛮力”我的前向逻辑,以便我可以继续提供输入,直到我得到一个正确地给我 10 步直到指定日期时间的结果?

我意识到我在解释这一点方面做得很差,所以也许是一个简化的例子来帮助想象我所追求的。假设我使用某种逻辑模式生成了一个整数序列。为了简单起见,我们只说 2 的倍数:

let seq = [ 2; 4; 6; 8; 10; 12; 14; 16; 18; 20; ]

(虽然这是使用我预定义的逻辑延迟生成的序列)

我可以很容易地从其中的任何值开始生成这个序列,所以给定 12 我可以继续前进

let seqFrom12 = [ 12; 14; 16; 18; 20; ]

我希望能够为序列的任何可能值计算我需要提供的值,以便 X 步将我带到序列中的另一个值。

所以我想要序列的所有值,以便 X = 3 多步将带我到序列中的值 12。所以我需要倒数到 10,然后是 8,然后是 6。只有在真实场景中,应用反向逻辑要困难得多

【问题讨论】:

  • 听起来您想要实现撤消功能。这或多或少是正确的吗?
  • @mydogisbox 是的,这肯定是另一种可视化方式

标签: f# ienumerable sequence


【解决方案1】:

这对 SO 来说并不是一个真正的问题。甚至不是为了一篇博文,而是为了一篇有趣的学术论文。但是缺少一条重要信息——您是自己编写序列表达式,还是只得到一个日期序列(不知道它是如何构造的)?

在第二种情况下,你真的无能为力。您必须使用一些 AI 或机器学习技术来实现一个预测算法,该算法将尝试从您采样的数字中猜测之前的数字。

在第一种情况下,您可以通过从 seq<'T> 移开来做一些事情,而是使用您自己的支持前进和后退的数据类型。例如,像这样:

type BiSeq<'T> =
  { Next : unit -> BiSeq<'T> 
    Prev : unit -> BiSeq<'T> 
    Current : 'T }

给定一个BiSeq&lt;'T&gt; 值,我们可以得到当前一个、下一个序列以及从前一点开始的序列。基本实现总是返回相同的值:

let rec always n = 
  { Current = n
    Prev = fun () -> always n
    Next = fun () -> always n }

或者,您可以编写一个接受BiSeq&lt;'T&gt; 并对其执行某些操作的函数。例如,我们可以将当前值递增 0,previous 递增 -2,next 递增 +2。更一般地说:

let rec add by start c = 
  { Current = c.Current + start
    Next = fun () -> add by (start+by) (c.Next())
    Prev = fun () -> add by (start-by) (c.Next()) }

这让您可以像偶数序列一样组成双向序列:

let evens = add 2 0 (always 0)
evens.Next()                        // 2
evens.Next().Next()                 // 4
evens.Next().Next().Next()          // 6
evens.Next().Next().Next().Prev()   // 4
evens.Prev()                        // -2

现在您有了一个可以双向移动的序列!要根据这个想法实现任何现实的东西,您可能需要添加某种形式的缓存和很多其他原语。但这可能是一个有趣的方向!

【讨论】:

    【解决方案2】:

    我想知道解决这个问题的更简单的方法是在您的日期和操作顺序旁边保留一本历史字典。键可以是日期,值可以是当时通过管道传入的值。然后你不需要逆转你可以根据日期返回。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 2019-04-17
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      相关资源
      最近更新 更多