Янв
4
2012

Perl, JAPH и Новый год

Perl, JAPH и Новый годПраздник Новый год, как известно, хорошее время! И хорошее оно не только потому, что все нажираются вдрабадан и в едином порыве предаются всеобщей атмосфере веселья и позитива. И не только потому, что куча народу получают мини-каникулы на 10 дней (по крайне мере у нас в России). А ещё потому что есть хороший повод дарить и получать подарки! :)
Собственно, об этом и пойдет речь. А точнее о том, что в преддверии Нового года передо мной возник сложный вопрос, что можно подарить другу программисту с уклоном в аякс в системное программирование на Си на уровне ядра Линукс (хотя в данном случае Си и Linux не имеют отношения к делу).

В результате совместного brainstorm-а, мы решили, что я подарю ему эксклюзивную футболку с кодом аля JAPH. Кто не в теме, что такое JAPH (Just another Perl hacker) — есть такая дисциплина среди программистов на Perl-е. Смысл сводится к тому, чтобы написать некий обфусцированный код, с виду напоминающий рисунок (ну или же просто оформленный декоративно), при выполнении которого будет выведена фраза на подобии «Just another Perl hacker».

Так например код:

#Kickstart from http://www.perlmonks.com/
#note: a slight valentine variation :)
      $LOVE=               AMOUR.
    true.cards.        ecstacy.crush 
  .hon.promise.de    .votion.partners.
 tender.truelovers. treasure.affection.
devotion.care.woo.baby.ardor.romancing.
enthusiasm.fealty.fondness.turtledoves.
lovers.sentiment.worship.sweetling.pure
.attachment.flowers.roses.promise.poem;
 $LOVE=~ s/AMOUR/adore/g; @a=split(//,
  $LOVE); $o.= chr (ord($a[1])+6). chr
   (ord($a[3])+3). $a[16]. $a[5]. chr
    (32). $a[0]. $a[(26+2)]. $a[27].
      $a[5].$a[25]. $a[8].$a[3].chr
        (32).$a[29]. $a[8].$a[3].
          $a[62].chr(32).$a[62].
           $a[2].$a[38].$a[4].
               $a[3].'.';
                 print
                  $o;

с виду напоминающий сердце, при интерпретации выдает сообщение

just another perl lover.

Объектом нанесения на футболку был выбран верблюд:

#
 
	                                            sub j(\$){($
	             P,$V)=                      @_;while($$P=~s:^
	         ([()])::x){                    $V+=('('eq$1)?-32:31
	   }$V+=ord(  substr(                 $$P,0,1,""))-74} sub a{
	  my($I,$K,$  J,$L)=@_               ;$I=int($I*$M/$Z);$K=int(
	 $K*$M/$Z);$J=int($J*$M             /$Z);$L=int($L*$M/$Z); $G=$
	 J-$I;$F=$L-$K;$E=(abs($          G)>=abs($F))?$G:$F;($E<0) and($
	  I,$K)=($J,$L);$E||=.01       ;for($i=0;$i<=abs$E;$i++ ){ $D->{$K
	          +int($i*$F/$E)      }->{$I+int($i*$G/$E)}=1}}sub p{$D={};$
	         Z=$z||.01;map{    $H=$_;$I=$N=j$H;$K=$O=j$H;while($H){$q=ord
	        substr($H,0,1,"" );if(42==$q){$J=j$H;$L=j$H}else{$q-=43;$L =$q
	      %9;$J=($q-$L)/9;$L=$q-9*$J-4;$J-=4}$J+=$I;$L+=$K;a($I,$K,$J,$ L);
	      ($I,$K)=($J,$L)}a($I,$K,$N,$O)}@_;my$T;map{$y=$_;map{ $T.=$D->{$y}
	      ->{$_}?$\:' '}(-59..59);$T.="\n"}(-23..23);print"\e[H$T"}$w= eval{
	      require Win32::Console::ANSI};$b=$w?'1;7;':'';($j,$u,$s,$t,$a,$n,$o
	      ,$h,$c,$k,$p,$e,$r,$l,$C)=split/}/,'Tw*JSK8IAg*PJ[*J@wR}*JR]*QJ[*J'.
	       'BA*JQK8I*JC}KUz]BAIJT]*QJ[R?-R[e]\RI'.'}Tn*JQ]wRAI*JDnR8QAU}wT8KT'.
	       ']n*JEI*EJR*QJ]*JR*DJ@IQ[}*JSe*JD[n]*JPe*'.'JBI/KI}T8@?PcdnfgVCBRcP'.
	        '?ABKV]]}*JWe*JD[n]*JPe*JC?8B*JE};Vq*OJQ/IP['.'wQ}*JWeOe{n*EERk8;'.
	          'J*JC}/U*OJd[OI@*BJ*JXn*J>w]U}CWq*OJc8KJ?O[e]U/T*QJP?}*JSe*JCnTe'.
	           'QIAKJR}*JV]wRAI*J?}T]*RJcJI[\]3;U]Uq*PM[wV]W]WCT*DM*SJ'.  'ZP[Z'.
	              'PZa[\]UKVgogK9K*QJ[\]n[RI@*EH@IddR[Q[]T]T]T3o[dk*JE'.  '[Z\U'.
	                '{T]*JPKTKK]*OJ[QIO[PIQIO[[gUKU\k*JE+J+J5R5AI*EJ00'.  'BCB*'.
	                     'DMKKJIR[Q+*EJ0*EK';sub h{$\ = qw(% & @ x)[int    rand
	                      4];map{printf  "\e[$b;%dm",int(rand 6)+101-60*   ($w
	                       ||0);system(  "cls")if$w ;($A,$S)=    ($_[1],   $
	                        _[0]);($M,   @,)= split  '}';for(     $z=256
	                        ;$z>0; $z   -=$S){$S*=   $A;p @,}      sleep$_
	                        [2];while   ($_[3]&&($    z+=$ S)       <=256){
	                        p@,}}("".   "32}7D$j"     ."}AG".       "$u}OG"
	                        ."$s}WG"    ."$t",""      ."24}("        ."IJ$a"
	                        ."}1G$n"    ."}CO$o"     ."}GG$t"        ."}QC"
	                         ."$h}"      ."^G$e"    ."})IG"          ."$r",
	                         "32}?"       ."H$p}FG$e}QG$r".          "}ZC"
	                         ."$l",          "28}(LC" .""            ."".
	                         "$h}:"           ."J$a}EG".             "$c"
	                         ."}M"             ."C$k}ZG".            "$e"
	                         ."}"             ."dG$r","18"          ."}("
	                        ."D;"            ."$C"  )}{h(16         ,1,1,0
	                       );h(8,          .98,0,0   );h(16         ,1,1,1)
	                       ;h(8.0         ,0.98,0,     1);         redo}###
	                     #written                                 060204 by
	                   #liverpole                                  @@@@@@@
	                #@@@@@@@@@@@

В том месте, где делали распечатки на футболках, просили предоставить изображение в векторной форме — пришлось немного помучаться, чтобы перевести верблюда в вектор. Сложность была даже не в самом переводе в вектор (ибо это Ctrl+C/Ctrl+V), а в том, чтобы раскрасить его (уже в векторной форме) в цветовой схеме vim-а.

Итак, дело сделано, и вот результаты трудов:
JAPH верблюд JAPH верблюд

Подарок удался — друг остался доволен. Кстати, в замен, он подарил мне книжку «Java 2. Библиотека профессионала. Том 1. Основы» — как раз сейчас интересуюсь Java темой.
Быть может кому-то захочется распечатать у себя на футболке аналогичный рисунок — загрузить векторного JAPH верблюда можно вот по этой ссылке: JAPH верблюд в векторе

P.S. Всех с наступившим Новым годом! И да прибудет с нами сила! ;)

Оставить комментарий

CAPTCHA image


Поля, отмеченные * обязательны для заполнения


XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">