import unittest import pyfmi.testcase import math from itertools import * points = 5 def sieve(numbers): while True: prime = numbers.next() numbers = removeMultiples(prime, numbers) yield prime def removeMultiples(prime, numbers): for x in numbers: if x % prime != 0: yield x def recSievePrimes(): return sieve(count(2)) def quadriples(seq): it = iter(seq) quad = (None, it.next(), it.next(), it.next()) for x in it: quad = quad[1:] + (x,) yield quad def combinePrimes(): usedFirst = False for (a,b,c,d) in quadriples(primes()): if not usedFirst: yield (a, b) usedFirst = False yield (a, c) if a+d > b+c: yield (b, c) usedFirst = True yield (a, d) def iterSievePrimes(): primes = [2] yield 2 for x in count(3): for prime in primes: if x % prime == 0: break else: primes += [x] yield x def iterMemlessPrimes(): yield 2 for x in count(3): for i in xrange(2, int(math.sqrt(x))+1): if x % i ==0: break else: yield x primes = iterMemlessPrimes class ProblemTests(pyfmi.testcase.SpeakingTestCase): def testSimple(self): self.assertEqual(map(sum, islice(self.user.combinePrimes(), 5)), map(sum, [(2, 3), (2, 5), (3, 5), (2, 7), (3, 7)])) def testMore(self): self.assertEqual(map(sum, islice(self.user.combinePrimes(), 10)), map(sum, [(2, 3), (2, 5), (3, 5), (2, 7), (3, 7), (5, 7), (3, 11), (5, 11), (5, 13), (7, 11)])) def testMoreMore(self): self.assertEqual(map(sum, islice(self.user.combinePrimes(), 100, 110)) , map(sum, [(139, 151), (139, 157), (149, 151), (149, 157), (151, 157), (149, 163), (151, 163), (151, 167), (157, 163), (157, 167)] )) if __name__ == "__main__": ProblemTests.user_filename = "test.py"; unittest.main()