Dane oryginału

Copyright © 2016 by Jeremy Kubica. Title of English language original: The CS Detective, ISBN: 978-1-59327-749-9, published by No Starch Press. Polish language edition Copyright © 2018 by Polish Scientific Publishers PWN Wydawnictwo Naukowe PWN Spółka Akcyjna.

All rights reserved.

Przekład WITKOM Witold Sikorski: Witold Sikorski

Projekt okładki polskiego wydania Hubert Zacharski

Wydawca Łukasz Łopuszański

Redaktor prowadzący Adam Kowalski

Redaktor Irena Puchalska

Koordynator produkcji Anna Bączkowska

Skład wersji elektronicznej na zlecenie Wydawnictwa Naukowego PWN Marcin Kapusta / konwersja.virtualo.pl

Książka, którą nabyłeś, jest dziełem twórcy i wydawcy. Prosimy, abyś przestrzegał praw, jakie im przysługują. Jej zawartość możesz udostępnić nieodpłatnie osobom bliskim lub osobiście znanym. Ale nie publikuj jej w internecie. Jeśli cytujesz jej fragmenty, nie zmieniaj ich treści i koniecznie zaznacz, czyje to dzieło. A kopiując jej część, rób to jedynie na użytek osobisty.

Szanujmy cudzą własność i prawo

Więcej na www.legalnakultura.pl

Polska Izba Książki

Copyright © by Wydawnictwo Naukowe PWN SA

Warszawa 2018

eBook został przygotowany na podstawie wydania papierowego z 2018 r., (wyd. I)

Warszawa 2018

ISBN 978-83-01-19737-7

Wydawnictwo Naukowe PWN SA

tel. 22 69 54 321, faks 22 69 54 288

infolinia 801 33 33 88

e-mail: pwn@pwn.com.pl, reklama@pwn.pl

www.pwn.pl

Spis treści

Podziękowania

Uwagi dla Czytelników

Rozdział 1. Problematyka wyszukiwania

Rozdział 2. Wyczerpujące wyszukiwanie informatora

Rozdział 3. Tablice i indeksy na farmie złoczyńców

Rozdział 4. Łańcuchy i ukryte komunikaty

Rozdział 5. Binarne poszukiwanie statku szmuglerów

Rozdział 6. Binarne poszukiwanie wskazówek

Rozdział 7. Adaptacja algorytmów do odważnej ucieczki

Rozdział 8. Socks: Przerwa i wprowadzenie

Rozdział 9. Algorytm z nawrotami – sposób na podtrzymanie wyszukiwania

Rozdział 10. Otwieranie zamków za pomocą przeszukiwania wszerz

Rozdział 11. Przeszukiwanie w głąb w opuszczonym więzieniu

Rozdział 12. Stosy i kolejki w kafeterii

Rozdział 13. Stosy i kolejki w przeszukiwaniu

Rozdział 14. Rozdzielmy się: przeszukiwanie równoległe

Rozdział 15. Iteracyjne pogłębianie może uratować życie

Rozdział 16. Odwrócone indeksy: przeszukiwanie się zawęża

Rozdział 17. Pułapka w drzewie wyszukiwania binarnego

Rozdział 18. Budowa drzew wyszukiwania binarnego

Rozdział 19. Drzewa binarnego wyszukiwania podejrzanych

Rozdział 20. Dodawanie podejrzanych do drzewa wyszukiwania

Rozdział 21. Cechy drzewa wyszukiwania binarnego

Rozdział 22. Drzewa trie w papierologii

Rozdział 23. Wyszukiwanie najlepszy–pierwszy: najbardziej zaufane narzędzie detektywa

Rozdział 24. Kolejki priorytetowe w śledztwie

Rozdział 25. Kolejki priorytetowe przy otwieraniu zamków

Rozdział 26. Heurystyka w wyszukiwaniu

Rozdział 27. Kopce w polityce i w akademii

Rozdział 28. Trudne problemy wyszukiwania

Rozdział 29. Zakończenie poszukiwań

Epilog

Przypisy

O AUTORZE

Jeremy Kubica jest głównym inżynierem w Google, pracuje nad systemami uczącymi się i algorytmami. Ma doktorat z robotyki uzyskany w Carnegie Mellon University oraz tytuł inżyniera nauk komputerowych z Cornell University. Lata na uczelniach poświęcił na tworzenie algorytmów do wykrywania zabójczych asteroid (ich ewentualne zatrzymanie pozostawił na później). Kubica jest autorem bloga Computational Fairy Tales (Bajeczki komputerowe).

O REDAKTORZE TECHNICZNYM

Heidi Newton ukończył studia inżynierskie z University of Canterbury w Nowej Zelandi i studia magisterskie z Victoria University of Wellington w Nowej Zelandii – oba w dziedzinie nauk komputerowych. Pracuje w grupie badań nad edukacją w dziedzinie nauk komputerowych i grupie badawczej Code Avengers w University of Canterbury, a ponadto prowadzi prace związane z nauczaniem i konsultingiem. Obecnie skupia się na ulepszaniu zasobów do nauki informatyki i programowania.

Podziękowania

Jestem niezwykle wdzięczny wszystkim osobom, które miały swój wkład w tę książkę, pracowały nad nią i mnie w tym wspierały.

Chciałbym zacząć od całego zespołu wydawnictwa No Starch Press. W szczególności podziękowania należą się Liz Chadwick i Riley Hoffman za ich doskonałą pomoc, wskazówki i sugestie podczas redagowania książki. Błyskotliwe sugestie Liz były bezcenne dla spójności i rozwoju opowieści. Dziękuję jej też za pomysły przy dopracowaniu kształtu wykładów w częściach technicznych. Dziękuję również Billowi Pollockowi i Tylerowi Ortmanowi za ich wsparcie, a szczególnie Billowi za sugestię tytułu. Dziękuję także Carlosowi Bueno za polecenie mnie No Starch Press.

Miranowi Lipovacowi dziękuję za jego wspaniałe ilustracje. Naprawdę oddają cechy bohaterów i opowieści.

Heidi Newton dziękuję za pełną i przemyślaną redakcję techniczną. Jej praca sprawiła, że poszczególne pojęcia są opisane dokładnie i zrozumiale. Doceniam wszystkie jej uwagi, gdy ostrzegała mnie, że niektóre wyjaśnienia są zbyt techniczne i przez to mało dostępne dla uczących się.

Ogromne podziękowania należą się wszystkim osobom, które przebrnęły przez wcześniejsze wersje książki i wypowiedziały się na ich temat. Są to: John Bull, Mike Hochberg, Edith Kubica, Regan Lee i Kristen „Kit” Stubbs, PhD. Dziękuję też Ilanie Schwarcz, która redagowała wcześniejszą wersję manuskryptu i pomogła w wygładzeniu wielu chropowatych miejsc.

Wielkie podziękowania za wsparcie kieruję do mojej rodziny. W szczególności dziękuję rodzicom za wspieranie moich zainteresowań z dziedziny informatyki, gdy byłem dzieckiem, oraz za zachętę do napisania tej książki.

Uwagi dla Czytelników

W książce tej skupiono się na podejściu do obliczeń i algorytmach wyszukiwania. Opowieści ilustrują pojęcia obliczeniowe na poziomie ogólnym, analizując motywacje ich stosowania oraz zastosowania w dziedzinach pozakomputerowych. Książka nie jest wyczerpująca, a opowieści nie mają na celu zastąpienia porządnego technicznego opisu nauk komputerowych – uzupełniają tylko pewne koncepcje i pomagają w ich zrozumieniu.

Książka dotyczy wielu podejść do obliczeń, które łączy ogólna kategoria algorytmów wyszukiwania. Pojęcia są najpierw prezentowane w kontekście opowieści, a następnie tłumaczone w sposób bardziej techniczny na końcu każdego rozdziału jako notatki do czytania. Czytelnicy mogą opuścić te części techniczne, nie tracąc niczego z opowieści.

W książce przyjęto założenie, że Czytelnicy mają pewne doświadczenie z zakresu nauk komputerowych, ale nie jest wymagana znajomość konkretnego języka programowania. Algorytmy z tej książki można zrealizować w wielu różnych językach programowania i zastosować w dziedzinach wiedzy.

—1—
Problematyka wyszukiwania

Drzwi otworzyły się bez pukania – tylko skrzypnięcie zawiasów zapowiedziało gościa. Frank sięgnął po kuszę, ale gwałtownie się cofnął. Jeśli Vinettees przyszliby po niego, zapewne by zapukali – siekierą. Ktokolwiek wchodził właśnie przez drzwi musiał chcieć porozmawiać. Frank sięgnął więc po kubek i wypił resztę, teraz już zimnej kawy.

– Kapitan Donovan – powiedział, gdy mężczyzna wszedł do pokoju. – Co Pana sprowadza do tej pięknej okolicy? Myślałem, że nie zapuszcza się Pan już poniżej ulicy Piętnastej.

– Trochę czasu minęło – powiedział po prostu kapitan. – Jak dajesz sobie radę, Frank?

– Spektakularnie – odpowiedział sucho Frank, patrząc jak kapitan powoli krąży po pokoju.

Donovan rozejrzał się po nędznym biurze Franka. Jego czerwony płaszcz oficerski delikatnie zaszeleścił. – Jak zabawa w prywatnego detektywa?

– Pozwala na pokrycie kosztów – skłamał Frank.

Kapitan pokiwał głową. Zatrzymał się na chwilę, a potem przeszedł do półki z książkami i rzucił okiem na jej zawartość.

– Czyli to taka wizyta towarzyska – powiedział Frank. – Czy mam zapytać, jak się miewa Marlena i dzieciaki?

– Miewają się nieźle – odpowiedział Donovan, nie odwracając się. – Marlena zajmuje się opieką nad żółwiami i biznes ma się dobrze. Bill wstąpił w zeszłym roku do armii. A Weronika jest księgową, a to ostatnia rzecz, z której bylibyśmy …

– Wcale o to nie pytałem – przerwał mu Frank.

Kapitan żachnął się. Zdjął z półki książkę i przerzucił jej strony. Frank odwrócił głowę, aby zobaczyć okładkę – Rocznik akademii policyjnej: klasa XXI.

– O co chodzi, kapitanie? – zapytał Frank.

Kapitan napotkał wreszcie wzrok Franka. – Potrzebuję Twojej pomocy – powiedział.

Frank zesztywniał. W ciągu pięciu lat, jakie minęły od czasu, gdy opuścił policję, kapitan odwiedził go dokładnie dwa razy. W obu przypadkach po to, aby go ostrzec, że ma się trzymać z daleka od prowadzonych spraw. Jedynym, czego Frank się spodziewał, to pogróżki, ale wydawało się, że kapitan miał teraz szczególny rodzaj problemu – zapewne tego rodzaju, który mógł sprawić, że Frank ureguluje swoje zaległe długi.

– Ja już u Was nie pracuję – powiedział Frank lekceważąco. – Dlaczego nie poprosisz o to jednego ze swoich zaufanych detektywów?

– Potrzebuję kogoś spoza jednostki – powiedział kapitan. – Daruj to sobie, Frank. Jeśli nie wiesz, co dla mnie znaczy, że tu przyszedłem, to nie jesteś tym, kogo potrzebuję.

Frank zachichotał. – Przeciek? W Pańskim oddziale?

– Gorzej. Wczoraj wieczorem ktoś włamał się do archiwum na posterunku i ukradł ponad 500 zwojów.

– Czego szukali? – zapytał Frank. Nie zastanawiając się, pochylił się do przodu na krześle i sięgnął po nowy notatnik i pisaka. Ruchy te wykonał automatycznie, jak picie kawy czy unikanie schodów.

– Nie wiem – odpowiedział Donovan. – Nie ma wzorca działania. Ukradli całe półki dokumentów, wszystko: od sporów o nieruchomości, po raporty o wydatkach. Zabrali akta na temat morderców, celebrytów, prywatnych detektywów, notariuszy … Zabrali nawet oba pudełka ze skargami na hałasy składane przez farmera Swinsona. Ale inne półki zostawili nietknięte. Doliczyliśmy się co najmniej 512 brakujących dokumentów.

– Może to jeden z sąsiadów farmera Swinsona – zażartował Frank. – Musieli słyszeć, że po jakichś stu skargach przyjdzie do nich do domu stażysta i zrobi im surowy wykład.

Kapitan Donovan nie silił się na odpowiedź. Popatrzył tylko pogardliwie, czekając na Franka, który wreszcie odchrząknął, i przerwał ciszę. – Więc chcesz, żebym znalazł te dokumenty?

Kapitan pokręcił głową. – Chcę, żebyś znalazł tych złodziei. Mamy kopie dokumentów. Chcę jednak wiedzieć, jakich informacji potrzebowali i co chcą z nimi zrobić.

– Problem wyszukiwania – zamyślił się Frank. W czasach, gdy służył w jednostce, miał dwie specjalności: problemy wyszukiwania i denerwowanie kapitana.

– Czy Król już o tym wie? – zapytał Frank.

– Wprowadziłem go wczoraj w temat – powiedział kapitan z odrobiną zdenerwowania w głosie. – Od czasu kłopotów z tym zwariowanym czarnoksiężnikiem Król chce mieć codzienne raporty o wszystkim.

Dwa lata temu czarownik megaloman, nazywany Potęgowy, próbował zniszczyć całe królestwo. Od tego czasu Król Fryderyk osobiście wprowadził radykalne aktualizacje zabezpieczeń w królestwie, wprowadzając ponad 300 nowych przepisów bezpieczeństwa, z których co najmniej 5 dotyczyło przechowywania oficjalnych dokumentów w budynkach rządowych sięgających mniej niż 10 pięter opowieści.

– Nie obwiniam go jednak – burknął Donovan. – W końcu mało brakowało. Gdyby nie Księżniczka Anna, kto wie, jak wyglądałoby teraz królestwo.

Frank w ciszy skinął głową. Potęgowy zaatakował podstawy algorytmiczne królestwa, rzucając klątwę na uczonych zajmujących się tymi algorytmami. W ciągu kilku miesięcy sprawił, że nawet proste działania stały się mało wydajne, a działanie królestwa powoli zaczęło się zacinać. Dowody szkód były wszędzie – nawet w swojej lokalnej piekarni Frank był świadkiem wybuchu paniki, gdy klienci stwierdzili, że nie umieją ustawić się w kolejkę.

– Król jest oczywiście osobiście zainteresowany tematem – kontynuował z irytacją kapitan. – Chce znać wszelkie szczegóły: Kto jest przydzielony do sprawy? Których algorytmów wyszukiwania używamy? Czy przetrząsnęliśmy wszystkie sąsiednie budynki?

Frank zdusił chichot i zamyślił się nad propozycją. Wystąpienie w roli konsultanta sił policyjnych stolicy to dobre pieniądze. Spojrzał na swoje stopy – palec wystawał mu przez dziurę w bucie. – Jeśli mam pełnić rolę konsultanta, to będę to robił na swój sposób.

To była chwila prawdy. Pięć lat temu został wykopany z policji za postępowanie na swój sposób. Kapitan był zwolennikiem prawa i porządku. Ostatni raz, gdy Frank skorzystał z heurystyki, był tym o jeden za dużo – kapitan Donovan zażądał oddania odznaki jeszcze tego samego popołudnia. Ale fakt, że Frank robił wszystko po swojemu, sprawiał, że zawsze miał wyniki.

– Tego się spodziewałem – odpowiedział w końcu kapitan. Wyciągnął cienką teczkę spod swojego trencza i upuścił ją na biurko Franka.

– Będę w kontakcie – powiedział Donovan. Potem bezceremonialnie odwrócił się i wyszedł z biura.

Trzy godziny i dwanaście kubków kawy później Frank siedział zgarbiony przy swoim biurku i po raz siódmy kartkował cienką teczkę z informacjami. Słowa skakały i chwiały się w migotliwym świetle świecy, ale nie dawały żadnego nowego spojrzenia.

Nie było na czym się oprzeć. Kapitan dał mu listę brakujących dokumentów oraz rozkład dyżurów w nocy włamania, ale nic ponadto.

Wreszcie z przesadnym westchnieniem Frank chwycił kawałek pergaminu i zaczął robić notatki.

Pierwszym krokiem w każdym problemie wyszukiwania jest określenie, co mamy nadzieję znaleźć – celu, jak to określał stary wykładowca w wydziale Algorytmy policyjne 101. Frank nauczył się tego wcześnie; w pierwszym tygodniu pracy dostał zadanie odnalezienia nagradzanego ogiera księcia i z dumą wrócił na posterunek tego samego popołudnia wraz z ważącym 20 kilo rogatym żółwiem. Okazało się jednak, że robiący wrażenie gad nie był odpowiedni. Dobry algorytm wyszukiwania nic nie znaczy, jeśli szukamy nieodpowiedniej rzeczy.

W tym przypadku nie chodziło o to co, ale raczej kto. Kapitan miał w tym miejscu rację. Gdy złodzieje zdobyli już dokumentację, jej zwrot nie miał dla policji większego znaczenia. Złodzieje uzyskali już potrzebne informacje.

Więc jego cel był prosty: osoba lub osoby, które ukradły dokumenty.

Drugim krokiem przy każdym poszukiwaniu jest identyfikacja przestrzeni poszukiwania. Gdzie szukamy? Gdy Frank każdego ranka szukał kluczy, przestrzenią poszukiwania była każda płaska powierzchnia w jego biurze. A gdy Frank chciał znaleźć przestępcę, to jego przestrzenią poszukiwania była każda osoba w okolicach stolicy.

Gdy już Frank zdefiniował problem, mógł zacząć pracę nad algorytmem. Poszukiwanie liniowe było wykluczone: nie mógł przesłuchać wszystkich ludzi w mieście. Mógł też od razu wykluczyć wiele innych, wyrafinowanych algorytmów, o których uczył się w akademii. Przy tego rodzaju problemie musiał wrócić do swojego zestawu podstawowych algorytmów wyszukiwania – najlepszych przyjaciół prywatnego detektywa.

Frank zrobił zapiski na swoim pergaminie. Miał cel poszukiwań, przestrzeń poszukiwania oraz miał swój algorytm. Czas przystąpić do pracy.

ALGORYTMY POLICYJNE 101: ZAGADNIENIA WYSZUKIWANIA

Fragment wykładów profesora Dreckera

Na tym wykładzie omówimy kilka różnych algorytmów (i związanych z nimi struktur danych) przeznaczonych do rozwiązywania problemów wyszukiwania. Problem wyszukiwania jest zdefiniowany jako zadanie, które wymaga znalezienia określonej wartości (czyli celu) w obrębie przestrzeni możliwych wartości (przestrzeń wyszukiwania).

Ci z Was, którzy ukończą szkołę i zostaną policjantami, codziennie będą się mierzyć z problemami tego rodzaju. Ta szeroka definicja problemu wyszukiwania zawiera w sobie wiele różnych problemów obliczeniowych: od przeszukiwania dzienników policyjnych, aby znaleźć określoną pozycję, przez znajdowanie pokoi w kryjówce, po znajdowanie wszystkich zapisów z aresztowań pasujących do pewnych kryteriów. Ta klasa nie wyczerpuje wszystkich zagadnień – to zajęłoby całe lata – ale dalej podam Wam kilka przykładów i ważnych algorytmów.

Algorytmy opisane w tej klasie mają trzy wspólne składniki:

cel – to część danych, której szukamy; celem może być określona wartość lub kryterium, które pozwala z powodzeniem zakończyć wyszukiwanie;

przestrzeń wyszukiwania – zestaw wszystkich możliwości poszukiwania celu; na przykład przestrzenią wyszukiwania może być lista wartości lub wszystkie węzły w grafie; jedną z możliwości w obrębie przestrzeni wyszukiwania nazywamy stanem;

algorytm wyszukiwania – zbiór określonych kroków lub instrukcji wykonywanych podczas wyszukiwania.

Niektóre problemy wyszukiwania będą miały dodatkowe wymagania lub inny stopień komplikacji, których dotkniemy, przeglądając kolejne algorytmy.

—2—
Wyczerpujące wyszukiwanie informatora

Kluczem do wydajnych algorytmów są informacje. Profesor Drecker wykrzykiwał to kadetom jak mantrę na początku każdych zajęć z Algorytmów policyjnych. Tak zaciekle, że wbiło się to na trwałe w pamięć Franka. – Dobry algorytm opiera się na znalezieniu struktury danych i jej wykorzystaniu. Zależy on od informacji.

Frank uśmiechnął się do siebie na to wspomnienie, skręcając w Zaułek Trzech Bitów – gruntową uliczkę pokrytą koleinami, przy której stała kombinacja obskurnych barów i ekskluzywnych kafejek. Skinął grzecznie parze przechodzących rycerzy, którzy podzwaniali swoją zbroją, i zanotował w pamięci, aby przed opuszczeniem tej okolicy wziąć Potrójnie Czarne Espresso. Najpierw potrzebował informacji, czegoś, co pomoże mu w poszukiwaniach. Dokładnie wiedział od czego zacząć.

Niepozorny Billy powinien być teraz w jednym z tych przybytków, siedząc cicho w rogu i przysłuchując się strzępkom rozmowy przelatującym przez pomieszczenie. Nikt nie chciał niczego powiedzieć w pobliżu Billego; po prostu nikt nie zauważał, że on tam jest. Billy miał jeden istotny błogosławiony talent: był w stu procentach niepozorny. Czego by nie próbował, było w nim coś takiego, że ludzie po prostu go nie zauważali. Może to jego blada skóra lub mikra postura, może chodziło o wyjątkowo prozaiczny sposób ubioru. Cokolwiek to było, Billy dawno zdecydował wykorzystywać swój talent do podsłuchiwania, zbierania informacji i sprzedawania ich każdemu, kto chciałby je kupić.

Frank przeleciał wzrokiem osiem witryn skulonych obok siebie w Zaułku Trzech Bitów i zastanowił się, które z tych miejsc mógł wybrać Billy. Przejrzał w pamięci pół tuzina algorytmów wyszukiwania, ale to było bezcelowe. Frank nie miał żadnych informacji, na których mógłby się oprzeć. Billy mógł być w którymkolwiek z barów lub kafejek.

Pozostało mu wykonanie wyszukiwania wyczerpującego – po prostu wypróbowanie wszystkich możliwości, dopóki nie znajdzie Billy’ego. Nie bardzo mu to pasowało. Lata zabawy w policjanta i prywatnego detektywa nauczyły go, że niemal zawsze istnieje lepszy algorytm niż wyszukiwanie wyczerpujące, więc nienawidził myśli, że ma się uciec do czegoś tak nieefektywnego.

Utyskując, Frank zaczął poszukiwania. Wszedł do pierwszego baru na ulicy – Wartość bezwzględna.

Barman, gburowaty mężczyzna o imieniu Abe, spojrzał na wchodzącego Franka i znacząco opuścił rękę pod porysowany kontuar. Komunikat był jasny: – Mam broń. Pozwolę ci zgadnąć jaką. Ale jeśli będziesz mi zawracał głowę, dam ci się jej przyjrzeć z bliska.

– Nie chcę żadnych kłopotów, Abe – powiedział Frank, unosząc ręce ku górze. – Przyszedłem tylko zobaczyć się z Billym.

– Billy’ego tu nie ma – powiedział barman.

Frank niemal uśmiechnął się z ulgą. – To będę leciał – powiedział.

Abe lekko skinął głową i nie wyjmując ręki spod kontuaru, obserwował, jak Frank wychodzi.

Frank kilka razy głęboko odetchnął i potrząsnął głową w chłodnym powietrzu. Abe miał do niego większą urazę niż ktokolwiek inny, ale to zrozumiałe – w końcu Frank aresztował czwórkę jego rodzeństwa.

Kolejny lokal na ulicy to było Bezwstydny Boole, nowoczesna kafejka udekorowana w bardzo logiczny sposób – na biało i czarno, jak to lubił jej patron Boole. Mieszkańcy Miasta Boole’a byli znani ze swego ogromnego oddania bezwzględnym pojęciom logiki, postrzegając wszystko jako Prawdę lub Fałsz. Byli z nich dobrzy świadkowie. Jako jedyna boolowska kafejka w mieście Bezwstydny Boole stanowił przystań dla emigrantów. W końcu albo ktoś miał pochodzenie boolowskie, albo nie.

Frank wsadził głowę przez drzwi i zapytał ogólnie – Czy jest tu Billy? Nastąpiła krótka chwila ciszy, w której dwadzieścia par oczu uważnie obejrzało każdy cal kafejki. Pochodzący z Miasta Boole’a (Booleanie) nigdy nie odpowiadali na pytanie nie będąc absolutnie pewni poprawności odpowiedzi.

– Nie – padła precyzyjna odpowiedź.

Frank kontynuował swoje drobiazgowe poszukiwania.

Lokale trzeci i czwarty odwiedził całkiem bezowocnie, choć było tam zdecydowanie przyjemniej. Barman ze Stałej stałej powitał Franka ciepło i zaprosił do wspólnego wspominania dawnych dobrych czasów, co było dziwne, biorąc pod uwagę, że Frank poznał go dopiero miesiąc temu. Natomiast tłum w Podwójnym wyzwaniu, niezwykle głośnej kryjówce czarowników, cieszył się z każdego nowego gościa i radośnie śpiewał nad parującymi kubkami.

Frank znalazł Billy’ego w piątym lokalu – Espresso do potęgi. Była to najgłośniejsza i najbardziej zapuszczona kafejka na ulicy, ale przyciągała najwytrwalszych wielbicieli dzięki ziarnom z potrójną dawką kofeiny. Jeśli dzień był dobry, każdy stół był pełen rozgadanych ludzi, którzy chyba uważali, że kluczem do udanej konwersacji jest głośność.

Tego ranka Espresso do potęgi gościło względnie przygaszony tłum. Tylko kilka stolików było całych zajętych, a przy większości z nich siedzieli samotni wielbiciele kawy, którzy byli niespokojni i mamrotali coś do siebie.

Billy siedział przy środkowym stole, pochylając się niezgrabnie w kierunku, w którym toczyła się konwersacja. Nikt nie wydawał się go zauważać. Nawet Frank go nie dostrzegł przy pierwszym spojrzeniu na pomieszczenie.

– Billy! – zawołał Frank.

Billy podskoczył z miną winowajcy. – Frank? – uśmiechnął się szczęśliwy, że ktoś zwrócił na niego uwagę, a potem usiadł prosto. – Przynieś sobie krzesło.

– Szukam pewnych informacji – wyjaśnił Frank, siadając naprzeciw Billy’ego.

– Być może mam jakieś – powiedział Billy. – Ale mam ostatnio ogromne kłopoty z pamięcią – powiedział, spoglądając na pusty od dawna kubek, który zapewne nawet nie był jego.

Frank skinął na baristę, który wkrótce postawił nowy kubek na stole. – Pamiętasz coś o kradzieży na posterunku policji – zapytał Billy’ego Frank.

Billy wzdrygnął się, a jego oczy się rozszerzyły. – Rabunek, mówisz? – zapytał bez przekonania. Gwałtownie obrzucił spojrzeniem pomieszczenie, ale, jak zwykle, nikt nie zwracał na niego uwagi.

Frank położył na stole dwie sztuki złota, ignorując kwaśne uczucie w trzewiach. Nie mógł sobie pozwolić na wydanie takich pieniędzy, zwłaszcza bez pewności, czy płaci za ślad, czy za bezwartościowe plotki. Wiedział jednak, że nie będzie to tanie. Pochylił się bliżej. – Dwie noce temu – powiedział cicho – złodzieje wynieśli cały stos dokumentów.

– Nie brzmi to jak coś, co można zapamiętać bez uszczerbku na zdrowiu – powiedział Billy. Obrzucił wzrokiem sztuki złota. – Boję się Frank, że pytasz niewłaściwą osobę.

– To złoto – warknął Frank.

– Przykro mi, nie mogę w tym pomóc – powiedział Billy. Ponownie rozejrzał się po pomieszczeniu i dodał – Jeśli nawet coś bym wiedział o rabunku, to jest to ten rodzaj sprawy, o której próbowałbym zapomnieć. Jeśli nawet wiedziałbym o jakimś drobiazgu, jak to, kto mógł pomagać w logistyce, to nie jest warte ryzyka, by obudzić się i zobaczyć swoje buty pełne gówna jaka.

Frank gapił się na niego, ale Billy milczał. Jak na kogoś, kto żył z dzielenia się informacjami, Billy miał dziwny zwyczaj wyrażania się mało konkretnie. – Gówna jaka? – zapytał Frank.

Billy skinął głową, ale niczego więcej nie dodał.

– Czy nie mógłbyś być bardziej konkretny? – zapytał Frank. – Czy mówimy o jakach północnych czy południowych?

– A jakie to ma znaczenie? – zapytał Billy. – Chodzi o to, że gdybym wiedział cokolwiek o tym, kto przygotował transport, nie zapamiętałbym tego. Zwłaszcza, jeśli chodziłoby o ludzi, którzy przypadkiem mają dużą farmę pięć mil za miastem, gdzie mogliby łatwo sprawić, że ktoś zniknie. A już podwójnie bym zapomniał, gdyby ta rodzina, której własnością jest farma, miała długą historię nielegalnej działalności i bardzo niezdrowe poczucie humoru. Nie, zdecydowanie pamiętanie takich rzeczy nie służyłoby zdrowiu.

– Fatalnie – powiedział Frank z uśmiechem. – Może w takim razie następnym razem – skinął w kierunku monet. – Zachęta, abyś w przyszłości pamiętał różne rzeczy.

Co osiągnąwszy, Frank wstał i szybkim krokiem opuścił Espresso do potęgi. Skręcił w lewo i poszedł dalej ulicą. Na końcu Zaułku Trzech Bitów mógł zmienić kierunek i skierować się na farmę Crannocków – jedyną farmę z grubsza przypominającą opis Billy’ego.

Gdy mijał Wadliwy rejestr, zobaczył cień śmigający do pobliskiej alejki. Zaklął pod nosem, ale szedł dalej. Oczywiście miał już ogon; kapitan nie zachował swoich odwiedzin w tajemnicy.

Jednak, gdy już opuścił miasto i znalazł się na gruntowej drodze prowadzącej do farmy Crannocków, poprawił mu się humor. Billy nie dał mu wiele, ale nawet tak niewiele informacji mogło oznaczać różnicę między wydajnym algorytmem poszukiwania a wyszukiwaniem wyczerpującym.