Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Функция сравнения двух кортежей. Пока ее пропусти, прочитаешь, как придет время.
- #Она выдаст булевскую величину, меньше ли первый кортеж второго
- def isLess(x, y):
- #Если первый кортеж нечисловой, а второй - числовой, то первый всяко меньше
- if x[0] == 0.5 and y[0] != 0.5:
- return True
- #Если первый кортеж числовой, а второй - нечисловой, то первый всяко не меньше
- elif x[0] != 0.5 and y[0] == 0.5:
- return False
- #Если оба кортежа нечисловые, то сравниваем их строки после модификаторов -b и -f, т.е. i
- elif x[0] == 0.5 and y[0] == 0.5:
- return x[1] < y[1]
- #Если оба кортежа числовые, то сравниваем их числа, если они равны, сравниваем остатки строк
- else:
- if x[0] < y[0]:
- return True
- elif x[0] > y[0]:
- return False
- else:
- return x[2] < y[2]
- #конец функции.
- #начало программы
- input = open('input.txt', 'r')
- #считываем из файла весь текст
- modifiers = input.readline()
- #считываем первую строку, в которой только модификаторы
- modifiers = set(modifiers.split())
- #преобразовать строку в список, который преобразуем в сет, чтобы убрать дублирующиеся модификаторы
- s = input.read() #считать все оставшиеся строки
- s = s.split("\n") #преобразовать в массив по переносам строки
- k = [] #это будет массив кортежей, которые будем, собственно, сравнивать
- for i in s: #i - изначально вводилась такая строка
- basei = i #basei будет хранить строку в том виде, в котором она вводилась
- datNumber = 0.5
- #в datNumber хранится число в строке, если оно будет. Если его нет, оно равно 0.5
- #если вводился модификатор "-b"
- if "-b" in modifiers:
- #убрать пробелы!
- i = i.lstrip()
- #если вводился модификатор "-f"
- if "-f" in modifiers:
- #преобразовать строку в строчные буквы
- i = i.lower()
- #i2 - это будет строка, начинающаяся после числа, если число будет. пока он равна i
- i2 = i
- #если "-g" в модификаторах, то начинается боль:
- if "-g" in modifiers:
- #работаем со строкой i2. Сначала убираем в ней пробелы:
- i2 = i2.lstrip()
- #j - это тот элемент строки i2, на котором сейчас находимся
- #isThereNumber - покажет есть ли число в строке или нет
- #isNegative - покажет начинается ли строка с "-" или нет
- j = 0
- isThereNumber = False
- isNegative = False
- #Пройдемся по строке i2 в поиске числа
- while j < len(i2):
- #Если нашли циферку, то выходим из цикла, предварительно записав, что число есть
- if i2[j].isnumeric():
- isThereNumber = True
- break
- #Если нашли "-", ранее его не находив, то если число и будет, оно будет отрицательным.
- #Тогда запишем это в наше переменную и идем дальше
- elif i2[j] == '-' and not isNegative:
- isNegative = True
- j += 1
- #Во всех остальных случаях (дублирующаяся "-", либо не-цифра) просто выходим из цикла
- else:
- break
- #конец прохода по строке в поисках числа
- #Сюда заходим только если точно есть число
- if isThereNumber:
- #В datNumber хранится число данной строки.
- #На данный момент j показывает на первую циферку
- datNumber = int(i2[j])
- j += 1
- #Пока не доходим до конца строки:
- while j < len(i2):
- #Если данный элемент строки - это вновь цифра, то приписываем ее к имеющемуся числу
- #то есть умножаем число на 10 (сдвигаем его влево, оставив слева 0)
- #прибавляем новую циферку. Ну и переходим к следующему элементу строки.
- if i2[j].isnumeric():
- datNumber = datNumber*10 + int(i2[j])
- j += 1
- #Если это уже не цифра, то нам более неинтересно. Выходим из цикла нахождения числа.
- else:
- break;
- #Конец вычисления числа
- #Если ранее мы нашли минус, то число умножаем на -1, т.е. делаем отрицательным
- if isNegative:
- datNumber *= -1
- #Это остаток строки после цифры.
- #Он нам тоже понадобится, чтобы сравнивать "числовые" строки в случае,
- #если числа в строках будут равны
- i2 = i2[j:]
- #конец условия, если мы нашли число
- #Если же числа не оказалось, то вновь делаем i2 равным i (хотя вроде это не обяз)
- else:
- i2 = i
- #конец работы с модификатором -g
- #Вот мы и учли 3 из 4 модификаторов.
- #В массив k добавляем кортеж из:
- # 1. Числа, если оно есть, если нет, то это значение = 0.5
- # 2. Строки после модификаторов -b и -f
- # 3. Остатка строки после числа
- # 4. Строки, которая вводилась
- k.append((datNumber, i, i2, basei))
- #Внимание! Если не зашли в -g, то ВСЕ строки нечисловые и их datNumber = 0.5
- #Тут сначала надо разобраться с написанной функцией isLess(x,y),
- #которая считает меньше ли кортеж x кортежа y.
- #Далее пузырьковая сортировка
- for i in range(len(k)):
- for j in range(len(k)-i-1):
- #Что это за условие. Если первый элемент меньше второго и есть модификатор -r
- #Или первый элемент больше второго и -r не вводится, то меняем местами.
- if (isLess(k[j], k[j+1])) == ("-r" in modifiers):
- k[j], k[j+1] = k[j+1], k[j]
- #Теперь k отсортирован как нам надо. Вспоминаем, что там хранились базовые строки (basei), их и выводим
- for i in k:
- print(i[3])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement