Problem 7

Problem 7

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6^(th) prime is 13.

What is the 10001^(st) prime number?

[code=ruby]i = 2
primes = []
loop do
primes << i if (2…Math.sqrt(i).floor).all? {|e| i % e != 0 }
i += 1
break if primes.size == 10001
end

puts primes.last[/code]

Radarek zasadniczo pozamiatał, ale zrobiłem to w wersji bez tablicy, tj. mniej zasobożerną (chyba też szybszą, bo nie trzeba dopisywać :wink: )

i = 2 n = 0 loop do n += 1 if (2..Math.sqrt(i).floor).all? {|e| i % e != 0 } break if n == 10001 i += 1 end puts i
Huhu, właśnie, może sobie pobenczmarkujemy? :smiley:

[code=ruby]require ‘benchmark’
include Benchmark

PRIME_ID = 10001

def pr7_radarek
i = 2
primes = []
loop do
primes << i if (2…Math.sqrt(i).floor).all? {|e| i % e != 0 }
i += 1
break if primes.size == PRIME_ID
end

primes.last
end

def pr7_tomash
i = 2
n = 0
loop do
n += 1 if (2…Math.sqrt(i).floor).all? {|e| i % e != 0 }
break if n == PRIME_ID
i += 1
end
i
end

bm(20) do |x|
x.report(“radarka”) { pr7_radarek }
x.report(“tomasha”) { pr7_tomash }
x.report(“radarka2”) { pr7_radarek }
x.report(“tomasha2”) { pr7_tomash }
end[/code]
Nie wiem jak to zrobiłeś, Radarek, ale Twój teoretycznie bardziej zasobożerny (dopisywanie do tablicy) kod bywa że wypada lepiej od mojego w tym benchmarku :smiley:

user system total real radarka 9.020000 2.750000 11.770000 ( 11.867351) tomasha 9.030000 2.670000 11.700000 ( 11.797699) radarka2 9.050000 2.710000 11.760000 ( 11.809576) tomasha2 8.960000 2.720000 11.680000 ( 11.748851)

albo

require "prime" i = 1 Prime.each do |p| p p break if i == 10001 i += 1 end
1.9 ofc

teamon, pamiętaj, że w 1.9 możesz do każdego iteratora dodać index iteracji poprzez metodę Enumerator#with_index:

require "prime" Prime.each.with_index do |p, i| p p i += 1 break if i == 10001 end
A skoro wspomniałeś o 1.9, to moja wersja:

require "prime" puts Prime.each.take(10001).last
^^

Hm… to oznacza tylko tyle ze musze poczytac wiecej o enumeratorach ;]

W tym wypadku nie ma to znaczenia, operacji dodawania na koniec tablicy będzie tylko 10001 i jeśli dobrze pamiętam jej capacity jest zwiększane dwukrotnie (jeśli trzeba) więc realokacji będzie tylko log2(10001) ~ 13. Wąskie gardło (nie chce mi się sprawdzać czy faktycznie tak jest) jest prawd. w 1 linii pętli.

# tak juz w kwesti formalnosci i krotkiego kodu require "prime" p Prime.take(10001).last