『ファイル名をわかりやすくソート』とかいう問題やろうと思ったら。


CodeIQでJavaScriptの問題でも解く練習しようと思いJavaScriptと検索してできそうな問題探してたら『ファイル名をわかりやすくソート』とか言う問題があったので挑戦しようと思いました。

が、結論から言うとコードは書き終わったけど提出できなかった。

よくよく問題を読んでみると回答を提出するには標準入力して標準出力しなければいけないみたいだが何のことだかさっぱり。

そもそもJavaScriptにもRhinoとかSpidermonkeyとか聞きなれない名前が付いてる時点で気づくべきだった。

一応気になるのでググってみるとRhinoやSpidermonkeyとはJavaScriptでコマンドライン操作やネイティブアプリを作る変態さん達用のJavaScriptのようです。

けどせっかく書いたプログラムをそっとじするのも癪なのでブログに張り付ける事にしました。

問題の内容は以下

今回は問題を簡単にするために、以下の仕様で並べ替えることにします。

  • ファイルを識別する名前は「ファイル名」と「拡張子」で構成される。例)file0123.txt
  • ファイル名部分の右端に数字がある場合は、まず右端の数字以外の部分でソートする。
  • その後、数字部分について数値としてソートする。数値として同じ場合は、さらに文字列とみてソートする。
  • 最後に、拡張子部分についてソートする。

ファイル名部分の途中に数字が入っていても、アルファベットと同じように扱うものとします。(右端の数字以外は数値とはみなさない)。
 ファイル名に使われる文字はアルファベット、数字、アンダースコアのみとし、大文字と小文字は区別するものとします。
https://codeiq.jp/challenge/2286

最初はファイル名から数字だけを抽出して文字列と数値に変換すれば良いと思ったんだがそうするとファイル名に数字が入ってる場合にそこまで抽出してしまうのでアウト。

その部分の実装に一番時間がかかり結局注釈に一番苦戦しました・・・。

で、コードがこちら。

正規表現マスターならもっとスマートに書けると思います。

最初のfor文なんか突き詰めれば1行でできそう。

ソートの部分はPHPのmultisortみたいな処理が無いのでこうするしかない。

そもそもソートの関数をアレコレ弄れば多元配列に格納せずにもできそうですが余計複雑になりそうなのでとりあえずこれで。

ちなみに処理の手順自体はすぐに思いつきましたが正規表現苦手なので想定時間の30分ではできませんでした…。