UniLecs #Task. File Mask

Albert Davletov
UniLecs
Published in
2 min readMay 10, 2020

Задача: для групповых операций с файлами используются маски имён файлов. Маска представляет собой последовательность букв, цифр и прочих допустимых в именах файлов символов, в которой также могут встречаться следующие символы.

  • Символ «?» (вопросительный знак) означает ровно один произвольный символ.
  • Символ «*» (звёздочка) означает любую последовательность символов произвольной длины, в том числе «*» может задавать и пустую последовательность.

Напишите алгоритм, который для каждого имени файла определит, подходит ли оно под заданную маску или нет.

Примечание: гарантируется, что в маске файла присутствует не более одного символа «*».

Входные данные: mask — маска файла, name — имя файла

Вывод: true / false — в зависимости от того, удовлетворяет ли маска или нет.

Примеры:

1. mask = “?or*.d??”, name = “ford.dll”

Output: true

2. mask = “?or*.d??”, name = “orsk.dll”

Output: false

Разбор

Если в маске нет звездочки, то достаточно проверить, что маска и имя файла имеют одинаковую длину и что все символы маски либо равны “?”, либо равны соответствующему символу имени файла.

Если в имени маски есть звездочка, то легко определить, какому количеству символов имени файла она соответствует. Если длина маски n, а длина имени файла равна m, то m≥(n − 1) (иначе решения нет) и звездочку в маске можно заменить на (n − m+ 1) знак “?”, после чего проверить соответствие маски имени файла.

Реализация

C#

https://gist.github.com/unilecs/5a5206b58f5d82bbedfed7eb434684ad

Play-test

https://dotnetfiddle.net/9vSyZO

--

--