Форум сайта python.su
0
Решаю очередную задачу - http://acm.timus.ru/problem.aspx?space=1&num=1209
Для решения, сперва решил генерировать строку длинна которой не превышает необходимую (исходя из полученных чисел), но код не справлялся даже с пяти/шестизначными значениями (т.е. обрабатывал ооочень долго). Потом решил отказаться от громоздкой строки и просто записывал длину числом (методом сложения длины строки каждой возведённый в степень 10ки).
def calculate_position(number): count = 0 sequence = 0 while sequence < int(number): x = 10 ** count sequence += int(len(str(x))) count += 1 answer = str(x)[sequence - int(number) + 1] return answer
Отредактировано Tucha (Окт. 6, 2015 05:22:40)
Офлайн
253
>>> int(len(str(10**1))) 2 >>> int(len(str(10**2))) 3 >>> int(len(str(10**3))) 4 >>> int(len(str(10**4))) 5 >>> int(len(str(10**5))) 6
Отредактировано doza_and (Окт. 6, 2015 05:15:25)
Офлайн
0
doza_andТам точка в конце просто стояла.
Что вы решаете непонятно. Ссылка не показывает задачу.
doza_andЯ собственно за алгоритмом сюда и пришёл. У людей владеющих математикой, с обширным знанием модулей и внушительным опытом побольше вероятность составить грамотный алгоритм чем у меня.
Оптимизация это всегда поиск подходящего алгоритма
doza_andЯ вот и хочу узнать, как вычислить длину этого списка не запуская процесс уничтожения ЦП
Конечно рецепты типа не вычисляйте постоянно int(number)
Офлайн
857
Вот тебе самый короткий O(n) алгоритм
def f(n): i = 1 while n > i: n -= i i += 1 return (1, 0)[n > 1]
[guest@localhost ~]$ python3 -mtimeit -s '
> def f(n):
> i = 1
> while n > i:
> n -= i
> i += 1
> return (1, 0)[n > 1]
> ' 'f(2147483647)'
100 loops, best of 3: 16.2 msec per loop
[guest@localhost ~]$
Офлайн
0
py.user.nextДля меня тут много не понятно
Хотя так, он быстрый и, главное, понятный.

Отредактировано Tucha (Окт. 6, 2015 07:31:11)
Офлайн
857
Tucha
Во первых, что означает этот возврат return ‘(1, 0)’
(1, 0)[n > 1]
>>> (10, 20)[True] 20 >>> (10, 20)[False] 10 >>>
TuchaЭто выполняется в консоли линукс
Во вторых, какая функция у множества ковычек
[guest@localhost ~]$ echo a 'b
> c
> d
> e' f g h 'i
> j
> k
> l' m n
a b
c
d
e f g h i
j
k
l m n
[guest@localhost ~]$
a b
c
d
e f g h i
j
k
l m n
Офлайн
0
Предельно ясно. Эффективное использование логических операторов пока не моё.
А на счёт юниксовых ОСей, ещё вопрос. Есть ли какой то весомый аргумент (сопряжённый с программированием на питоне) для того, что бы пересесть с винды на на какую нибудь убунту. А то много кто пишет “кодить на питоне под виндой не комильфо”, но конкретных причин никто не называет.
Офлайн
857
Да винда сама по себе хуже линукса, потому что пишется на продажу. Поэтому там главное - картинка, а качество на втором плане.
TuchaДа, и его меньше тестируют на винде, поэтому часто на винде выпадает и сам питон, и сторонние модули для него.
сопряжённый с программированием на питоне
Отредактировано py.user.next (Окт. 6, 2015 08:26:24)
Офлайн
0
Ладно, спасибо.
Поставлю пока на виртуалку, что нибудь из юникс семейства, на тест.
Офлайн