代入禁止縛り。
試し割り
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以降専用です)。