質問

私はしばらくの間J機能に取り組んできましたが、それはリストをスキャンし、要素の連続したコピーを別々の連結ボックスに入れることになっています。私の努力は私を機能させました

(<;. 2) ((2&(~:/\)),1:)

これは、不平等の連続したリストエントリをテストし、ブール値のリストを返し、リスト1が表示されるたびに終了するボックスにリストをカットします。これがアプリケーションの例です。

   (<;. 2) ((2&(~:/\)),1:) 1 2 3 3 3 4 1 1 1
+-+-+-----+-+-----+
|1|1|0 0 1|1|0 0 1|
+-+-+-----+-+-----+

入力引数でそれらのすべてのブール人を対応する値に置き換えることができれば、タスクは終了します。私は私がのようなことをさせるためのある種の謎の機能を探していました

   final =: mysteryfunction @ (<;. 2) ((2&(~:/\)),1:)

   final 1 2 3 3 3 4 1 1 1    
+-+-+-----+-+-----+
|1|2|3 3 3|4|1 1 1|
+-+-+-----+-+-----+

理想的な状況では、によって生成されるネストパターンを抽象的に表す方法があります (<;. 2) ((2&(~:/\)),1:) 元の入力リストに適用します。 (つまり、ここにあるこの箱入りの配列には、深さ1に箱入りの最初の要素があり、深さ1、3番目、4番目、および5番目の要素が深さ1でボックスされています。そして同じようにそれを箱に入れました。」)私は一緒にだまされようとしました ;. , S: , L:, L.&. その行動を生み出すために、しかし私はあまり運がありませんでした。これを実現できる可能性のあるある種のオペレーターや原則はありますか?問題全体を考え直していても驚かないでしょうが、アイデアが不足しています。

編集:

現時点では、私が持っている唯一の作業ソリューションはこれです。

isduplicate =: ((2&(~:/\)),1:)

testfun =: 3 : 0
numduplicates =. #S:0 ((<;.2) isduplicate y)
distinctboxes =. <"0 (isduplicate#]) y
numduplicates # each distinctboxes
)

これは、リストのランレングスエンコードを生成し、ボックスを取り除くことなくエンコードを元に戻す2段階のプロセスです。私はもともと解決することを目的としてこれをやっているので 99の問題 JとHaskellを使用してタンデムでは、問題12を最初に解決することで問題9を解決するかどうかという疑問を懇願するように感じます。

役に立ちましたか?

解決

あなたはほとんどそこにいます。 Aを追加します ~ そして、括弧を異なって配置します、そしてそれだけです:

   (<;.2~ (2&(~:/\) , 1:)) 1 2 3 3 3 4 1 1 1
┌─┬─┬─────┬─┬─────┐
│1│2│3 3 3│4│1 1 1│
└─┴─┴─────┴─┴─────┘

簡単な説明/イラスト:

   s =: 1 2 3 3 3 4 1 1 1

   f =: 2&(~:/\) , 1:
   f s
1 1 0 0 1 1 0 0 1

   g =: <;.2

   (f s) g s
┌─┬─┬─────┬─┬─────┐
│1│2│3 3 3│4│1 1 1│
└─┴─┴─────┴─┴─────┘

その決勝戦 (f s) g s, 、時には「左フック」と呼ばれ、書くことができます (g~ f) s (副詞 ~ Jでは「パッシブ」と呼ばれています、Haskellのカウンターパートは flip)。または、これをフォークとして暗黙のうちに書くこともできます (f g ]) s.

「学習J」の第9章 詳細を知りたい場合は、このトピックについて広範囲に説明します。

アップデート: :私は以前にグループベースを使用しました (</.~ (+/\&(1,(2&(~:/\))))), 、しかし、元のカットベースのアプローチはこれよりもエレガント(そして短い)です。これは本当に左フックに関するものなので、私はあなたのアプローチを直接使用するように更新しました。

他のヒント

あなたはそれを考えすぎていると思います。完全に暗黙的である必要がありますか?これが私がちょうど一緒に投げたものです:

   s<;.2~  ((2&(~:/\)),1:) s=:1 2 3 3 3 4 1 1 1
┌─┬─┬─────┬─┬─────┐
│1│2│3 3 3│4│1 1 1│
└─┴─┴─────┴─┴─────┘

明らかに、入力リストをsに割り当てるだけで、 ;. 表現。それが完全に暗黙のものである必要がある場合、私はあなたがそれをマッサージして入力リストをブールのリストにravelすることができると確信しています、そして次にのようなものを使用します {. < ;.2 {: 出力を取得します。

私が念頭に置いていたこのバージョンの機能はより良いですが、それでも完璧であるほど暗黙のうちにはありません。 (少なくとも、それはとにかく、将来的に別の問題について問題を請うことはありません。)暗黙の表現としてループ中にその論理を表現する方法を見つけたら、私はすべて設定されます。

NB. boxmerge takes a boxed argument and razes the first two
NB. elements together into a new box.
boxmerge =: [:}.]1}~[:<[:;2&{.

NB. conseq checks to see whether the first two boxes of a boxed
NB. array contain the same distinct element. (By assumption, each
NB. box contains only one distinct element.) The name is an
NB. abbreviation of the question, "consecutive boxes equal?"
conseq =: [:=/[:~.&.>2&{.

partfun =: ]`(boxmerge)@.conseq ^:_

listpack =: 3 : 0
mylist =. y
listbin =. >a:
while. (mylist -: (>a:)) = 0 do.
 newlist =. partfun mylist
 listbin =. listbin,{. newlist
 mylist =. }. newlist
end.
listbin
)

whileループの背後にあるアイデアは適用することです partfun リストには、ヘッドを別のリストに刻み、元のリストを斬首し、元のリストが完全に空になるまでそれを続けます。暗黙の表現でその論理を表現する方法が本当にあるべきだと思います。 (実際、オンラインドキュメントで見たこともあると思います。)適切なシーケンスについては考えられません。 ^:'s、 $:'砂 @.最後の爪をffinに置く必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top