- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
maxi=140000
plist=set(primes(maxi))
dlist={}
def dp(n):
if dlist.has_key(n):
return dlist[n]
else:
facts= len([k for k in plist if n%k==0])
dlist[n]=facts
return facts
print [k for k in range (1,maxi) if dp(k)==4 and dp(k+1)==4 and dp(k+2)==4 and dp(k+3)==4]
TheHamstertamer 12.06.2012 15:17 # +4
3.14159265 12.06.2012 15:53 # +1
TheHamstertamer 12.06.2012 16:18 # +1
11тый пост сверху
bormand 12.06.2012 16:25 # +2
> for (int i = 2 ; i <= Math.sqrt(number) ; i++)
Ява умеет оптимизировать такие штуки? Или это будет гонять sqrt на каждой итерации?
bormand 12.06.2012 16:28 # 0
if (prime*prime > candidate) же!
Печальный код :(
TarasB 12.06.2012 15:33 # +1
3.14159265 12.06.2012 15:56 # +2
Но это только на первый.
Если всмотреться - делается full-scan списка всех простых чисел.
([k for k in plist if n%k==0])
Оно вроде и выглядит компактно, логично, красиво, но внутри пиздец.
ЗЫ. А в пухтоне вот так можно писать:
return ( dlist[n]= len([k for k in plist if n%k==0]) )
TarasB 12.06.2012 16:50 # 0
Да сколько их там? n/log(n) вроде, да, тогда многовато.
> ЗЫ. А в пухтоне вот так можно писать:
И чё, для кешированного значения оно сразу вернёт значение?
bormand 12.06.2012 16:55 # −1
Вроде присваивания внутри выражений там недопустимы. Не уверен, т.к. не знаю питон, и имею к нему индивидуальную непереносимость.
3.14159265 12.06.2012 17:09 # +3
Такая же херня.
Это я типа так спросил. Можно ли.
Vindicar 12.06.2012 19:08 # 0
TheHamstertamer 12.06.2012 20:04 # 0
guest 12.06.2012 22:07 # −3
bormand 12.06.2012 16:09 # +1
Решение в лоб на хаскеле 0.21с. А если дописать primes :: [Int] то 0.08с :)
А автор, конечно жжот, сканируя ВЕСЬ список простых чисел :)
3.14159265 12.06.2012 16:31 # 0
TheHamstertamer 12.06.2012 16:36 # −1
Haskell - 6
Python - ~11
bormand 12.06.2012 16:42 # +3
P.S. А че не в одну строку все ? )
TheHamstertamer 12.06.2012 20:13 # +1
Показать свою джедайскую силу.
3.14159265 12.06.2012 20:16 # +1
В путхоне самая длинная
print [k for k in range (1,maxi) if dp(k)==4 and dp(k+1)==4 and dp(k+2)==4 and dp(k+3)==4]
И то её можно написать короче.
bormand 12.06.2012 20:25 # +1
Если уж меряться длиной кода - то символами а не строками.
TheHamstertamer 12.06.2012 20:32 # 0
Haskell - 516
Python - 298
В таком случае все же короче.
bormand 12.06.2012 20:34 # 0
guest 12.06.2012 20:35 # +2
bormand 12.06.2012 20:39 # +3
guest 12.06.2012 20:43 # +3
bormand 12.06.2012 17:01 # +1
Что за отвратная факторизация по p <- [2..n], isPrime p, выше же у вас описан primes... Да еще и фулл-скан как в оригинальном посте... Или это просто попытка переписать код дословно?
TheHamstertamer 12.06.2012 20:08 # 0
Сортоф.
Он медленный от того, что я на своей машине использовал следующий код:
А в примере для краткости заменил его на код выше.
Такие дела.
bormand 12.06.2012 20:33 # +1
Хотя вот вопрос: в последней строке считается map (length . nub . factorize) [x, y, z, c], а перед этим пачка let'ов.
1) Почему бы не убрать let и не сделать [x, x+1, x+2, x+3]?
2) Получается в 4 раза больше факторизаций, чем в моем варианте?
TheHamstertamer 12.06.2012 20:44 # +2
2) Да вроде, я сильно оптимизацией не заморачевался, подумал, что если будет тупить, то перепишу, но оно и так выполняется за <1 сек.
guest 12.06.2012 17:16 # +1
Говно.
У борланда лучше норм:
http://ideone.com/3bCAe
vistefan 12.06.2012 18:55 # +1
bormand 12.06.2012 18:57 # +5
geust 13.06.2012 09:36 # +1
guest 12.06.2012 20:30 # +2
TarasB 12.06.2012 21:59 # +2
guest 12.06.2012 22:03 # −5
guest 12.06.2012 22:57 # +3
JavaGovno 13.06.2012 11:51 # −6
guest 12.06.2012 21:01 # +2
bormand 12.06.2012 16:40 # +1
P.S. У этого кода на хаскеле есть плюс - из-за работы с бесконечным списком не нужно подбирать верхнюю планку для простых чисел (140000 в оригинальном решении).
Vindicar 12.06.2012 21:09 # 0
guest 12.06.2012 21:15 # 0
Во-вторых, генератор-то линеен, если нужен кэш, то не проще ли functools.lru_cache?
Vindicar 12.06.2012 21:22 # 0
И потом, что именно заворачивать в lru_cache? primes()? Так оно аргументов не просит, кэш не сработает. Код целиком как функцию? Не ну можно конечно, но большой ли будет выигрыш?
guest 12.06.2012 21:30 # +1
Vindicar 12.06.2012 21:44 # 0
guest 12.06.2012 22:56 # 0
Можно написать свой простенький вариант, вряд ли получится длинее, чем генератор + Set.
Но maxprime - явный хак: если не знать порядок, то получится либо оверхэд, либо усложнение (проверять не отстал ли он и подтягивать при необходимости).
Vindicar 13.06.2012 11:56 # +1
Вообще есть более интересный вариант:
Для тех кто не знает питона: последний else относится к while, и сработает если произойдёт нормальный выход из цикла по условию, а не по break/return/exception.
Т.е. мы точно знаем что в кэше числа нет, и не трогаем его, а вместо этого проверяем свежеполученные числа. При этом кэш все равно обновляется.
Правда, может получиться дурацкая ситуация когда промах кэша будет отрабатывать быстрее чем попадание.
TarasB 13.06.2012 19:40 # 0
Vindicar 13.06.2012 20:01 # +2
Без такой конструкции пришлось бы вводить флаг "элемент найден". Пустячок, а приятно, и никто пользоваться не заставляет.
Такой else есть у циклов for, while, и у блока try. В последнем случае он выполнится только если при выполнении try НЕ произошло исключения. Привести пример для этого я затрудняюсь, правда.
TarasB 13.06.2012 20:10 # +1
bormand 13.06.2012 20:29 # +3
"The use of the else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try ... except statement."
Т.е. если в readlines у нас вылетит ошибка чтения - мы не выдадим кривое сообщение "не могу открыть файл".
Pedofil 12.06.2012 17:06 # −11
guest 12.06.2012 22:05 # −8
JavaGovno 13.06.2012 11:51 # −6