«Типичный» подход заключается в том, чтобы рассматривать его как сегментированную (или: разделенную) строку и ставить префикс с разделителем (пробел ) и передавать его в dfn для дальнейшего анализа:
{}' ',lst
Затем fn ищет разделитель и использует его для построения векторов слов:
{(⍵=' ')⊂⍵}' ',lst
┌─────┬───┬──┬───────┐
│ this│ is│ a│ string│
└─────┴───┴──┴───────┘
Давайте удалим пробелы:
{1↓¨(⍵=' ')⊂⍵}' ',lst
┌────┬──┬─┬──────┐
│this│is│a│string│
└────┴──┴─┴──────┘
И тогда вам «просто» нужно вычислить длину каждого вектора:
{1↓¨(⍵=' ')⊂⍵}' ',lst
Это прямая реализация вашего запроса. Однако, если вас не интересуют сами подстроки, а только длина «непустых сегментов», более «APLy» -решение может работать с логическими значениями (обычно наиболее эффективными):
lst=' '
0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
Итак, каковы позиции разделителей - где они встречаются?
⍸lst=' '
5 8 10
Но нам также нужен конечный пробел - иначе мы пропустим конец текста:
⍸' '=lst,' '
5 8 10 17
Таким образом, эти (minus the positions of the preceeding blank
) должны давать длину отрезков:
{¯1+⍵-0,¯1↓⍵}⍸' '=lst,' '
4 2 1 6
Это все еще несколько наивно и может быть выражено более продвинутым способом - я оставляю это как "упражнение для читателя"; -)