在APL爆炸和内爆

时间:2013-06-26 13:02:00

标签: php arrays string apl

如何使用APL实现类似于PHP的explodeimplode的功能?

我试图自己解决这个问题并提出了一个我在下面发布的解决方案。我想看看其他方法可以解决这个问题。

4 个答案:

答案 0 :(得分:2)

<强>爆炸:

给出以下文本字符串和分隔符字符串:

F←'CAT BIRD DOG'
B←' '

爆炸可以完成如下:

S←⍴,B
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂B⍷F)⊂F
P[2] ⍝ returns BIRD

<强>限制:

当两个分隔符彼此相邻时,PHP的explode函数返回一个空数组值。上面的代码只是忽略了这一点,并将两个分隔符视为一个。

上面的代码也没有处理重叠分隔符。如果重复字符用于分隔符,则最有可能发生这种情况。例如:

F←'CATaaaBIRDaaDOG'
B←'aa'
S←⍴,B
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂B⍷F)⊂F
P ⍝ returns CAT BIRD DOG

但是,预期的结果是CAT aBIRD DOG,因为它不会将'aaa'识别为后跟'a'的分隔符。相反,它将它视为两个重叠的分隔符,最终起到单个分隔符的作用。另一个例子是'tat'作为分隔符,在这种情况下,'tatat'字符串中的任何出现都会产生同样的问题。

重叠分隔符:

我可以选择单一重叠:

S←⍴,B
A←B⍷F
A←(2×A)>⊃+/(-S-⍳S)⌽¨S⍴⊂A
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂A)⊂F

第三行代码消除了S-1字符距离之前任何分隔符位置的任何字符串位置。正如我所说,这只解决了单个重叠的问题。如果存在两个或多个重叠,则第一个被识别为分隔符,其余的都被忽略。以下是两个重叠的示例:

F←'CATtatatatBIRDtatDOG'
B←'tat'
S←⍴,B
A←B⍷F
A←(2×A)>⊃+/(-S-⍳S)⌽¨S⍴⊂A
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂A)⊂F
P ⍝ returns CAT atatBIRD DOG

预期结果是'CAT a BIRD DOG',但由于重叠,它无法将最终'tat'识别为分隔符。除非使用重复字符,否则这种情况很少见。如果分隔符是'aa',则'aaaa'将被视为双重重叠,并且只能识别第一个分隔符。

<强>内爆:

更简单:

P←'CAT' 'BIRD' 'DOG'
B←'-'
(⍴,B)↓∊B,¨P

按预期返回'CAT-BIRD-DOG'。

答案 1 :(得分:2)

Pé,对APL中标准问题的“简短”和/或“优雅”解决方案的追求比PHP早,甚至比新术语更老,例如“eplode”,“implode”(我想 - 但我我必须承认我不知道这些术语到底有多久了......)。无论如何,早期的APL家伙使用术语“成语”来解决这些“符合APL一线标准问题的解决方案”。 由于某种原因,芬兰人特别有创意,甚至开始制作这些清单,以便让新手轻松自如。我发现这些东西在20年代做APL之后仍然有用。它被称为“FinnAPL” - 芬兰APL成语库,你可以在这里浏览它:http://aplwiki.com/FinnAplIdiomLibrary BTW,整个APL-Wiki可能有趣的阅读...

然而,您可能需要对您的措辞有创意才能找到解决方案;) 还有一个警告:FinnAPL仅适用于“经典”(非嵌套)数据结构(嵌套矩阵附带“APL2”,这是目前标准的),因此它们处理数据的一些方式可能不再是“最先进的”。 (即回到“旧时代”,CAT BIRD和DOG将被表示为3x4数组,因此字符串数组的“内爆”很简单,因为,array,delimeter(但你接下来要挑战删除空白插入用于填充。

无论如何,我不知道为什么我写了这一切 - 只是想到我开始使用APL时想到的一些想法; - )

好的,我也来看看这个问题。当您的分隔符是单个字符时,APL2ish-idiomatic处理方式就是这样:

⎕ml←3    ⍝ "migration-level" (only Dyalog APL) to ensure APL2-compatibility
s←' '
A←s,'BIRD',s,'CAT',s,'DOG'     ⍝ note that delimeter also used as 1st char!
exploded_string←1↓¨(+\A=s)⊂A   ⍝ explode
imploded←∊s,¨exploded_string
A≡imploded                     ⍝ test for successfull round-trip should return 1

答案 2 :(得分:1)

内爆的一个有趣的替代方案可以通过减少来实现:

      p←'cat' 'bird' 'dog'
      ↑{⍺,'-',⍵}/p
cat-bird-dog

此技术不需要明确引用分隔符的形状。

爆炸的一个有趣的替代方案可以通过n减少来完成:

      f←'CATtatBIRDtatDOG'
      b←'tat'
      b{(~(-⍴⍵)↑(⍴⍺)∨/⍺⍷⍵)⊂⍵}f
 CAT  BIRD  DOG 

答案 3 :(得分:0)

Explode()函数将字符串分成数组,但是implode function()返回或组合数组元素的字符串。

实施例 爆炸:

<?php
$str = "india australia";
$str = explode(" ", $string); //here string delimeter is space
Ouput:
$str[0] = india ;
$str[1] = australia ;
?>

破灭:

<?php
$array = array('india','australia','srilanka');
$comma_separated = implode(",",$array);  //here comma is separated
echo $comma_separated;
?>
Output:
indiaaustraliasrilanka