LoginSignup
5
2

More than 3 years have passed since last update.

バージョン情報ソートができないと面接に落ちるので解答しとく

Posted at

有名なrana_kualuさんが、Zennに投稿していらっしゃる記事から。

アルゴリズムのせいで面接に落ちた
https://zenn.dev/rana_kualu/articles/efd74e8525ccab6c8474

rana_kualuさんは「不労所得で生きたい。」そうですので、Zennでは「¥サポートする」ができるみたいなので、みなさまヨロ。

そこにスタックオーバーフローの回答もリンクされています。

また、Zennで他の方の記事でもコード書いていらっしゃいました。

【Typescript】バージョン比較用関数について
https://zenn.dev/nekoniki/articles/c9c4584bc463e593cb94

私も書いておきます。
こだわってみたのは、バージョン番号にアルファベットが付属しているときにその大文字小文字も比較しているところです。これは紹介した上記の回答でも考慮されてない気がします。

動作確認はこちら。
https://jsbin.com/xofomudano/1/edit?html,js,console

コードはこれ。


const versions = [
  '5.0.0.',
  '1.3.0.9',
  '0.2.0',
  '3.1.2',
  '0.1.6',
  '5.0.0',
  '3.3.3.3',
  '3.3.3.3.3',
  '3.10',
  '0.2.0',
  '0.2.0a',
  '0.2.0aa',
  '0.2.0AA',
  '0.2.0Aa',
  '0.2.0aA',
  '0.2.0c',
  '0.2.0b',
  '0.2.0A',
  '0.2.0C',
  '0.2.0B',
  '0.2.0.a',
  '0.2.0.c',
  '0.2.0.b',
  '0.2.0.A',
  '0.2.0.C',
  '0.2.0.B',
  '5.0.0.',
  '5.0.0.0',
];

const output = [
  '5.0.0.0',
  '5.0.0.',
  '5.0.0.',
  '5.0.0',
  '3.10',
  '3.3.3.3.3',
  '3.3.3.3',
  '3.1.2',
  '1.3.0.9',
  '0.2.0C',
  '0.2.0c',
  '0.2.0B',
  '0.2.0b',
  '0.2.0AA',
  '0.2.0Aa',
  '0.2.0aA',
  '0.2.0aa',
  '0.2.0A',
  '0.2.0a',
  '0.2.0.C',
  '0.2.0.c',
  '0.2.0.B',
  '0.2.0.b',
  '0.2.0.A',
  '0.2.0.a',
  '0.2.0',
  '0.2.0',
  '0.1.6',
];

const sortVersions = (unsortedVersions) => {
  const result = unsortedVersions.map(element=>element.split('.'));
  result.sort(
    (a, b) => {
      const length = Math.min(a.length, b.length);
      for (let i = 0; i < length; i += 1) {
        const valueA = parseInt(a[i], 10);
        const valueB = parseInt(b[i], 10);
        if (valueA < valueB) { return -1; }
        if (valueA > valueB) { return 1; }
        if (a[i].toLowerCase() < b[i].toLowerCase()) { return -1; }
        if (a[i].toLowerCase() > b[i].toLowerCase()) { return 1; }
        if (a[i] < b[i]) { return 1; }
        if (a[i] > b[i]) { return -1; }
      }
      if (a.length < b.length) { return -1; }
      if (a.length > b.length) { return 1; }
    return 0;
    }
  );
  return result.map(element=>element.join('.')).reverse();
};
const sortedVersions = sortVersions(versions);
console.log(versions, sortedVersions, sortedVersions.join() === output.join());
5
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2