APL-如何在字符串向量中找到最长的单词?

时间:2019-04-04 10:57:43

标签: functional-programming apl dyalog gnu-apl

我想在字符串向量中找到最长的单词。使用APL,我知道shape函数将返回字符串的长度,例如

⍴ 'string' ⍝ returns 6

reduce函数使我可以沿矢量映射二向函数,但是由于形状是单峰的,因此无法使用。在这种情况下,如何映射形状函数?例如:

如果向量定义为:

lst ← 'this is a string'

我想这样做:

⍴'this' ⍴'is' ⍴'a' ⍴'string'

3 个答案:

答案 0 :(得分:2)

“典型”方法是将其视为分段(或:分隔)字符串,并在其前加上分隔符(空白),并将其传递给dfn进行进一步分析:< / p>

{}' ',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

这仍然有些天真,可以用更高级的方式表达-我将其保留为“读者的锻炼”;-)

答案 1 :(得分:2)

MBaas has already thoroughly answered的同时,我认为学习源自Paul Mansour's comment的惯用的Dyalog“火车” is_inside = np.sqrt(dataOne**2 + dataTwo**2) < 1 plt.plot(dataOne[is_inside], dataTwo[is_inside], 'bo') plt.plot(dataOne[~is_inside], dataTwo[~is_inside], 'yo') 可能会很有趣。它形成一个二进位函数,该函数在出现左引数时将其右引数分开:

≠⊆⊢

您可以扩展此功能来完成全部工作:

      Split ← ≠⊆⊢
      ' ' Split 'this is a string'
┌────┬──┬─┬──────┐
│this│is│a│string│
└────┴──┴─┴──────┘

或者一口气将定义结合起来:

      SegmentLengths ← ≢¨Split
      ' ' SegmentLengths 'this is a string'
4 2 1 6

如果您习惯了惯用表达式 SegmentLengths ← ≢¨≠⊆⊢ ' ' SegmentLengths 'this is a string' 4 2 1 6 ,那么它的读起来实际上可能比您可以为该函数指定的任何合适名称更清晰,因此您最好直接使用该表达式:

≠⊆⊢

答案 2 :(得分:0)

关于如何在NARS APL中找到我要使用的字符串中最长的单词

f←{v/⍨k=⌈/k←≢¨v←(⍵≠' ')⊂⍵}

使用示例

  f  'this is a string thesam'
string thesam 

爆炸

{v/⍨k=⌈/k←≢¨v←(⍵≠' ')⊂⍵}
            v←(⍵≠' ')⊂⍵  split the string where are the spaces and assign result to v
        k←≢¨v             to each element of v find the lenght, the result will be a vector
                          that has same lenght of v saved in k
      ⌈/k                 this find max in k
    k=                    and this for each element of k return 0 if it is not max, 1 if it is max
 v/⍨                      this return the element of v that are max