私はしばらくの間、リストをスキャンし、要素の連続したコピーを別々の連結されたボックスに入れることになっている 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 でボックス化された 2 番目の要素、深さ 1 で一緒にボックス化された 3 番目、4 番目、および 5 番目の要素、...、そこのボックス化されていないリストを取得します。同じようにボックスに入れます。") ;.
、S:
、L:
、をいじってその動作を生成しようL.
と&.
しましたが、うまくいきませんでした。これを実現するために、私が見逃しているある種の演算子または原則はありますか? 問題全体を考えすぎていたとしても驚かないでしょうが、アイデアが不足しています。
編集:
現時点で、私が持っている唯一の実用的な解決策はこれです:
isduplicate =: ((2&(~:/\)),1:)
testfun =: 3 : 0
numduplicates =. #S:0 ((<;.2) isduplicate y)
distinctboxes =. <"0 (isduplicate#]) y
numduplicates # each distinctboxes
)
これは、リストのランレングス エンコーディングを生成し、ボックスを削除せずにエンコーディングを元に戻す 2 段階のプロセスです。もともとJとHaskellを使って99問を連立で解こうと思ってやっているので、12問を先に解いて9問を解けばいいのか、という感じです。