Help us understand the problem. What is going on with this article?

周回遅れで流行りのスターリンソートをJavaScriptで実装してみた

スターリンソートとは

Qiitaで同様のタグを見てみるとよくわかると思います。
私の認識では
ソートされていないデータがあったらその要素を除去(粛清)することで、
要素をソート(できてなくない?!)するというものらしいです・・・。
これは本当にソートなのか?!(汗)

参考

実装の際にサンプルにしたのは、スターリンソートの提唱者?っぽい人のソースコードです。
GitHubに色々公開されていました。

// 引用元 https://github.com/gustavo-depaula/stalin-sort/blob/master/javascript/stalin-sort.js
function stalinSort(array) {
//  if (!Array.isArray(array)) throw new TypeError('Argument must be an Array!');

  let [holder] = array;
  return array.filter((el, i) => {
    if (i === 0) return true;
    if(el >= holder) {
      holder = el;
      return true;
    }
    return false;
  });
}

ふむふむ・・・なるほど?わからん

JavaScriptでワンライナー実装♪

let myStalinSort = (arr) => ((arr, tmp = arr[0]) => { return arr.filter((v) => !(tmp > v) ? tmp = v : false)})(arr)

@htsign 様にご指摘いただいてtmpを宣言する場所を変更しました。。。。
ありがとうございます。

結果確認

確認用コードは以下の通り。(テストデータはQiitaにある色々な記事から参考にさせていただきました)

const data = []
const pattern1 = [1, 2, 1, 1, 4, 3, 9]    // answer: [1 ,2 ,4 ,9]
const pattern2 = [1 ,3 ,4 ,2 ,3 ,7 ,3 ,9] // answer: [1 ,3 ,4 ,7 ,9]
const pattern3 = [6 ,2 ,5 ,7 ,3 ,8 ,8 ,4] // answer: [6 ,7 ,8 ,8]
data.push(pattern1)
data.push(pattern2)
data.push(pattern3)

// 引用元 https://github.com/gustavo-depaula/stalin-sort/blob/master/javascript/stalin-sort.js
function stalinSort(array) {
// 参考にのせたやつ・・・
}

let myStalinSort = (arr) => ((arr, tmp = arr[0]) => { return arr.filter((v) => !(tmp > v) ? tmp = v : false)})(arr)

data.map((arr) => {
  const purged = myStalinSort(arr)
  const answer = stalinSort(arr)
  console.log(purged, answer, `result: ${purged.toString() == answer.toString()}`)
})

結果

 $ node ./app.js 
[ 1, 2, 4, 9 ] [ 1, 2, 4, 9 ] 'result: true'
[ 1, 3, 4, 7, 9 ] [ 1, 3, 4, 7, 9 ] 'result: true'
[ 6, 7, 8, 8 ] [ 6, 7, 8, 8 ] 'result: true'

あっていそうですね!

解説

なんとかワンライナーにしたかったので、以下の工夫を入れています。

  • 即時実行関数を生成し、tmp変数の初期化をその中で実施しています
  • !(tmp > v) ? tmp = v : false
    • JavaScriptの特性を利用しています。。。
    • tmp = v はtrueが返ります。
node
> console.log(tmp = 100) // 100が返る?!
100
undefined
> console.log(!!(tmp = 100)) // 0やemptyではないのでtrue
true
undefined

最後に

他の言語でもやってみたいけど、JavaScriptがササっと書けるからついついJSでばっかり書いてしまう今日この頃・・・
コメントお待ちしております!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away