J:バブルソートの暗黙の実装における自己参照
-
04-10-2019 - |
質問
私はJの初心者なので、この言語を使用して簡単なタスクを解決することにしました。特にBubblesortアルゴリズムを実装しています。宣言的な言語で修正リストを構築するのではなく、Cなどの命令言語でのアレイ要素転置を使用して自然に解決されるため、機能性言語でこのような問題を解決することは慣用的ではないことを知っています。しかし、これは私が書いたコードです:
(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
これが声明の構造です:
┌────────────────────────────────────────────────────────────────────────────┬──┬─┐
│┌───────────────────────────────────────────────────────────────┬──┬───────┐│^:│#│
││┌───────────────────┬─┬───────────────────────────────────────┐│^:│┌─┬─┬─┐││ │ │
│││┌──────┬─┬────────┐│,│┌──┬─┬────────────────────────────────┐││ ││1│<│#│││ │ │
││││┌──┬─┐│@│┌─┬─┬──┐││ ││$:│@│┌───────────────────┬─┬────────┐│││ │└─┴─┴─┘││ │ │
│││││<.│/││ ││2│&│{.│││ ││ │ ││┌──────┬─┬────────┐│,│┌─┬─┬──┐││││ │ ││ │ │
││││└──┴─┘│ │└─┴─┴──┘││ ││ │ │││┌──┬─┐│@│┌─┬─┬──┐││ ││2│&│}.│││││ │ ││ │ │
│││└──────┴─┴────────┘│ ││ │ ││││>.│/││ ││2│&│{.│││ │└─┴─┴──┘││││ │ ││ │ │
│││ │ ││ │ │││└──┴─┘│ │└─┴─┴──┘││ │ ││││ │ ││ │ │
│││ │ ││ │ ││└──────┴─┴────────┘│ │ ││││ │ ││ │ │
│││ │ ││ │ │└───────────────────┴─┴────────┘│││ │ ││ │ │
│││ │ │└──┴─┴────────────────────────────────┘││ │ ││ │ │
││└───────────────────┴─┴───────────────────────────────────────┘│ │ ││ │ │
│└───────────────────────────────────────────────────────────────┴──┴───────┘│ │ │
└────────────────────────────────────────────────────────────────────────────┴──┴─┘
配列に適用しましょう。
(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 5 3 8 7 2
2 3 5 7 8
私を混乱させるのはそうです $:
最も外側の括弧内の声明を参照してください。 ヘルプ それは言う:
$:
それを含む最も長い動詞を示します。
他の本 (〜300キブ)と言う:
3+4
7
5*20
100
+や *のようなシンボル プラス と 時代 上記のフレーズでは、動詞と呼ばれ、関数を表します。 Jフレーズに複数の動詞がある場合があります。その場合、それは単純な英語で文のように構築されています 左から右に読む, 、 あれは
4+6%2
意味4
つまり、次のものに追加されました6
で割った2
.
最も外側を省略してコードスニペットを書き直しましょう ()
S:
((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: # 5 3 8 7 2
2 3 5 7 8
reusltsは同じです。なぜこれが機能するのか、なぜ自分だけを説明できませんでした。 ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
の最長動詞として扱われます $:
しかし、表現全体ではありません ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: #
そして、ただではありません (<./@(2&{.)), $:@((>./@(2&{.)),2&}.)
, 、if ((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
動詞です。また、と結合した後、別の動詞を形成する必要があります #
, 、つまり、文(最初のスニペット)を動詞として扱うかもしれません。おそらく、動詞の長さには1つの接続詞に制限されているのに制限があります。
次のコードを見てください(ここから):
factorial =: (* factorial@<:) ^: (1&<)
factorial 4
24
factorial
式内の関数は、関数全体、つまりを指します (* factorial@<:) ^: (1&<)
.
この例に従って、ではなく関数名を使用しました $:
:
bubblesort =: (((<./@(2&{.)), bubblesort@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
bubblesort 5 3 8 7 2
2 3 5 7 8
私は期待していました bubblesort
関数全体を参照することは、結果が正しいので私には当てはまりません。
また、他の実装がある場合は、他の実装をご覧になりたいと思います。
ありがとう。
解決 2
によると このリファレンス (175キブ) 接続詞 は:
2つの引数を取り、通常動詞になるスピーチの一部。例えば、
*:^:3
3回の二乗を繰り返す関数です(^:
aです 接続詞).
として ^:
上記のカテゴリに分類され、それを引数に適用すると、より長い動詞が得られます。
((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
なぜなら $:
それを含む最も長い動詞を示します、それは上に書いたところにあるコードを指します。
同様に、次は ^:
から新しい長い動詞を作ります ((<./@(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
この記事 いくつかのコメントがあります $:
:
何を説明する
$:
(自己参照)は、それがどのように使用されているかは、これが高度な機能であり、J。Johnが通常行う方法の非定型であるため、言語にまったく新しいもののいくつかのかなり不幸な出発点であることが判明しました。ロジャーは、彼が今言語を設計しているなら、彼はこれを含めないだろうとコメントしています。
もう一度、要約する:
^:
aです 接続詞 そして新しいものになります 動詞 その議論から;$:
最も長いことを示します 動詞 それにはそれが含まれています。
ハイアウトに感謝します エスタンフォード データセット用 3 1 2 9 2 9 86 5 9 6 9 6 45
彼の答えで。
他のヒント
私はそれを調べています。それまでの間、Bubblesortが具体的に必要なので、または単に並べ替えが必要なので、Bubblesortを実装していますか(つまり、使用することで逃げることができますか /:~
代わりは)?
編集:次のようなデータセットでバブルソートを実行しようとしましたか 3 1 2 9 2 9 86 5 9 6 9 6 45
?システムは自分のマシンで試したときに吊り下げられていますが、エンディング#を_に置き換えると機能します。
Jにバブルソートを実装するためのもう1つのアプローチは次のとおりです。 http://rosettacode.org/wiki/sorting_algorithms/bubble_sort#j