![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| proDiva |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 19.9.2006 Где: КЧР, Россия Репутация: 7 Всего: 7 |
Значит задание такое: необходимо проставить номера рейсов, причем преобразовать из 36-ричной системы в 10-ричную. Прилагаю код, хочу упростить. Помогайте
|
|||
|
||||
| albertn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Что-то вроде этого
|
|||
|
||||
| proDiva |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 19.9.2006 Где: КЧР, Россия Репутация: 7 Всего: 7 |
albertn, и Вы хотите сказать, что вот этот КУСОЧЕК делает то, что мне нужно?
а можно небольшую расшифровку?))) |
|||
|
||||
| J2A |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 17.11.2005 Где: Омск Репутация: 16 Всего: 18 |
Сопровождаемость второго варианта -- никакая.
--------------------
Be easy, stay cool |
|||
|
||||
| pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
в смысле читабельность? |
|||
|
||||
| Artemios |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Красиво, только
дает
а так работает:
Если кто-то ++albertn за меня, буду благодарен proDiva, в первой строке внутри функции создает алфавит для 36-ричной системы счисления, во второй -- преобразование входной строки (36-чного числа) в 10-чное число. Добавлено @ 16:09 нет, в смысле: дебаг и документация Это сообщение отредактировал(а) Artemios - 4.10.2006, 16:08 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||
|
|||||
| pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
не вопрос! ясно! Это сообщение отредактировал(а) pythonwin - 4.10.2006, 16:20 |
|||
|
||||
| proDiva |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 19.9.2006 Где: КЧР, Россия Репутация: 7 Всего: 7 |
Для моего "ума" это пока непостижимо
|
|||
|
||||
| J2A |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 17.11.2005 Где: Омск Репутация: 16 Всего: 18 |
Третья строчка. Читать три раза. Не сопровождаемый - значит, что другой человек (либо этот же, но через n недель/месяцев) не поймет что этот код делает и что/где/как исправить в случае ошибки/улучшения. --------------------
Be easy, stay cool |
|||
|
||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
Плохо документированный, я бы сказал. Но на форуме и без этого код такой встречается, так что как есть. А раз код сразу не стал понятен, то объяснение запросить ничего не стоит.
|
|||
|
||||
| Artemios |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Куда albertn подевался?
proDiva, Попытаюсь выполнить чужую работу На входе в a -- строка, представляющая 36-ричное число. Здесь:
строится список символов, из которых могут быть составлены 36-чные числа (т.н. алфавит), получаем: alf == ['0','1','2',...,'8','9','a','b','c',...,'x','y','z'] Строится он таким образом: range(0,10) дает список чисел от 0 до 9, map(str,range(0,10)) строит новый список, полученный применением функции, стоящей в map первым аргументом, к каждому элементу второго аргумента (который является списком). str -- функция, дающая строковое представление своего аргумента, здесь для нее аргументами являются числа, в итоге получаем список ['0','1',...,'9']. Далее,
это выражение строит список ['a','b',...,'y','z'] так: берем порядковый номер первого англицкого символа ord('a'), и бежим от него до порядкового номера последнего символа ord('z'), а так как range верхнюю границу не включает в перечисление, а 'z' мы тоже хотим использовать, то делаем +1, и в итоге range(ord('a'),ord('z')+1) дает список, в котором перечисляются порядковые номера всего буржуйского алфавита от a до z. (Тут, конечно, можно было поговорить про кодовые таблицы, но нам это не важно, важно только, что символы от a до z идут по порядку друг за другом). Далее, к полученному списку порядковых номеров применяем обратную для ord операцию chr -- функция по порядковому номеру возвращает сам символ, то есть после map(chr,...) -- имеем список всех сиволов ['a',...,'z'], который и сшиваем с уже имевшимся ['0',...,'9'] и получаем уже описанный alf. Отметим такое свойство построенного alf, что индекс каждого элемента этого списка есть значение числа, представляемого данным символом в 36-чной системе счисления, т.е. alf[0] == '0' ... alf[9] == '9' alf[10] == 'a' alf[11] == 'b' ... alf[36] == 'z' или, та же запись в обратную сторону: alf.index('0') == 0 (***) ... alf.index('9') == 9 alf.index('a') == 10 alf.index('b') == 11 ... alf.index('z') == 36 (***) А теперь вспомним школьную математику: запись числа в позиционной системе счисления. Пусть для записи числа используется P символов некоторого алфавита, соответственно имеется P-ичная позиционная система счисления. Если число записано в виде A0 A1 A2 ... An, где значение каждого символа Ai удовлетворяет условию 0<=Ai<P , то значением самого числа будет A0*P^n + A1*P^(n-1) + A2*P^(n-2) + ... + An*P^0 (знаком ^ я обозначаю возведение в степень). Это выражение можно переписать в реккурентной форме: (...(((A0*P + A1)*P + A2)*P + A3)...)*P + An , то есть вводим некоторую переменную-накопитель B, присваиваем B = A0, а за тем для i от 1 до n повторяем: B = B*P + Ai (+++) Теперь разберем вторую строчку с учетом математики
В переменной a у нас строка символов, представляющая нужное 36-чное число (в позиционной системе счисления). map(alf.index,a) создает список значений этих символов (смотри выделенный мной вот так (***) столбик). Далее, к полученному списку позиционных значений применяем формулу (+++), реккурентность обеспечивает функция reduce, а длина алфавита len(alf) и есть разрядность нашей системы счисления (в данном случае 36). На выходе имеем искомое значение числа. albertn, с тебя пиво Добавлено @ 02:04 В данном конкретном случае не согласен: здесь как в математике -- нет смысла помнить конкретное доказательство простой теоремы, если знаешь сам принцип доказательства. Здесь - позиционная система счисления, а конкретный алгоритм на конкретном языке - дело в пять минут восстановимое. В общем сплошные "конкретны" -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||||||
|
|||||||||
| proDiva |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 19.9.2006 Где: КЧР, Россия Репутация: 7 Всего: 7 |
||||
|
||||
| pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
Artemios, и есть преподователь. Artemios, +1 Для модераторов - хорошоий пример для wiki по питону. |
|||
|
||||
| proDiva |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 19.9.2006 Где: КЧР, Россия Репутация: 7 Всего: 7 |
||||
|
||||
| pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: 14 Всего: 36 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |