poniedziałek, 23 lipca 2007

Pluton

Na początku XX wieku Gustav Holst napisał "Planety", suitę koncertową o wyraźnie astrologicznym programie, która zyskała sobie dużą popularność i wielu miłośników. Autor muzycznej rubryki w Uranii nazwał je pozycją obowiązkową dla astronoma-melomana. Podobno John Wiliams zapytany, czy wzorował się na "Marsie" Holsta pisząc muzykę do "Star Wars" miał odpowiedzieć, że nie wzorował się, ale jest dumny z takiego przypuszczenia ...

W 1930 roku odkryto kolejną planetę - Pluton - ale Holst nie dopisał kolejnej części, choć był do tego nakłaniamy. Kilku innych kompozytorów to zrobiło, ale historia w pewnym sensie przyznała Holstowi rację - w 2006 roku Międzynarodowa Unia Astronomiczna, chcąc uporządkować nazewnictwo orzekła, że Pluton jest tylko "planetą karłowatą".

piątek, 20 lipca 2007

nagroda Wolframa

W maju 2007 Stephen Wolfram ufundował nagrodę w wysokości 25000 $ dla osoby, która będzie w stanie rozsztrzygnąć problem, czy pewna prosta maszyna Turinga o dwóch stanach i trójsymbolowym alfabecie jest uniwersalna. Dla tych, którzy potrzebują pieniędzy, opisuję dalej pojęcia potrzebne do zdefiniowania problemu - są dość proste. Poniżej rzeczona maszyna zapisana graficznymi symbolami Wolframa:

Maszyna Turinga jest abstrakcyjnym modelem obliczeń stworzonym dla celów teoretycznych przez Alana Turinga w 1936 roku. Składa się ona z nieskończenie długiej taśmy podzielonej na komórki, głowicy pisząco-czytającej, wskaźnika stanu, który może wskazywać jeden z kilku stanów, oraz tabelki reguł. Maszyna pracuje wg ścisłego przepisu, przy czym jej praca podzielona jest na kolejno następujące po sobie kroki. W każdym kroku maszyna czyta symbol z komórki znajdującej się właśnie w polu widzenia głowicy, w tabelce odszukuje regułę na podstawie aktualnego stanu i przeczytanego symbolu i wykonuje określoną w tej regule akcję. Akcją może być zapisanie nowego symbolu i przesunięcie głowicy o jedną komórkę w lewo lub w prawo.

Oczywiście istnieje wiele maszyn Turinga: różnią się liczbą stanów, alfabetem symboli i zawartością tabeli reguł. Co jest jednak najciekawsze, co udowodnił Alan Turing, możliwe jest stworzenie Maszyny Uniwersalnej, która potrafi symulować każdą inną maszynę Turinga, zapisaną w odpowiedni sposób symbolicznie na jej taśmie. Taka uniwersalna maszyna została wielokrotnie jawnie zapisana, jest to względnie proste zadanie. Można także udowodnić, że wszelkie mechaniczne obliczenia da się zrealizować za pomocą maszyny Turinga - jest to więc mocne narzędzie badawcze - jeżeli udowodnimy, że jakiś system obliczeniowy jest zdolny symulować Uniwersalną Maszynę Turinga, możemy mieć pewność, że potrafi on wykonać wszystkie obliczenia, które potrafimy formalnie zapisać - tak, jak komputer.

Do dziś nie wiadomo, jaka najmniejsza maszyna Turinga może być maszyną uniwersalną. Wolfram znalazł dwustanową maszynę o alfabecie pięcioznakowym, ale nie uduwodnił, że jest najmniejsza wśród Maszyn Uniwersalnych. Co więcej, znalazł lepszą kandydatkę, ale nie potrafi rozstrzygnąć, czy jest Uniwersalna. I stąd nagroda - każdy może zgarnąć tę pulę !

Dobrymi kandydatami do nagrody mogą być na przykład autorzy i entuzjaści ezoterycznych języków programowania - często posługują się tym aparatem pojęciowym, aby wykazać, że ich języki są "Turing-kompletne". Chcąc przystąpić do konkursu, warto przejrzeć New Kind Of Science, ale także prace hobbystów - polecam ich wiki. Jeżeli ktoś dziwi się "po co to wszystko", niech pomyśli o tych pieniądzach ;-) Albo niech pomyśli o Johnie von Neumannie, który w wyniku tego typu teoretycznych rozważań wpadł na pomysł budowy maszyny liczącej, czyli komputera, którego zapewne właśnie używamy - ja - pisząc te słowa - Ty - czytając je.

niedziela, 15 lipca 2007

konkursy programistyczne

W sieci można wiele konkursów programistycznych, w tym mniej lub bardziej ambitne konkursy matematyczne. Jeden z ciekawszych , to konkurs Ala Zimmermana, który nie tylko funduje kilkusetdolarowe nagrody, ale także zapewnia rozrywkę umysłową i rywalizację na wysokim poziomie. Zadania, które proponuje to różnego rodzaju problemy optymalizacyjne, czy kombinatoryczne, często wymagające napisania sprytnego programu i poświęcenia wiele dni procesora na obliczenia. Uczestnicy wysyłają swoje rozwiązania (wyniki obliczeń, nie programy), a na stronie konkursu można śledzić swoją pozycję w rankingu, W pewnej chwili konkurs dobiega końca i najlepszy zgarnia kasę. Jeśli ktoś interesuje się matematyką, zwłaszcza dziedzinami takimi jak teoria liczb albo matematyka dyskretna, polecam "Project Euler". W tym konkursie nie ma nagrody pieniężnej, ale za to zadania są częściej publikowane i chyba łatwiejsze. Tu po wysłaniu rozwiązania za pomocą formularza (podobnie jak w konkursie Zimmermanna wysyłamy tylko odpowiedź, nie program) od razu uaktualniana jest lista z rankingiem i widzimy, w jakim miejscu peletonu się znajdujemy. W obu tych konkursach nie ma żadnych warunków co do używanych narzędzi, liczy się tylko rozwiązanie problemu.

poniedziałek, 9 lipca 2007

lazy K

Unlambda opiera się na rachunku kombinatorów SKI, który jest rachunkiem lambda pozbawionym zmiennych - stąd nazwa. Dodatkowo autor dołożył kilka nadmiarowych mechanizmów, w tym "call with current continuation", znane niektórym z Guile. Zrobił to celowo, na złość, zresztą przyznaje się do tego, chciał jeszcze bardziej zaciemnić obraz tego, co robi program w jego języku. Warto przejrzeć jego artykuł na ten temat. Konstrukacja ta robi czary-mary ze stanem obliczeń, w sposób dużo bardziej tajemniczy niż setjmp(3) z C albo throw/catch z C++. Inaczej autor "lazy K" - ten uprościł wszystko maksymalnie i zostawił tylko operatory ("kombinatory") S, K, I. Zresztą i tak był rozrzutny - przecież I może być wyrażone jako (S K K) - zobacz tu. Ale Chris Baker był jeszcze bardziej radykalny i stworzył język, który ma tylko dwa symbole i nadal jest kompletny. Czemu to służy ? Tylko teoretycznym badaniom. Albo artystycznej zabawie - dla niektórych język programowania też jest dziełem sztuki .......

piątek, 6 lipca 2007

SODA constructor

Tak wygląda skonstruowany w aplecie SODA stwór robakopodobny, który umie chodzić ! Składa się ze sprężynek (to te czarne krechy) poruszających się w rytm fal nerwowych, których częstotliwość i fazę można ustawiać w ww aplecie wg uznania. Stworki takie mogą pełzać, dreptać, kiwać się i nawet można urządzać ich wyścigi. A fizyka całości jest bardzo prosta: sprężynki, grawitacja i tarcie. Całość w przestrzeni dwuwymiarowej. Trójwymiarowa wersja konstruktora nie jest już tak łatwa w użyciu, ale za to efekty są niesamowite - te wszystkie ośmiornice i kosmiczne potwory są jak prawdziwe !

TargetWriter

Jak napisać generator tekstu oparty na szablonach ? Nie trzeba go pisać - istnieje i jest bardzo znany, to BASH. Wystarczy napisać kilka funkcji i korzystając z mechanizmów basha można generować dowolny tekst. Tak powstał WriteTarget, generator oparty na bashu. A tak wygląda próbka kodu:
# the template hello.tpl:
cat <<END_OF_FILE
<html>
<head>
     <title> $(target MAIN_TITLE) </title>

</head>
<body>
     <h1> $(target MAIN_TITLE) <h1>
     $(target TEXT)

</body>
</html>  
END_OF_FILE 

# the text file:
. ./hello.tpl

write MAIN_TITLE  H E L L O
write TEXT Hello world !

unlambda

Język programowania, który nie posiada pętli, instrukcji warunkowej, zmiennych, nie posiada właściwie nic, tylko jednoargumentowe funkcje. Funkcja przyjmuje jeden argument, jednoargumentową funkcję i zwraca także jednoargumentową funkcję. To nie LISP, to UNLAMBDA. Funkcja stała - zwraca zawsze to samo. Funkcja "przeźroczysta", albo identycznościowa - zwraca zawsze swój argument. I konstruktor - funkcja, która pozwala tworzyć kolejne .... To wystarcza, aby pisać kompletne w sensie maszyny Turinga programy. A tak wygląda program w tym języku:
```s``s``sii`ki
  `k.*``s``s`ks
 ``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
  `k``s`ksk
Czytać się tego nie da ....

csound

Czym assembler dla programisty, tym dla muzyka komputerowego jest csound. Jest to program wywodzący się ze starej unixowej tradycji końca ubiegłego wieku, więc trudny w użyciu, ale baaaaardzo potężny. Jak Povray w grafice 3D, csound służy do off-line'owego renderowania utworu. Może jednak także służyć jako real-time'owy syntezator - podłączamy go wtedy do naszego kontrolera MIDI i gramy. A tak wygląda kawałek utworu napisany w języku csound'a:
t 0 90

i100 0 205 .05 1.5 1.7
i101 0 205 .2 2.1 2 .25
i102 0 205 .3 2 2.2 .15 .175
i103 0 205

Dur Root Amp Shape Pat Acc Env Filter Pan Wet
;1 2 3 4 5 6 7 8 9 10 11 12
i1 0 4 6.04 15000 2 100 81 50 56 20 1
i1 + . . . . 101 . . . . .
i1 + . 5.04 . . 100 . . . . .
i1 + . . . . 101 . . . . .
i1 + . 6.04 . 2 100 . . . . .
i1 + . . . . 101 . . . . .
i1 + . 5.04 . . 100 . . . . .
A tak wygląda opis instrumentów w tym języku (orchestra file) :
instr 3
kpan      =         p6
i1        =         p5*3

k1        oscil     i1, 1/p3, 10             ; ADSR
a2        oscil     k1, p4, 11               ; SINE

       outs      a2*kpan,a2*(1-kpan)

garvbsig  =         garvbsig+(a2*.1)

       endin
To oczywiście tylko próbka - prawdziwy program jest o wiele dłuższy ... Jeśli chcesz posłuchać, co może powstać z takich matrixowych cyferek, posłuchaj np. tu.