Шеста задача
Брой точки, които дава задачата: 5.
Краен срок: 23-и април, 19:00 часа.
Условие
Прости числа наричаме цели числа, по-големи от 1, които са делят само на себе си и на 1. Първите пет прости числа са 2, 3, 5, 7 и 11.
Нека разгледаме всички наредени двойки прости числа, които удовлетворяват следните условия:
- първото число е по-малко от второто
- между двете няма повече от две прости числа
Пример: всички двойки, в които участва числото 11 са: (3, 11), (5, 11), (7, 11), (11, 13), (11, 17), (11, 19).
Вашата задача е да напишете безкраен генератор, който генерира всички такива двойки сортирани по сбора на двата им елемента.
Функцията, която трябва да връща този генератор трябва да се казва combinePrimes
и не трябва да приема параметри.
Съвсем простичко примерче:
>>> gen = combinePrimes() >>> gen.next() (2, 3) >>> gen.next() (2, 5)
Безкрайни генератори
Що е то безкраен генератор? Генератор, който никога не свършва.
Ето един пример с такъв, който генерира целите числа от n до безкрайност:
def ints(n=0): while 1: yield n n += 1
Ако след това се опитате да направите for x in ints(): print x
ще се изписват числа до безкрай. Също така не е добра идея да опитвате list(items())
, защото това също никога няма да свърши. Безкрайните генератори са удобни, когато не искаме да се ограничаваме с конкретен максимален брой на елементите. Точно както е в нашия случай с простите числа :)
Забележки
- Ако две двойки имат еднакъв сбор няма значение в какъв ред ще бъдат генерирани, всички варианти ще бъдат считани за верни.
Полезни функции
- itertools.islice—по даден генератор ви връща генератор, който се ограничава само до някой елементи на дадения. Най-често се ползва за да се вземат първите n елемента на генератор, което при безкрайни такива е много полезно (вижте примерните тестове).
- itertools.count—безкраен генератор на последователни цели числа
Примерни тестове
Връзка: p6-sample.py