Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
16 / 18 / 11
Регистрация: 07.03.2016
Сообщений: 362
1

Почти одинаковые названия

09.09.2017, 18:15. Показов 1203. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я нахожусь в папке А1. У нее есть несколько дочерних папок. Например, Б1, Б2, Б3. В каждой из них либо лежат файлы, либо еще папки В1, В2, в которых уже лежат файлы. Моя программа идет по всем этим папкам и копирует оттуда файлы *.mp3 в папочку А2. Раньше я делал это рекурсией,
Вот так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uses System.IO, util;
 
const
  s1 = 'C:\Музыка в подпапках';
  s2 = 'C:\Музыка в одной папке';
 
procedure abc(path: string);
begin
  var dir := new DirectoryInfo(path);
  var ins := dir.GetDirectories;
  execute('cmd', '/C copy "' + path + '\*.mp3" "' + s2 + '"');
  if(length(ins) > 0) then
    for i: integer := 0 to length(ins) - 1 do
    begin
      var s := path + '\' + ins[i].ToString;
      abc(s);
    end;
end;
 
begin
  abc(s1);
end.

, но потом мне объяснили, что это неправильно, и я стал делать
Вот так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uses System.IO, util;
 
const
  s1 = 'C:\Музыка в подпапках';
  s2 = 'C:\Музыка в одной папке';
 
begin
  var dir := new DirectoryInfo(s1);
  var res := dir.GetFiles('*.mp3', SearchOption.AllDirectories);
  for i: integer := 0 to length(res) - 1 do
  begin
    execute('cmd', '/C copy "' + res[i].FullName + '" "' + s2 + '"');
    a -= 1;
  end;
end.

Еще в программе я запоминаю, какие файлы скопировал и если в какой-то папке встретил еще раз файл с таким же именем, не копирую его. Вопрос вот в чем. Может быть, например, такое, что в двух разных папках у одинаковых файлов различаются 1-3 символа или не хватает 1-3 символов в названии одного файла по сравнению с другим. Где стоят различающиеся или отсутствующие символы, я не знаю. Как сделать так, чтобы файлы, у которых разница с уже скопированным 3 или меньше символов тоже не копировались? Для простоты давайте считать, что различающиеся или отсутствующие символы могут стоять только в начале, но буду очень благодарен, если покажете, как отследить их в любом месте... Как различающиеся символы сделать я примерно представляю, но вот отсутствующие в середине названия...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2017, 18:15
Ответы с готовыми решениями:

Почти одинаковые домены
Здравствуйте , у меня вопрос , как относятся поисковики к почти одинаковым доменам ( net , com ) ....

почти одинаковые элементы массива
Добрый день. Ситуация следующая: есть массив { {x,x}, {x,x}, {2,3}, {3,2}, {x,x} }

Почти одинаковые страницы с разными адресами
Вроде в форуме подобного не нашел. Есть на странице календарь, который пишет в адресе страницы...

Генерируются почти одинаковые случайные числа
Подскажите, пожалуйста, почему при повторных запусках программы каждый раз генерируются случайные...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
09.09.2017, 18:47 2
Лучший ответ Сообщение было отмечено kolay_ne как решение

Решение

Я бы посчитал расстояние Левенштейна между этими названиями, оно как раз и выдаст количество различающихся/недостающих букв. Проверить онлайн, что будет выдано, перед тем, как начинать программировать вычисление дистанции, можно здесь
2
16 / 18 / 11
Регистрация: 07.03.2016
Сообщений: 362
09.09.2017, 19:43  [ТС] 3
Цитата Сообщение от volvo Посмотреть сообщение
посчитал
Как это сделать?Видимо, мне должна была помочь картинка, но я ее не понял... https://wikimedia.org/api/rest... d0183eec8c
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
09.09.2017, 20:41 4
Лучший ответ Сообщение было отмечено kolay_ne как решение

Решение

На картинке - не самый эффективный рекурсивный способ вычисления:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function Dist(s1, s2: string): integer;
  
  function Levenshtein(s1: string; len_s1: integer; 
                       s2: string; len_s2: integer): integer;
  begin
    if Min(len_s1, len_s2) = 0 then 
      result := Max(len_s1, len_s2)
    else
      result := Arr(Levenshtein(s1, len_s1 - 1, s2, len_s2) + 1,
                    Levenshtein(s1, len_s1, s2, len_s2 - 1) + 1,
                    Levenshtein(s1, len_s1 - 1, s2, len_s2 - 1) + (s1[len_s1] = s2[len_s2] ? 0 : 1)).Min;
  end;
 
begin
  result := Levenshtein(s1, Length(s1), s2, Length(s2));
end;
 
begin
  writeln(Dist('sart', 'start')); // проверяем
end.
В англоязычной статье на Вики есть и коды для итеративного вычисления дистанции.
1
16 / 18 / 11
Регистрация: 07.03.2016
Сообщений: 362
09.09.2017, 22:55  [ТС] 5
volvo, Что-то не так. Вроде работает, но машина подсказывает непроходимые тесты:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function Dist(s1, s2: string): integer;
  
  function Levenshtein(s1: string; len_s1: integer; 
                       s2: string; len_s2: integer): integer;
  begin
    if Min(len_s1, len_s2) = 0 then 
      result := Max(len_s1, len_s2)
    else
      result := Arr(Levenshtein(s1, len_s1 - 1, s2, len_s2) + 1,
                    Levenshtein(s1, len_s1, s2, len_s2 - 1) + 1,
                    Levenshtein(s1, len_s1 - 1, s2, len_s2 - 1) + (s1[len_s1] = s2[len_s2] ? 0 : 1)).Min;
  end;
 
begin
  result := Levenshtein(s1, Length(s1), s2, Length(s2));
end;
 
begin
  writeln(Dist('01. ночь.mp3', '02. хоровод.mp3')); //Берет и вешается
end.
Добавлено через 1 час 9 минут
volvo, Взял готовую реализацию с википедии. Она не шибко красивая, но норм работает. Завтра попробую покрасивее сделать путем перевода с python...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
10.09.2017, 00:17 6
Цитата Сообщение от kolay_ne Посмотреть сообщение
//Берет и вешается
Ну я же написал:
Цитата Сообщение от volvo Посмотреть сообщение
не самый эффективный рекурсивный способ вычисления
Значит, возьмем и сделаем его более эффективным (при помощи запоминания промежуточных результатов вместо их многократного пересчета - то есть, мемоизации). Итого имеем:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function Dist(s1, s2: string): integer;
 
  var m : array [,] of integer;
  
  function Levenshtein(len_s1: integer; 
                       len_s2: integer): integer;
                       
    function Check(ix1, ix2 : integer) : integer;
    begin
      if m[ix1, ix2] = -1 then m[ix1, ix2] := Levenshtein(ix1, ix2);
      result := m[ix1, ix2];
    end;
    
  begin
    if Min(len_s1, len_s2) = 0 then result := Max(len_s1, len_s2)
    else
    begin
      m[len_s1, len_s2] := Arr(Check(len_s1 - 1, len_s2) + 1,
                               Check(len_s1, len_s2 - 1) + 1,
                               Check(len_s1 - 1, len_s2 - 1) + (s1[len_s1] = s2[len_s2] ? 0 : 1)).Min;
      result := m[len_s1, len_s2];
    end;
  end;
 
begin
  m := MatrFill(length(s1) + 1, length(s2) + 1, -1);
  result := Levenshtein(Length(s1), Length(s2));
end;
 
begin
  writeln(Dist('01. ночь длинный текст_проверка .mp3', '02. хоровод длинный текст_проверка .mp3')); // результат возвращается мгновенно
end.
0
10.09.2017, 00:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2017, 00:17
Помогаю со студенческими работами здесь

Как сократить почти одинаковые куски кода?
Создаю оконное приложение. Дело в том, что у меня есть 4 одинаковых куска кода, я не знаю как...

Слить две почти одинаковые базы данных в одну
Есть как минимум две (а вообще их больше) базы данных с полностью одинаковой структурой, которые...

Одинаковые названия функций QT и Socket
Добрый день. Вопрос заключается в том, что мне нужно написать программу работающую с помощью...

Одинаковые названия id для 2х кнопок
Пишу приложение и там есть 2 xml файла,что то типа диалога,там я ввожу данные элемента которого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru