Решето Эратосфена в Ruby

Вы можете сделать что-то вроде этого, чтобы нажать на вторую ячейку:

let secondCell = app.collectionViews.children(matching:.any).element(boundBy: 1)
if secondCell.exists {
     secondCell.tap()
}

или использовать предикат:

let predicate = NSPredicate(format: "label BEGINSWITH 'test'")
let cell = app.collectionViews.cells.element(matching: predicate)
13
задан Damian 5 October 2010 в 23:25
поделиться

2 ответа

Следующее, кажется, работает. Я вынул арифметику с плавающей точкой и в квадрате вместо квадратного укоренения. Я также заменил цикл удаления "избранным" вызовом.

while primes[index]**2 <= primes.last
      prime = primes[index]
      primes = primes.select { |x| x == prime || x%prime != 0 }
      index += 1
end

Править: Я думаю, что выяснил, как Вы пытаетесь сделать это. Следующее, кажется, работает и, кажется, больше соответствует Вашему исходному подходу.

while Math.sqrt(primes.last).ceil >= primes[index]
    (primes[index] * 2).step(primes.last, primes[index]) do
      |x|
      primes.delete(x)
    end
    index += 1
end
4
ответ дан 1 December 2019 в 21:53
поделиться

Существует быстрое внедрение по www.scriptol.org:

def sieve_upto(top)
  sieve = []
  for i in 2 .. top
    sieve[i] = i
  end
  for i in 2 .. Math.sqrt(top)
    next unless sieve[i]
    (i*i).step(top, i) do |j|
      sieve[j] = nil
    end
  end
  sieve.compact
end

Я думаю, что это может быть изменено к лучшему немного таким образом:

def better_sieve_upto(n)
  s = (0..n).to_a
  s[0] = s[1] = nil
  s.each do |p|
    next unless p
    break if p * p > n
    (p*p).step(n, p) { |m| s[m] = nil }
  end
  s.compact
end

... в основном из-за более быстрой инициализации массива, я думаю, но это крайне. (Я добавил #compact обоим для устранения нежелательного nils)

16
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: