CodeIQ MAGAZINECodeIQ MAGAZINE

【息抜き】ファイル名を作ろう【言語不問】解答と解説

2017.09.01 Category:CodeIQ問題解説・リーダーボード Tag:

  • 9
  • このエントリーをはてなブックマークに追加

息抜き時間でできる、簡単なプログラムを書いてみよう、というプログラミング問題でした。

あなたは見事、プログラムを書けましたか? というわけで、出題者の柳井さんによる解答と解説をどうぞ!
by CodeIQ運営事務局

【息抜き】ファイル名を作ろう【言語不問】

本問題は、表題のテーマで、簡単なプログラムを書くものです。

それでは以下、問題とその解答を見ていきましょう。

問題

ファイルをディレクトリ内に作成する際、同じ名前のファイルがあると、末尾に数字を付けるなどして同じ名前にならないようにします。

こうした処理をプログラムで書くことにします。

たとえば「dog」というファイルを作ろうとした場合、同じ名前のファイルが既にある場合は「dog_copy」という名前にします。「dog_copy」もある場合は「dog_copy2」という名前にします。「dog_copy2」もある場合は「dog_copy3」という名前にします。以下、末尾の数字が1ずつ増えていきます。

与えられる入力は、フォルダ内のファイル名のリストです。ただし、末尾の名前だけリストには含まれず、作成したいファイルの名前になります。

この末尾のファイル名を、上記の手順で変換して、作成可能なファイル名にします。そして、標準出力に出力して下さい。

(参考:各プログラミング言語の標準入出力サンプル

下記では、「dog、tiger、dog_copy、rat、snake、monkey、snake_copy、rat_copy、snake_copy2、cat」がファイル名のリストで、「dog」が作成したいファイルの名前になります。

そして出力するファイル名は「dog_copy2」になります。

以下、入力例です。

dog
tiger
dog_copy
rat
snake
monkey
snake_copy
rat_copy
snake_copy2
cat
dog

以下、出力例です。

dog_copy2

答え

まずは、入力を「ファイル名のリスト」と「作成したいファイル名」に分けなければなりません。末尾が「作成したいファイル名」なので、入力例を分けて書きます。

以下、ファイル名のリストです。

dog
tiger
dog_copy
rat
snake
monkey
snake_copy
rat_copy
snake_copy2
cat

以下、作成したいファイル名です。

dog

処理としては、このように分けたあと、実際に「作成可能なファイル名」を得ます。

入力例では、「dog」「dog_copy」は既に存在しているために「dog_copy2」になります。

dog_copy2

この処理は、「ファイル名を1つずつ作成していき、同じファイル名がなければ処理を打ち切る」といった操作で実現できます。

具体的には、以下の操作をしていくことで、「作成可能なファイル名」を得ることができます。

  • 「ファイル名のリスト」を配列にして、その配列の中に「作成したいファイル名」があるか確かめる。
  • 既に存在している場合は、ルールに従って名前を変えて、再度確かめる。

以下、実例のコードです。サンドボックスで試せる、Node.js用のものです。

// https://codeiq.jp/tools/sandbox/
// Node.js

// 命名関数
var genNm = function(name, arr) {
    if (arr.indexOf(name) === -1) {return name}

    var res = name + '_copy';
    var cnt = 1;
    while (true) {
        if (arr.indexOf(res) === -1) {break}
        cnt ++;
        res = name + '_copy' + cnt;
    }
    return res;
};

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
    var lines = chunk.toString().split('\n');
    var name = lines.pop();
    var res = genNm(name, lines);
    process.stdout.write(res);
});

「命名関数」を見ていきましょう。配列arrの中に、nameがなければ、そのまま戻しています。

存在する場合は、最初は「name + ‘_copy’」、2回目以降は「name + ‘_copy’ + cnt」で、名前を作成して確認しています。

解答の入力と出力は、以下になります。

以下、入力1です。

dog
tiger
dog_copy
rat
snake
monkey
snake_copy
rat_copy
snake_copy2
cat
dog_copy2
caw
snake_copy3
rat_copy2
bat
snake_copy4
snake_copy5
snake_copy6
rat_copy3
dog_copy3
caw

以下、出力1です。

caw_copy

以下、入力2です。

cat
caw
cat_copy
rat
monkey
monkey_copy
monkey_copy2
bat
snake
cat_copy2
cat_copy3
caw_copy
snake_copy
rat_copy
rat_copy2
tiger
tiger_copy
tiger_copy2
cat_copy4
rat_copy3
caw_copy2
rat_copy4
rat_copy5
dog
bat_copy
cat_copy5
cat_copy6
caw_copy3
cat_copy7
rat_copy6
bat_copy2
dog_copy
rat_copy7
cat_copy8
snake_copy2
bat_copy3
bat_copy4
snake_copy3
cat_copy9
rat_copy8
dog

以下、出力2です。

dog_copy2

以下、入力3です。

bat
monkey
bat_copy
rat
caw
monkey_copy
caw_copy
cat
snake
cat_copy
bat_copy2
caw_copy2
snake_copy
rat_copy
dog
dog_copy
dog_copy2
dog_copy3
monkey_copy2
snake_copy2
caw_copy3
snake_copy3
dog_copy4
snake_copy4
tiger
bat_copy3
cat_copy2
tiger_copy
rat_copy2
tiger_copy2
tiger_copy3
monkey_copy3
dog_copy5
caw_copy4
tiger_copy4
tiger_copy5
cat_copy3
tiger_copy6
tiger_copy7
tiger_copy8
caw_copy5
caw_copy6
rat_copy3
dog_copy6
dog_copy7
dog_copy8
bat_copy4
monkey_copy4
cat_copy4
dog_copy9
tiger_copy9
tiger_copy10
rat_copy4
monkey_copy5
bat_copy5
cat_copy5
snake_copy5
bat_copy6
dog_copy10
bat_copy7
monkey_copy6
snake_copy6
tiger_copy11
bat_copy8
tiger_copy12
bat_copy9
caw_copy7
monkey_copy7
rat_copy5
caw_copy8
cat_copy6
dog_copy11
tiger_copy13
dog_copy12
cat_copy7
bat_copy10
rat_copy6
dog_copy13
caw_copy9
snake_copy7
caw

以下、出力3です。

caw_copy10

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

  • 9
  • このエントリーをはてなブックマークに追加

■関連記事

【謎解きプログラム】どう防ぐ?【無限ループ】解答と解説... 【謎解きプログラム】どう防ぐ?【無限ループ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内に謎...
数学の問題をプログラミングで解こう!「タワー・ビルディング」問題解説... 問題のおさらい A を一辺が 1 の立方体のブロックとし、B を縦が 1、横が 1、高さが 2 の直方体のブロックとします。 (下は横から見た図です。) 自然数 n, a, b に対し、A を最大 a 個、B を最大 b 個使って、縦が 1、横が 1、高さが n の直方体の塔を作ります。 こ...
【謎解きプログラム】正しいコードは?【一人すごろく】解答と解説... 【謎解きプログラム】正しいコードは?【一人すごろく】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間...
数学の問題をプログラミングで解こう!「ペア・ドロップ」問題解説... 問題のおさらい n を自然数とします。1 から n までの自然数が 1 つずつ書かれた n 枚のカードが 2 組あります。 これら 2n 枚のカードをよく混ぜ、A と B の 2 人に n 枚ずつ配ります。 A と B は、それぞれ自分の持ち札の中に番号が一致するカードがあればその 2 枚を捨...
【謎解きプログラム】中身はどうなる?【出し入れ】解答と解説... 【謎解きプログラム】中身はどうなる?【出し入れ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内...
【謎解きプログラム】座標の移動【Matrix】解答と解説... 【謎解きプログラム】座標の移動【Matrix】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内に...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ