Сортировка по-японски - 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