Python

合成数列の和 (Python2/3)

合成数列の和
https://qiita.com/advent-calendar/2018/composite-number

Python(/Ruby)
https://qiita.com/cielavenir/items/dcbd839b0c66af1bc971

Crystal
https://qiita.com/cielavenir/items/1a0dd1a94aca9935f5aa

Kuin
https://qiita.com/cielavenir/items/47fd18fc68055d990599

Swift
https://qiita.com/cielavenir/items/6cde3b20866c842dc9e2

Kotlin
https://qiita.com/cielavenir/items/f58eaa30f90781229a6d

Pascal
https://qiita.com/cielavenir/items/35c2fc54ca16b620c9c7

代入禁止縛り。


試し割り

isqrtモジュールが入っていれば 自前の平方根算出により、平方根までのチェックになります。


composite.py

import sys,itertools

def isqrt(n):
if n<=0: return 0
if n<4: return 1
x,y=0,n
while x!=y and x+1!=y:
x,y=y,(n//y+y)//2
return x

def composite_numbers():
for i in itertools.count(4):
if any(not i%j for j in range(2,isqrt(i)+1)):
yield i

print(sum(itertools.islice(composite_numbers(),int(sys.stdin.readline()))))


同様の処理をRubyで書くと以下のようになります。Ruby 2.5以降ではInteger.sqrtが標準で使えます。


composite.rb

p (4..).lazy.select{|i|(2..Integer.sqrt(i)).any?{|j|i%j<1}}.take(gets.to_i).sum



素因数分解

Pythonだと非標準モジュールが必須です(試し割りの際はモジュールがなければフォールバックできた)


prime.py

import sys,itertools

import sympy

print(sum(itertools.islice((i for i in itertools.count(4) if not sympy.ntheory.primetest.isprime(i)),int(sys.stdin.readline()))))



prime.rb

require'prime'

p (4..).lazy.select{|i|!i.prime?}.take(gets.to_i).sum

# Rangeの終端、Ruby 2.6だと省略できるのを下書き後に知り。この記事公開25日にすればよかったと思ったけど後の祭りです(∴こちらのプログラムは2.6以降専用です)。