1

私は J の初心者なので、この言語を使用して簡単なタスクを解決することにしました。特に、バブルソート アルゴリズムの実装です。関数型言語でこの種の問題を解決するのは慣用的ではないことを私は知っています.Cのような命令型言語では、宣言型言語で変更されたリストを構築するのではなく、配列要素の転置を使用して自然に解決されるためです。ただし、これは私が書いたコードです:

    (((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #

ステートメントの構造は次のとおりです。

┌────────────────────────────────────────────────────────────────────────────┬──┬─┐
│┌───────────────────────────────────────────────────────────────┬──┬───────┐│^:│#│
││┌───────────────────┬─┬───────────────────────────────────────┐│^:│┌─┬─┬─┐││  │ │
│││┌──────┬─┬────────┐│,│┌──┬─┬────────────────────────────────┐││  ││1│&lt;│#│││  │ │
││││┌──┬─┐│@│┌─┬─┬──┐││ ││$:│@│┌───────────────────┬─┬────────┐│││  │└─┴─┴─┘││  │ │
│││││&lt;.│/││ ││2│&amp;│{.│││ ││  │ ││┌──────┬─┬────────┐│,│┌─┬─┬──┐││││  │       ││  │ │
││││└──┴─┘│ │└─┴─┴──┘││ ││  │ │││┌──┬─┐│@│┌─┬─┬──┐││ ││2│&amp;│}.│││││  │       ││  │ │
│││└──────┴─┴────────┘│ ││  │ ││││>.│/││ ││2│&amp;│{.│││ │└─┴─┴──┘││││  │       ││  │ │
│││                   │ ││  │ │││└──┴─┘│ │└─┴─┴──┘││ │        ││││  │       ││  │ │
│││                   │ ││  │ ││└──────┴─┴────────┘│ │        ││││  │       ││  │ │
│││                   │ ││  │ │└───────────────────┴─┴────────┘│││  │       ││  │ │
│││                   │ │└──┴─┴────────────────────────────────┘││  │       ││  │ │
││└───────────────────┴─┴───────────────────────────────────────┘│  │       ││  │ │
│└───────────────────────────────────────────────────────────────┴──┴───────┘│  │ │
└────────────────────────────────────────────────────────────────────────────┴──┴─┘

それを配列に適用しましょう:

    (((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 5 3 8 7 2
2 3 5 7 8

私を混乱させるのは$:、最も外側の括弧内のステートメントを参照することです。ヘルプは次のように述べています。

$:それを含む最長の動詞を示します。

別の本(~ 300 KiB) には次 のように書かれています。

    3+4 
7  
    5*20  
100  

上記のフレーズのプラス時間を表す+ や * などの記号は動詞と呼ばれ、機能を表します。J 句に複数の動詞が含まれる場合があります。その場合、単純な英語の文のように、 を左から右に読むことで構成れ ます。4+6%2462

()最も外側の sを省略してコード スニペットを書き直してみましょう。

    ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: # 5 3 8 7 2
2 3 5 7 8

結果は同じです。なぜこれが機能するのか、なぜ only が最長の動詞として扱われるのか、式全体ではなく、 だけではないのか、説明でき((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)ません$:でし((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: #(<./@(2&{.)), $:@((>./@(2&{.)),2&}.)。動詞としての文 (最初のスニペット)。おそらく、1 つの接続詞によって制限される動詞の長さには、何らかの制限があります。((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)#

次のコードを見てください (ここから):

    factorial =: (* factorial@<:) ^: (1&<)
    factorial 4
24

factorialwithin 式は、関数全体、つまり(* factorial@<:) ^: (1&<).

この例に従って、代わりに関数名を使用しました$::

    bubblesort =: (((<./@(2&{.)), bubblesort@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
    bubblesort 5 3 8 7 2
2 3 5 7 8

関数全体を参照することを期待bubblesortしていましたが、結果が正しいため、そうではないようです。

また、他の実装がある場合は、少しリファクタリングしたものでも見てみたいと思います。

ありがとう。

4

3 に答える 3

1

I'm looking into it. In the meantime, are you implementing bubblesort because you need bubblesort specifically, or because you just plain need a sort (i.e. could you get away with using /:~ instead)?

EDIT: Have you tried running your bubble sort on a dataset like 3 1 2 9 2 9 86 5 9 6 9 6 45? The system hung when I tried it on my machine, but it works if you replace the ending # with a _.

于 2010-05-08T10:29:14.050 に答える
1

このリファレンス(175 KiB)によると、連結は次のとおりです。

2 つの引数を取り、通常は動詞になる品詞。たとえば、*:^:3は 2 乗を 3 回繰り返す関数です (^:接続詞です)。

上記^:のカテゴリに分類されるように、それを引数に適用すると、動詞が長くなります。

((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)

$:はそれを含む最長の動詞を示す ため、上記のコードを参照します。

同様に、次^:は and から新しい長い動詞を作成((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)#ます。

(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #

$:これは、前のものよりも長いため、によって参照されます。

これは望ましくない動作であるため、おそらく唯一の解決策は、動詞全体を分割して、ワンライナーではありませんが、 を$:参照することです。((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)

    bubbleiter =: ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
    bubblesort =: bubbleiter ^: #
    bubblesort 3 1 2 9 2 9 86 5 9 6 9 6 45
1 2 2 3 5 6 6 9 9 9 9 45 86

この記事には、次の点についてコメントがあります$:

(自己参照) とは何か$:、どのように使用されるかを説明することは、この言語に完全に慣れていない一部のユーザーにとっては、かなり不幸な出発点であることが判明しました。 Roger は、もし彼が今言語を設計していたら、これを含めないだろうとコメントしたと述べました。

もう一度、要約すると:

  • ^:接続詞であり、その引数から新しい動詞を作成します。
  • $:それを含む最長の動詞を示します。

彼の回答でデータセットを提供してくれたエスタンフォードに感謝3 1 2 9 2 9 86 5 9 6 9 6 45します。

于 2010-05-09T02:37:10.173 に答える
0

Jでバブルソートを実装するための別のアプローチは次のとおりです。http://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort#J

于 2011-02-24T13:18:17.990 に答える