Advertisement
SergeySterkhov

task_3

Oct 4th, 2015
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.87 KB | None | 0 0
  1. #Функция сравнения двух кортежей. Пока ее пропусти, прочитаешь, как придет время.
  2. #Она выдаст булевскую величину, меньше ли первый кортеж второго
  3. def isLess(x, y):
  4.  
  5.     #Если первый кортеж нечисловой, а второй - числовой, то первый всяко меньше
  6.     if x[0] == 0.5 and y[0] != 0.5:
  7.         return True
  8.  
  9.     #Если первый кортеж числовой, а второй - нечисловой, то первый всяко не меньше
  10.     elif x[0] != 0.5 and y[0] == 0.5:
  11.         return False
  12.  
  13.     #Если оба кортежа нечисловые, то сравниваем их строки после модификаторов -b и -f, т.е. i
  14.     elif x[0] == 0.5 and y[0] == 0.5:
  15.         return x[1] < y[1]
  16.  
  17.     #Если оба кортежа числовые, то сравниваем их числа, если они равны, сравниваем остатки строк
  18.     else:
  19.         if x[0] < y[0]:
  20.         return True
  21.     elif x[0] > y[0]:
  22.         return False
  23.     else:
  24.         return x[2] < y[2]
  25. #конец функции.
  26.  
  27. #начало программы
  28. input = open('input.txt', 'r')
  29. #считываем из файла весь текст
  30.  
  31. modifiers = input.readline()
  32. #считываем первую строку, в которой только модификаторы
  33.  
  34. modifiers = set(modifiers.split())
  35. #преобразовать строку в список, который преобразуем в сет, чтобы убрать дублирующиеся модификаторы
  36.  
  37. s = input.read() #считать все оставшиеся строки
  38. s = s.split("\n") #преобразовать в массив по переносам строки
  39.  
  40. k = [] #это будет массив кортежей, которые будем, собственно, сравнивать
  41.  
  42. for i in s: #i - изначально вводилась такая строка
  43.     basei = i #basei будет хранить строку в том виде, в котором она вводилась
  44.  
  45.     datNumber = 0.5
  46.     #в datNumber хранится число в строке, если оно будет. Если его нет, оно равно 0.5
  47.  
  48.     #если вводился модификатор "-b"
  49.     if "-b" in modifiers:
  50.     #убрать пробелы!
  51.         i = i.lstrip()
  52.  
  53.     #если вводился модификатор "-f"
  54.     if "-f" in modifiers:
  55.     #преобразовать строку в строчные буквы
  56.         i = i.lower()
  57.  
  58.     #i2 - это будет строка, начинающаяся после числа, если число будет. пока он равна i
  59.     i2 = i
  60.  
  61.     #если "-g" в модификаторах, то начинается боль:
  62.     if "-g" in modifiers:
  63.    
  64.     #работаем со строкой i2. Сначала убираем в ней пробелы:
  65.         i2 = i2.lstrip()
  66.  
  67.     #j - это тот элемент строки i2, на котором сейчас находимся
  68.     #isThereNumber - покажет есть ли число в строке или нет
  69.     #isNegative - покажет начинается ли строка с "-" или нет
  70.         j = 0
  71.         isThereNumber = False
  72.         isNegative = False
  73.  
  74.     #Пройдемся по строке i2 в поиске числа
  75.         while j < len(i2):
  76.        
  77.         #Если нашли циферку, то выходим из цикла, предварительно записав, что число есть
  78.             if i2[j].isnumeric():
  79.                 isThereNumber = True
  80.                 break
  81.  
  82.         #Если нашли "-", ранее его не находив, то если число и будет, оно будет отрицательным.
  83.         #Тогда запишем это в наше переменную и идем дальше
  84.             elif i2[j] == '-' and not isNegative:
  85.                 isNegative = True
  86.                 j += 1
  87.  
  88.         #Во всех остальных случаях (дублирующаяся "-", либо не-цифра) просто выходим из цикла
  89.             else:
  90.                 break
  91.     #конец прохода по строке в поисках числа
  92.    
  93.     #Сюда заходим только если точно есть число
  94.         if isThereNumber:
  95.  
  96.         #В datNumber хранится число данной строки.
  97.         #На данный момент j показывает на первую циферку
  98.             datNumber = int(i2[j])
  99.             j += 1
  100.  
  101.         #Пока не доходим до конца строки:
  102.             while j < len(i2):
  103.        
  104.         #Если данный элемент строки - это вновь цифра, то приписываем ее к имеющемуся числу
  105.         #то есть умножаем число на 10 (сдвигаем его влево, оставив слева 0)
  106.         #прибавляем новую циферку. Ну и переходим к следующему элементу строки.
  107.                 if i2[j].isnumeric():
  108.                     datNumber = datNumber*10 + int(i2[j])
  109.                     j += 1
  110.  
  111.         #Если это уже не цифра, то нам более неинтересно. Выходим из цикла нахождения числа.
  112.                 else:
  113.                     break;
  114.         #Конец вычисления числа
  115.  
  116.         #Если ранее мы нашли минус, то число умножаем на -1, т.е. делаем отрицательным
  117.             if isNegative:
  118.                 datNumber *= -1
  119.  
  120.         #Это остаток строки после цифры.
  121.         #Он нам тоже понадобится, чтобы сравнивать "числовые" строки в случае,
  122.         #если числа в строках будут равны
  123.             i2 = i2[j:]
  124.     #конец условия, если мы нашли число
  125.  
  126.     #Если же числа не оказалось, то вновь делаем i2 равным i (хотя вроде это не обяз)
  127.         else:
  128.             i2 = i
  129.     #конец работы с модификатором -g
  130.  
  131.     #Вот мы и учли 3 из 4 модификаторов.
  132.     #В массив k добавляем кортеж из:
  133.     # 1. Числа, если оно есть, если нет, то это значение = 0.5
  134.     # 2. Строки после модификаторов -b и -f
  135.     # 3. Остатка строки после числа
  136.     # 4. Строки, которая вводилась
  137.     k.append((datNumber, i, i2, basei))
  138.        
  139.     #Внимание! Если не зашли в -g, то ВСЕ строки нечисловые и их datNumber = 0.5
  140.  
  141. #Тут сначала надо разобраться с написанной функцией isLess(x,y),
  142. #которая считает меньше ли кортеж x кортежа y.
  143.  
  144. #Далее пузырьковая сортировка
  145. for i in range(len(k)):
  146.     for j in range(len(k)-i-1):
  147.  
  148.     #Что это за условие. Если первый элемент меньше второго и есть модификатор -r
  149.     #Или первый элемент больше второго и -r не вводится, то меняем местами.
  150.         if (isLess(k[j], k[j+1])) == ("-r" in modifiers):
  151.             k[j], k[j+1] = k[j+1], k[j]
  152.  
  153. #Теперь k отсортирован как нам надо. Вспоминаем, что там хранились базовые строки (basei), их и выводим
  154. for i in k:
  155.     print(i[3])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement