【问题标题】:Explode and Implode in APLAPL 中的爆炸和内爆
【发布时间】:2013-06-26 13:01:59
【问题描述】:

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

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

【问题讨论】:

  • 如果你想让你的代码接受审查,程序员可能更合适,因为他们允许代码审查:programmers.stackexchange.com - 尽管自我回答问题在这里也有效,所以我不投票标记为离题。 -- 供参考(维基百科):APL (programming language)
  • @hakre - 我并不是真的在寻找评论,但我还是欢迎它。
  • 代码审查将继续 codereview.stackexchange.com 而不是程序员,尽管我认为这很好。特别是因为 APL 社区非常小,不会在其他网站上看到,更不用说回答了。

标签: php arrays string apl


【解决方案1】:

Pé,对 APL 中标准问题的“短”和/或“优雅”解决方案的追求比 PHP 更早,甚至比新术语(例如“eplode”、“implode”)更早(我认为 - 但我必须承认我不知道这些术语到底有多老……)。无论如何,早期的 APL 人使用术语“成语”来表示“适合 APL 一行的标准问题的解决方案”。 出于某种原因,芬兰人特别有创意,甚至开始制作一份清单,以方便新手使用。我发现这些东西在做 APL 20 年后仍然有用。它被称为“FinnAPL”——芬兰 APL 成语库,您可以在这里浏览它:http://aplwiki.com/FinnAplIdiomLibrary顺便说一句,整个 APL-Wiki 可能会很有趣……

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

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

好的,让我也看看这个问题。当您的分隔符是单个字符时,APL2ish 惯用的处理方式是这样的:

⎕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

【讨论】:

  • 我这样做是为了让自己熟悉 APL,这是一次很棒的学习经历,尤其是现在我看到了惯用的解决方案。感谢芬兰人图书馆的链接!
  • 我很同情——你要去那里进行一次伟大的冒险! :-) 可能每个 APLer 都有自己的工具箱来处理此类任务,而这些工具的改进可能是一生的旅程;-)
  • 这是一个很好的爆炸,虽然只处理单个字符分隔符,因为 A=s 位错误并出现长度错误。不过,这项技术可能会被调整。此方法的一个有用方面是它保留了两个分隔符相邻的空分区。将 A 更改为 A←s,'BIRD',s,s,'CAT',s,'DOG',然后尝试 0=⍴¨exploded_string 以查看空集。
【解决方案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”。

【讨论】:

  • 这是一个很好的爆炸解决方案,我喜欢使用 (-S-⍳S) 和旋转 来匹配整个分隔符。我假设的标准技术,但仍然很高兴看到。为了避免重叠,您可能需要使用未使用的字符对分隔符进行标记,然后在添加的两个相邻分隔符之间使用不同的标记来表示空集。
  • @Orbling - 感谢您的评论。我是 APL 的新手,所以我不知道它是否是标准技术。这在当时是有意义的。
【解决方案3】:

一个有趣的内爆替代方法可以通过减少来完成:

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

这种技术不需要显式引用分隔符的形状。

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

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

【讨论】:

  • 感谢您的回答。这里已经很晚了,所以我明天必须仔细看看。但是,让我感到震惊的一件事是我使用的是不支持大括号的 NARS2000,而且我不熟悉大括号语法。我明天会努力破译它。
  • 大括号用于“动态函数”,它是特定于供应商的扩展,由 Dyalog 发明。 (Dyalog 还提供免费版本供个人使用,如果您有兴趣 - 也可以在线试用 APL @tryapl.org
  • 我将你的爆炸代码分配给PP[3] 的结果是“Ttat”而不是预期的“DOG”。
  • @PédeLeão:很高兴看到其他人使用 NARS2000,这是我一直使用的。 Dyalog 很棒,但确实有很多专有扩展 - 总是会导致问题和答案的麻烦,因为大多数人认为您正在使用 Dyalog。
  • 由于爆炸的二元动态函数实际上只是在执行⍵←f ⋄ ⍺←b,因此只需更换字母即可运行其他任何内容:(~(-⍴f)↑(⍴b)∨/b⍷f)⊂f
【解决方案4】:

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

【讨论】:

  • 问题是关于如何在 APL 中做到这一点。
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多