Сортировка по-японски - 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;
Объяснение кода листинга программы
Список элементов кода, оформленных в виде нумерованного списка:
- Объявление функции
IsLess
с двумя параметрами типаPChar
- Объявление константы
D
, содержащей символы от '0' до '9' - Объявление переменных
a
,b
,ta
,tb
,za
,zb
типаPChar
- Установка начального значения переменных
a
иb
- Пока
a
иb
не равны нулю, выполняется следующий блок кода - Пока
a
иb
не содержат символов изD
, иa
не равноb
, выполняется следующий блок кода - Если
a
иb
содержат символы изD
, то выполняется следующий блок кода - Переменная
a
инкрементируется до тех пор, пока не будет найден ноль - Переменная
ta
устанавливается равнойa
- Пока
a
содержит символы изD
, выполняется инкрементa
- Если
a
содержит символы изD
, то выполняется переход к блоку кода с номером 19 - Переменная
b
инкрементируется до тех пор, пока не будет найден ноль - Переменная
zb
устанавливается равнойb
- Пока
b
содержит символы изD
, выполняется инкрементb
- Если
a
иb
содержат символы изD
, иa
равноb
, то выполняется следующий блок кода - Переменные
a
иb
инкрементируются до тех пор, пока не будет найден ноль - Если
a
иb
содержат символы изD
, иa
не равноb
, то выполняется следующий блок кода - Переменная
IsLess
устанавливается в значениеa-ta < b-zb
- Если
a
содержит символы изD
, то выполняется переход к блоку кода с номером 8 - Если
b
содержит символы изD
, то выполняется переход к блоку кода с номером 16 - Переменная
IsLess
устанавливается в значениеa < b
- Конец функции
IsLess
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д