Czy któryś z czytelników tego bloga zastanawiał się kiedyś nad tym, ile trzeba przejrzeć kolejnych potęg naturalnych liczby dwa, żeby natrafić wśród nich na każdą cyfrę od 0 do 9, przynajmniej raz?
Nie?
To dobrze. Takie myśli świadczą o głębokiej degeneracji substancji szarej. Proszę nie myśleć o takich rzeczach i pozostawić je fachowcom. Zamiast tego proszę się skupiać na byciu zdrowym i szczęśliwym.
W razie gdyby ktoś sobie jednak takie pytanie kiedyś zadał, pokażę dziś jak znaleźć na nie odpowiedź, używając Pythona.
A dlaczego Pythona?
Bo tak! To jest mój blog i będę sobie szukał cyfr wśród potęg dwójek za pomocą Pythona tak często, jak mi się będzie podobać. Nie podoba się? To zapraszam na oglądanie posiedzenia Sejmu...
Podoba się? W takim razie wystarczy już tej gry wstępnej i zapraszam do lektury.
Pomyślmy najpierw, w jaki sposób rozwiązalibyśmy to zadanie bez komputera. Ja bym sobie wypisał wszystkie 10 cyfr, a potem wykreślał te, które bym napotykał w kolejnych potęgach dwójki, aż bym wykreślił wszystkie.
Kod w Pythonie wygląda tak:
cyfry = set('023456789')
liczba = 1
while cyfry:
liczba *= 2
cyfry -= set(str(liczba))
print (liczba)
Teraz szybkie omówienie kodu.
W pierwszej linii tworzymy zbiór wszystkich cyfr z wyjątkiem jedynki (która, jako zerowa potęga dwójki, "wylatuje" na dzień dobry)
W drugiej linii ustawiamy zmienną liczba na jedynkę, czyli na zerową potęgę dwójki.
W trzeciej linii dzieje się coś interesującego: otwieramy pętlę while a warunkiem jej wykonania jest... zbiór. Co to oznacza? Otóż Python będzie tę pętlę wykonywał, dopóki zbiór będzie niepusty. Wewnątrz pętli zamierzamy usuwać ze zbioru cyfr cyfry napotkane w kolejnych potęgach.
W czwartej linii mnożymy aktualną liczbę przez dwa.
W piątej linii usuwamy ze zbioru cyfry wszystkie cyfry bieżącej liczby (konieczne jest jawne skonwertowanie liczby na tekst, operator set umie bowiem rozbić tekst na zbiór znaków, nie umie natomiast rozbić liczby na zbiór cyfr)
Na koniec, w ostatniej, szóstej linii, wypisujemy ostatnią liczbę, do której udało się dojść w pętli. Będzie to zatem ta potęga dwójki, która "usunęła" ze zbioru ostatnią cyfrę.
Wynik działania programu jest następujący:
32768
Każdy, kto chociaż przez kilka dekad interesował się arytmetyką binarną natychmiast zauważy, że jest to piętnasta potęga dwójki. A więc trzeba aż szesnastu liczb, żeby znaleźć wśród nich każdą cyfrę przynajmniej raz.
Cyfrą najbardziej upartą, która najdłużej "nie chce" się pokazać w wynikach, jest tytułowa siódemka.
Z tą wiedzą mogę teraz spokojnie iść spać. Dobranoc!
można zapytać co obsługuje oprogramowanie które tworzysz?
Bardzo różne rzeczy obsługuje. Pracowałem już w trzynastu różnych firmach, więc portfolio mam dość szerokie 😉 Natomiast nigdzie nie miałem okazji pobawić się „na poważnie” Pythonem. Uczę się go w wolnym czasie, bo jest dość popularny i daje się stosować w różnych urządzeniach.
matematyka fajna rzecz. Inżynierowie mechanicy zaś trenują fizykę w każdą stronę. Jeden z moich niegdysiejszych kierowników opowiadał o naprawie zbiornika (zdaje się w hucie), w którym gromadzono palny gaz. Problem polegał na tym, że nie można było go wyłączyć z eksploatacji a należało go pospawać. Ubrali spawacza w kombinezon, dali mu instalację tlenową i człowiek elektrycznie pospawał w atmosferze wybuchowego gazu. Jak to możliwe? Ano bez dostępu tlenu gaz przestaje być wybuchowy.