Сортировка по-японски - Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите решить следующую задачу Задача 1546 сайт acm.timus.ru Японцы любят фотографировать. Но фотографии, сделанные цифровым фотоаппаратом, не всегда корректно сортируются на компьютере: например, файл photo12.jpg почему-то находится между файлами photo1.jpg и photo2.jpg — и фотографии при просмотре идут не в том порядке. Некоторые японцы используют систему, которая сортирует строки по другим, японским, правилам, и у них числа сортируются естественным образом: лексикографический порядок photo2 photox1 photox10 photox2 японский порядок photo2 photox1 photox2 photox10 Полностью эти правила излагаться в условии не будут. Они достаточно просты и логичны. Попробуйте проникнуться духом Японии и сами определить их. Формат входных данных: В первой строке задается n - количество слов (1<=n<=10000). Далее следует n cтрок, содержащие только строчные латинские буквы и цифры (длина строки не превосходит 128 символов). Общий объем входных данных не превосходит 100 КБ. Формат выходных данных: Выведите те же строки, но отсортированные в соответствии с японскими правилами. Входные данные 4 photo2 photox1 photox10 photox2 Выходные данные photo2 photox1 photox2 photox10

Решение задачи: «Сортировка по-японски»

textual
Листинг программы
function IsLess(const pa, pb: PChar): Boolean;
const D = ['0'..'9']; D0 = D+[#0];
var
  a, b, ta, tb, za, zb: PChar;
begin
  a:=pa; b:=pb;
  while (a^<>#0) and (b^<>#0) do begin
    while not (a^ in D0) and not (b^ in D0) and (a^=b^) do begin
      Inc(a); Inc(b);
    end;
    if (a^ in D) and (b^ in D) then begin
      za:=a; while a^='0' do Inc(a); ta:=a; while a^ in D do Inc(a);
      zb:=b; while b^='0' do Inc(b); tb:=b; while b^ in D do Inc(b);
      if a-ta<>b-tb then begin
        IsLess:=a-ta<b-tb; Exit;
      end else begin
        a:=ta; b:=tb;
        while (a^ in D) and (b^ in D) and (a^=b^) do begin
          Inc(a); Inc(b);
        end;
        if a^ in D then Break;
        if a-za<>b-zb then begin
          IsLess:=a-za<b-zb; Exit;
        end;
      end;
    end else Break;
  end;
  IsLess:=a^<b^;
end;

Объяснение кода листинга программы

Список элементов кода, оформленных в виде нумерованного списка:

  1. Объявление функции IsLess с двумя параметрами типа PChar
  2. Объявление константы D, содержащей символы от '0' до '9'
  3. Объявление переменных a, b, ta, tb, za, zb типа PChar
  4. Установка начального значения переменных a и b
  5. Пока a и b не равны нулю, выполняется следующий блок кода
  6. Пока a и b не содержат символов из D, и a не равно b, выполняется следующий блок кода
  7. Если a и b содержат символы из D, то выполняется следующий блок кода
  8. Переменная a инкрементируется до тех пор, пока не будет найден ноль
  9. Переменная ta устанавливается равной a
  10. Пока a содержит символы из D, выполняется инкремент a
  11. Если a содержит символы из D, то выполняется переход к блоку кода с номером 19
  12. Переменная b инкрементируется до тех пор, пока не будет найден ноль
  13. Переменная zb устанавливается равной b
  14. Пока b содержит символы из D, выполняется инкремент b
  15. Если a и b содержат символы из D, и a равно b, то выполняется следующий блок кода
  16. Переменные a и b инкрементируются до тех пор, пока не будет найден ноль
  17. Если a и b содержат символы из D, и a не равно b, то выполняется следующий блок кода
  18. Переменная IsLess устанавливается в значение a-ta < b-zb
  19. Если a содержит символы из D, то выполняется переход к блоку кода с номером 8
  20. Если b содержит символы из D, то выполняется переход к блоку кода с номером 16
  21. Переменная IsLess устанавливается в значение a < b
  22. Конец функции IsLess

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы