找到第一个元素后跟相同的 n 个元素

find first element followed n elements of same

如何在列表中找到第一个零的索引,后面跟着 5 个零?如果不存在这样的零 return -1。 Netlogo 仅 return 是在具有 position 的列表中找到的第一个元素,这使得它成为 difficult/cumbersome.

我找到了可能的解决方案。也许有更聪明的方法来实现同样的目标,但至少这种方法应该有效。 您定义一个列表,您要查看的序列的长度和序列应该具有的编号。然后用该信息调用报告函数(检查序列)。 报告函数然后使用 while 循环。它采用下一个 length-of-sequence 个元素并按指定的 number-of-interest 过滤此子列表。如果此筛选列表的长度与指定的 length-of-sequence 相同,则该函数将存储整个列表 (i) 上的实际位置。如果不是,列表的第一个元素将被丢弃,循环再次运行。如果列表中没有足够的元素,循环将停止并将 reporter 设置为 -1。否则会报告序列的起始位置。

to go

   let my-list (list 0 1 2 3 0 0 0 8 9 8)
   let length-of-sequence 4
   let number-of-interest 0

   print check-sequence my-list length-of-sequence number-of-interest

end   

to-report check-sequence [a-list sequence number]

  let i 0
  let stopper 0
  let reporter 0

  while [stopper = 0]
  [
    let filtered_sublist filter [? = number] (sublist a-list 0 sequence)    
    if (length filtered_sublist = sequence)
    [ 
      set reporter i
      set stopper 1
    ] 

    set a-list but-first a-list
    set i (i + 1)

    if (length a-list < sequence)
    [
      set stopper 2
    ]
  ]

  ifelse (stopper = 2)
  [ report -1 ]
  [ report reporter ]

end

在问题中你说如果没有找到你想要 -1 ,但这与 NetLogo 自己的 position 原语的行为不匹配,returns false 如果找不到该项目。我建议坚持使用通常的 NetLogo 惯例。

递归求解:

to-report position-of-six-zeros [xs]
  if length xs < 6
    [ report false ]
  if sublist xs 0 6 = [0 0 0 0 0 0]
    [ report 0 ]
  let recurse position-of-six-zeros butfirst xs
  if not is-number? recurse
    [ report recurse ]
  report 1 + recurse
end

样本运行:

observer> show position-of-six-zeros [0 0 0 0 0]
observer: false
observer> show position-of-six-zeros [0 0 0 0 0 0 ]
observer: 0
observer> show position-of-six-zeros [1 2 3 0 0 0 0 0 0 4 5 6]
observer: 3
observer> show position-of-six-zeros [1 2 3 0 0 0 0 0 4 5 6]
observer: false