Niniejszym uważam pakowanie się za oficjalnie zakończone – plus minus pewne drobne szczegóły, rzecz jasna. W tym roku dość sporo okoliczności wydaje się zresztą być przeciwko mojemu bezproblemowemu udziałowi w konferencji IGK. Począwszy od faktu, że od paru dni leczę jakąś zatokowopodobną grypę i kuracja jeszcze trocha potrwa, a skończywszy na tym, że nie będę mógł zjawić na miejscu od samego początku. To z kolei wina uczelni i pewnego “arcyważnego” kolokwium, na którym niestety muszę być :P
I dlatego ominie mnie chociażby tradycyjne zgrupowanie na dworcu Warszawa Wschodnia, skąd zdecydowana większość podróżujących na konferencję dokonywała przesiadki. Pamiętam jeszcze bardzo dobrze, jak niezwykłe było to spotkanie cztery lata temu, podczas pierwszej edycji konferencji… Czasami zazdroszczę tym, którzy pojawią się na niej po raz pierwszy – ale w sumie chyba jednak wolę być “starym wyjadaczem” ;P
Na szczęście moje spóźnienie nie powinno być wielkie ani godne żałowania – w końcu pierwszy dzień to tylko rekla… tj. prezentacje zaproszonych firm :) Bardziej interesujące rzeczy w postaci referatów oraz konkursu Compo są bowiem kwestią następnych dni.
Jak powszechnie wiadomo, obchodzimy dzisiaj tak zwany Prima Aprilis. Dosłownie mówiąc, świętujemy więc fakt, że dzisiejsza data to 1 kwietnia. To oczywiście nie jedyny dziwny akcent tego dnia – na przykład dlatego, iż nie omieszkam przy tej okazji zająć się pewną interesującą oraz dziwną (to słowo zdecydowanie kluczowe) ciekawostką. Chodzi o quines.
Quine to program napisany w dowolnym języku (i nie tylko), którego jedynym zadaniem wyprodukowanie pewnego specyficznego rezultatu. Wypisuje on bowiem na wyjściu… swój własny kod źródłowy. Na pierwszy rzut oka można pomyśleć, że takie programy nie istnieją – albo że wręcz nie mogą istnieć! Bo przecież jeśli kod ma coś wypisywać, to “coś” musi być w tym kodzie zawarte. Czyli każda instrukcja typu print "a"
implikuje konieczność wypisania na wejściu tekstu "print \"a\""
. Ale instrukcja, która ten tekst pokazuje, sama też musi być wyświetlona… Mamy więc print "a"
, print "print \"a\""
, print "print \"print \\\"a\\\"\""
, i tak dalej. Błędne koło!
Lecz quines istnieją. Każdy program tego typu składa się zasadniczo z dwóch części:
#include
, using
, import
, nagłówki funkcji main
i inne podobne konstrukcjeprintf
Krótkim, bo niezawierającym dużej ilości zbędnych śmieci pierwszego typu przykładem jest poniższy quine napisany w Pythonie:
Jak widać, cała treść programu jest zapisana w pojedynczej zmiennej. W miejscu, gdzie w tym “wewnętrznym” kodzie powinna wystąpić wartość owej zmiennej, unikamy sprzężenia zwrotnego poprzez wstawienie znacznika formatującego (czyli %s
). Zostanie on potem zastąpiony dopiero w instrukcji drukującej print a%`a`
(w Pythonie print a%b
to odpowiednik printf(a, b)
z C).
Potrzebny jest jeszcze jeden trik, który pozwoli wypisać cudzysłowy (albo apostrofy) bez konieczności ich espace‘owania (które prowadziłoby do nieskończonego ciągu: "
, \"
, \\\"
, \\\\\\\"
…). Tutaj użyto operatora `
(backtick) specyficznego dla Pythona; inną możliwością jest wydrukowanie cudzysłowu przy pomocy jego kodu ANSI (34).
Widać więc, że quines wcale nie przeczą związkom przyczynowo-skutkowym, następstwu zdarzeń, nie powodują paradoksu dziadka ani zniszczenia Wszechświata :] Oczywiście nie mieszczą się też w nawet najszerzej pojętej kategorii rzeczy przydatnych – ale na dzisiejszą okazję są jak znalazł :)