流行っているので参戦してみました。
コード
プログラム本体は以下のものとなります:
@car swap { 2dup <= if swap drop true else drop false then } filter .
結構短いのでは?と思っておりますが、どうでしょうか?
他の言語での短い実装例も見てみたいです。
最後のドットはスタックに積まれている値(この場合はリスト)を出力するものです。
filter というワードは、スタックトップにあるラムダ(無名ワード)をスタックの 2 番目に積まれているリストに適用し、リスト内の各要素に対し、ラムダを適用し true のものだけをリスト化するワードです。
使用例
> ( 1 2 1 1 4 3 9 ) @car swap { 2dup <= if swap drop true else drop false then } filter .
( 1 2 4 9 ) ok.
実に簡単ですね。
解説
スタック上に現在の最大値を保存しておき、それを使っています。スタックを活用する Forth 系ならではのプログラムになっているかと思いますがいかがでしょうか?
並列処理向け Forth 系言語 Paraphrase にご興味を持たれた方は、twitter で paraphrase_lang ( https://twitter.com/paraphrase_lang )をフォローしていただけると嬉しいです。
ちなみに、今回使用した Paraphrase は ver.0.93.0 開発版(現在開発中のためまだ公開できてません)です。
追記
2019.08.02 11:15 追記:
最短なのでは、と思っていたらシェル使うともっと短く書けるようです。
シェル恐るべし。
「bashでスターリンソートをやってみた」
https://qiita.com/hasegit/items/e4fbccda94db5e954668