Prevod 191-193.

Изненађени? Редован израз тражи размак, С и онда најкраћи могући низ било којих карактера (.\*?), онда размак онда још једно С. Значи гледајући у тај улазни стринг, видимо пет подударности.

1. The sixth sick sheikh's sixth sheep's sick.

2. The sixth sick sheikh's sixth sheep's sick.

3. The sixth sick sheikh's sixth sheep's sick.

4. The sixth sick sheikh's sixth sheep's sick.

5. The sixth sick sheikh's sixth sheep's sick.

Али, re.findall() функција је вратила само 3 подударности. Тачније, вратила је прву, трећу и пету. Зашто је то тако?Па зато што не враћа преклапајуће подударности. Прва подударност се преклапа са другом што значи да је прва враћена, а друга прескочена. Онда, трећа се преклапа са четвртом, значи трећа се враћа, а четврта се преслаче. Три подударности, не пет.

То нема никакве везе са алфаметичким решивачем; само мислим да је занимљиво.

**8.3. Проналажење јединствених ставки у низу**

Сетови чине тривијално проналажење јединствених предмета у низу.

>>> a\_list = ['The', 'sixth', 'sick', "sheik's", 'sixth', "sheep's", 'sick']

>>> set(a\_list) ①

{'sixth', 'The', "sheep's", 'sick', "sheik's"}

>>> a\_string = 'EAST IS EAST'

 >>> set(a\_string) ②

{'A', ' ', 'E', 'I', 'S', 'T'}

>>> words = ['SEND', 'MORE', 'MONEY']

>>> *.join(words) ③*

'SENDMOREMONEY'

 >>> set(*.join(words)) ④*

{'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}

1. С обзиром на листу од неколико стрингова, функција set() ће вратити скуп јединствених стрингова из листе. Ово има смисла ако на то мислите као на петљу. Узмите прву ставку са листе, ставите је у set(). Другу. Трећу. Четврту. Пету – сачекајте, то је већ у set()-у, значи излистаће се само једном јер Python сетови не дозвољавају дупликате. Шесто. Седмо. – опет, дупликат, значи излистава се само једном. Крајњи резултат? Сви јединствени предмети у оригиналној листи, без и једног дупликата. Оригинал чак ни не мора бити сортиран прво.
2. Иста техника ради и са стринговима, јер стринг је само низ карактера.
3. С обзиром на листу стрингова, *.join(a\_list) објадињује све стрингове заједно у једнан.*
4. Дакле, с обзиром на листу стрингова, ова линија кода враћа све јединствене карактере у оквиру целог стринга, без дупликата.

Алфаметрични решивач користи технику да направи сет свих јединствених карактера у пузлу.

unique\_characters = set(*.join(words)*

Ово се касније користи да се карактерима доделе цивре како решивач понавља могућа решења.

**8.4. Предузеће уговора**

Као и многи програмски језици, Python има assert изјаву. Ево како она ради:

>>> assert 1 + 1 == 2 ①

>>> assert 1 + 1 == 3 ②

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AssertionError

>>> assert 2 + 2 == 5, "Only for very large values of 2" ③

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AssertionError: Only for very large values of 2

1. Assert изјава је праћена било којим валидним Python изразом. У овом случају, израз 1 + 1 == 2 је оцењен као True (тачан), дакле assert изјава не ради ништа.
2. Међутим, ако је Python израз оцењен као False (нетачан), assert изјава ће подићи AssertionError.
3. Такође можете укључити поруку читљиву људима која је исписана ако је AssertionError подигнут.

Зато је ова линија кода:

assert len(unique\_characters) <= 10, 'Too many letters'

raise AssertionError('Too many letters')

Алфаметрични решивач користи исту assert изјаву да побегне што раније ако слагалица садрђжи више од  10 јединствених слова. Пошто је сваком слову додељена јединствена цифра, а постоји само 10 цифара, слагалица са више од 10 слова не може имати решење.