3

explodePHPに似た機能implodeを APL で実装するにはどうすればよいでしょうか?

私は自分で解決しようとしましたが、以下に投稿している解決策を思いつきました。これを解決できる他の方法を見たいと思います。

4

4 に答える 4

2

ペ、APL の標準問題に対する「短い」および/または「エレガントな」ソリューションの探求は、PHP よりも古く、「eplode」、「implode」などの新しい用語よりも古いものです (私は思う - しかし、私は認めなければなりません。これらの用語が実際にどのくらい古いものかはわかりません...)。いずれにせよ、初期の APL 関係者は、「APL の 1 行に収まる標準的な問題の解決策」のような「イディオム」という用語を使用していました。そして、何らかの理由で、フィンランド人は特に創造的であり、初心者が簡単に使えるように、これらのリストを作成し始めました. そして、APL を 20 年間行った後でも、この機能は依然として有用であることがわかりました。これは「FinnAPL」と呼ばれるフィンランド語の APL イディオム ライブラリであり、ここで閲覧できます: http://aplwiki.com/FinnAplIdiomLibrary (ところで、APL-Wiki 全体を読むと面白いかもしれません...

ただし、解決策を見つけるには、言葉遣いを工夫する必要があるかもしれません ;) そして、1 つの警告: FinnAPL は「クラシック」(ネストされていない) データ構造でのみ機能します (ネストされた行列は、これらの標準である「APL2」に付属しています)。日)、データを処理する方法のいくつかは、もはや「最先端」ではない可能性があります。(つまり、「昔」に戻って、CAT BIRD と DOG は 3x4 配列として表されていたので、string-array の「内破」は単純な as でした,array,delimeter(しかし、パディングのために挿入された空白を削除するという課題がありました)。 .

とにかく、なぜこのようなことを書いたのかよくわかりません - APL を始めたことについて考えたときに頭に浮かんだいくつかの考えです ;-)

わかりました、質問も見てみましょう。区切り文字が単一の文字の場合、これを処理する APL2 っぽい慣用的な方法は次のようになります。

⎕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
于 2013-06-27T05:19:53.827 に答える
2

爆発:

次のテキスト文字列と区切り文字列があるとします。

F←'CAT BIRD DOG'
B←' '

爆発は次のように実行できます。

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

制限:

PHP の爆発関数は、2 つの区切り文字が隣接している場合、null 配列値を返します。上記のコードは単純にそれを無視し、2 つの区切り文字を 1 つとして扱います。

上記のコードも、重複する区切り文字を処理するために何もしません。これは、区切り文字に繰り返し文字が使用されている場合に発生する可能性が最も高くなります。例えば:

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

CAT aBIRD DOGただし、 'aaa' の後に 'a' が続く区切り文字として認識されないため、期待される結果になります。むしろ、重複する 2 つの区切り記号として扱われ、最終的には 1 つの区切り記号として機能します。もう 1 つの例は、区切り文字として「tat」です。この場合、「tatat」の文字列に出現すると、同じ問題が発生します。

区切り文字の重複:

単一のオーバーラップの可能性については、別の方法があります。

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

S-1コードの 3 行目は、その前の区切り文字の位置から文字の距離内にある文字列の位置を削除します。私が言ったように、これは単一のオーバーラップの問題のみを解決します。2 つ以上の重複がある場合、最初のものは区切り文字として認識され、残りはすべて無視されます。2 つのオーバーラップの例を次に示します。

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」を返します。

于 2013-06-26T13:01:59.847 に答える
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
于 2013-08-06T06:01:40.223 に答える