Netlogo - Как получить количество последовательных элементов в списке? - PullRequest
0 голосов
/ 03 июля 2018

Как я могу получить частоту последовательных чисел в списке в Netlogo?

Например, если мой список:

list = [1 1 1 0 0 1 1 0 1 1 0 0 0 ]

Тогда вывод должен выглядеть следующим образом:

output = [3 2 2 1 2 3]

Ответы [ 2 ]

0 голосов
/ 03 июля 2018
to-report countRuns [#lst]
  if 0 = length #lst [report #lst]
  let val first #lst
  let _ct 1
  let cts []
  foreach butfirst #lst [? ->
    ifelse ? = val [
      set _ct (1 + _ct)
    ][
      set cts lput _ct cts
       set val ?
     set _ct 1
    ]
  ]
  report lput _ct cts
end
0 голосов
/ 03 июля 2018

Это не служба написания кода, но я получил всхлип , так что вот и все. Я решил, что это работа для рекурсии:

to-report count-consecutive-items [ xs ]
  report count-consecutive-items-loop [] nobody xs
end

to-report count-consecutive-items-loop [ counts-so-far last-item remaining-items ]
  report ifelse-value (empty? remaining-items) [
    ; no more items to count, return the counts as they are
    counts-so-far
  ] [
    (count-consecutive-items-loop
      (ifelse-value (first remaining-items = last-item) [
        ; this is the same item as the last,
        ifelse-value (empty? counts-so-far) [
          ; if our list of counts is empty, start a new one
          [1]
        ] [
          ; add one to the current count and keep going
          replace-item (length counts-so-far - 1) counts-so-far (1 + last counts-so-far)          
        ]
      ] [
        ; this is an item we haven't seen before: start a new count
        lput 1 counts-so-far
      ])
      (first remaining-items)
      (but-first remaining-items)
    )
  ]
end

to test
  let result count-consecutive-items [1 1 1 0 0 1 1 0 1 1 0 0 0]
  print result
  print result = [3 2 2 1 2 3]
end

Я уверен, что кто-то другой может придумать хорошую императивную версию, которая будет намного легче понять, чем эта, но вы можете рассматривать это как педагогическое упражнение: если вам удастся понять этот код, это поможет вам на пути к просветлению NetLogo.

(У меня нет времени, чтобы написать объяснение сейчас, но, пожалуйста, задавайте вопросы в комментариях, если есть что-то, в чем конкретно вам нужна помощь.)

...