Swift: Peneira de Eratóstenes

Esta será uma publicação muito pequena, que me inspirou neste artigo. Não, eu não vou competir com a solução proposta lá (exceto na brevidade), mas talvez, como demonstração das capacidades de Swift, seja interessante para a habrasociety.

A solução repete absolutamente o algoritmo descrito na Wikipedia , sem nenhuma modificação.

import Foundation //   extension Int { func powerOf2() -> Int { return self * self } } //   ? let max = 8_500_000 //    var testValue = 2 let startTime = Date() //   var data = (2...max).map{$0} let allocationTime = Date() //  while (testValue.powerOf2() <= max) { data.removeAll(where: {$0 >= testValue.powerOf2() && $0.isMultiple(of: testValue)}) testValue = data.first(where: {$0 > testValue})! } let overallTime = Date() //   print(" \(data.count)  : ", data) print() print(" : \(String(format: "%.2f",(allocationTime.timeIntervalSince(startTime)))) . ") print(": \(String(format: "%.2f",(overallTime.timeIntervalSince(allocationTime)))) . ") print(": \(String(format: "%.2f",(overallTime.timeIntervalSince(startTime)))) . ") 

Os interessados ​​podem brincar com isso nesta sandbox. O máximo que eu consegui espremer lá - na região de 8.500.000, a pesquisa leva cerca de 6 segundos. Infelizmente, a execução desse código no playground do meu Mac Mini Final de 2014 (Core i5, 8 GB) já com o parâmetro max = 1.000.000 leva a freios bruscos, portanto, tenha cuidado. No link acima, tudo gira muito mais rápido.

Source: https://habr.com/ru/post/pt450888/


All Articles