Główna >>

RSS
Nie idźmy na tę wojnę! To nie nasza wojna!

 

Rysunki, które są programami

2008-10-23   kategorie: praca ciekawe

Wydaje się, że poniższy obrazek to zwykła, niezbyt ciekawa grafika ASCII. Tymczasem jest to działający program w języku Perl:

   ''=~(        '(?{'        .('`'        |'%')        .('['        ^'-')
   .('`'        |'!')        .('`'        |',')        .'"'.        '\\$'
   .'=='        .('['        ^'+')        .('`'        |'/')        .('['
   ^'+')        .'||'        .(';'        &'=')        .(';'        &'=')
   .';-'        .'-'.        '\\$'        .'=;'        .('['        ^'(')
   .('['        ^'.')        .('`'        |'"')        .('!'        ^'+')
  .'_\\{'      .'(\\$'      .';=('.      '\\$=|'      ."\|".(      '`'^'.'
 ).(('`')|    '/').').'    .'\\"'.+(    '{'^'[').    ('`'|'"')    .('`'|'/'
).('['^'/')  .('['^'/').  ('`'|',').(  '`'|('%')).  '\\".\\"'.(  '['^('(')).
'\\"'.('['^  '#').'!!--'  .'\\$=.\\"'  .('{'^'[').  ('`'|'/').(  '`'|"\&").(
'{'^"\[").(  '`'|"\"").(  '`'|"\%").(  '`'|"\%").(  '['^(')')).  '\\").\\"'.
('{'^'[').(  '`'|"\/").(  '`'|"\.").(  '{'^"\[").(  '['^"\/").(  '`'|"\(").(
'`'|"\%").(  '{'^"\[").(  '['^"\,").(  '`'|"\!").(  '`'|"\,").(  '`'|(',')).
'\\"\\}'.+(  '['^"\+").(  '['^"\)").(  '`'|"\)").(  '`'|"\.").(  '['^('/')).
'+_,\\",'.(  '{'^('[')).  ('\\$;!').(  '!'^"\+").(  '{'^"\/").(  '`'|"\!").(
'`'|"\+").(  '`'|"\%").(  '{'^"\[").(  '`'|"\/").(  '`'|"\.").(  '`'|"\%").(
'{'^"\[").(  '`'|"\$").(  '`'|"\/").(  '['^"\,").(  '`'|('.')).  ','.(('{')^
'[').("\["^  '+').("\`"|  '!').("\["^  '(').("\["^  '(').("\{"^  '[').("\`"|
')').("\["^  '/').("\{"^  '[').("\`"|  '!').("\["^  ')').("\`"|  '/').("\["^
'.').("\`"|  '.').("\`"|  '$')."\,".(  '!'^('+')).  '\\",_,\\"'  .'!'.("\!"^
'+').("\!"^  '+').'\\"'.  ('['^',').(  '`'|"\(").(  '`'|"\)").(  '`'|"\,").(
'`'|('%')).  '++\\$="})'  );$:=('.')^  '~';$~='@'|  '(';$^=')'^  '[';$/='`';

Możesz to łatwo sprawdzić, jeżeli masz interpreter Perla w odpowiednio nowej wersji (każdy system Linux powinien go zawierać); tutaj możesz znaleźć ten kod w postaci pliku tekstowego gotowego do ściągnięcia - można go zapisać na dysku i uruchomić poleceniem "perl bot.pl". Uruchomiony program wypisze tekst o tematyce odpowiedniej do jego graficznej postaci ;)

99 bottles of beer on the wall, 99 bottles of beer!
Take one down, pass it around,
98 bottles of beer on the wall!

98 bottles of beer on the wall, 98 bottles of beer!
Take one down, pass it around,
97 bottles of beer on the wall!

97 bottles of beer on the wall, 97 bottles of beer!

[...]

i tak dalej aż do

2 bottles of beer on the wall, 2 bottles of beer!
Take one down, pass it around,
1 bottle of beer on the wall!

1 bottle of beer on the wall, 1 bottle of beer!
Take one down, pass it around,
No bottles of beer on the wall!

Byłaby to jednak tylko taka sobie ciekawostka, gdyby nie fakt, że do podobnej postaci można przekształcić niemal każdy program w Perlu! Biblioteka do języka Perl, która wykonuje takie przekształcenie automatycznie, nosi nazwę Acme::EyeDrops i zupełnie przypadkowo niedawno znalazłem ją w archiwum CPAN. Podany przykład zaczerpnięty jest z dokumentacji tej biblioteki - podobnie ciekawych przykładów jest tam więcej...

Ciekawy jestem, jak "zakręcony" trzeba mieć umysł, żeby nie tylko wymyślić taki sposób nieczytelnego kodowania programów (po co?), ale jeszcze zrealizować program, który to robi... Wobec takiego szaleństwa bledną nawet dokonania uczestników Międzynarodowego Konkursu Nieczytelnego Programowania w C (International Obfuscated C Code Contest), w którym rywalizują np. dzieła podobne do poniższego:

#include <stdio.h>
#include <math.h>
double l;main(_,o,O){return putchar((_--+22&&_+44&&main(_,-43,_),_&&o)?
(main(-43,++o,O),((l=(o+21)/sqrt(3-O*22-O*O),l*l<4&&
(fabs(((time(0)-607728)%2551443)/405859.-4.7+acos(l/2))<1.57))[" #"])):10);}

Czy zgadniecie, co robi ten program? Otóż wyświetla (za pomocą grafiki ASCII, podobnej jak rysunek butelek w powyższym programie) przybliżony kształt aktualnej fazy Księżyca (o ile zegar komputera jest ustawiony poprawnie). Ale nie pytajcie mnie, jak to robi... ;)

komentarze (1) >>>