[Warszawa-pm] Łamigłówka ze słowami kluczowymi

Stanislaw Romanski stas w datos.pl
Wto, 9 Cze 2009, 02:38:09 PDT


Cześć,

Na spotkaniu w środę pokazywałem kuriozalny skrypt PERLowy
znaleziony gdzieś w Internecie:

# ------------------------------------------------------------
not exp log srand xor s qq qx xor
s x x length uc ord and print chr
ord for qw q join use sub tied qx
xor eval xor print qq q q xor int
eval lc q m cos and print chr ord
for qw y abs ne open tied hex exp
ref y m xor scalar srand print qq
q q xor int eval lc qq y sqrt cos
and print chr ord for qw x printf
each return local x y or print qq
s s and eval q s undef or oct xor
time xor ref print chr int ord lc
foreach qw y hex alarm chdir kill
exec return y s gt sin sort split
# ------------------------------------------------------------

który drukuje 'just another perl hacker'

Fajne, prawda?

Przeprowadziłem badania nad nim i zainteresowanym przesyłam objasnienie.

# ------------------------------------------------------------

                            ## zewnetrznie, caly program stanowi kilka wyrazen polaczonych operatorem 'xor'
                            ## a na koncu 'or';
                            ## aby policzyć jego wartosc, interpreter liczy wszystkie podwyrazenia
                            ## od lewej do prawej

                            ## wyrazenie 'not exp log srand' jest obliczane ale
                            ## wraz z lacznikiem 'xor' nie ma zadnego znaczenia
#  not
#    exp
#      log srand
# xor
                            ## substytucja z separatorem 'q' wstawia do wartosci zmiennej $_  jedna spacje
                            ## ktora bedzie potrzebna zaraz dalej;
                            ## w tej instrukcji na koncu zamiast 'qx' rownie dobrze mogloby byc 'q'
  s qq qx
xor
                            ## w nastepnej linijce zaczyna sie wyrazenie substytucji wartosci zmiennej $_ ,
                            ## z separatorem 'x' i spacja we wzorcu; w efekcie do zmiennej $_ zostanie
                            ## wpisana zawartosc nastepnych linijek (bez koncowego 'x')
  s x x
                            ## wyrazenie 'length uc ord'
                            ## wraz z lacznikiem 'and' nie ma zadnego znaczenia
#        length
#          uc
#            ord
#      and
        print               ## 'just' - pierwsze litery slow z listy
          chr
            ord
              for qw
                q
                  join
                  use
                  sub
                  tied
                qx
xor
  eval                      ## wykonuje 'print' wpisany wczesniej do '$_'
xor
  print qq q q              ## pierwsza spacja (miedzy literami 'q')
xor
# int                      ## 'int' bez znaczenia
    eval
      lc
                            ## wyrazenie 'cos'
                            ## wraz z lacznikiem 'and' nie ma zadnego znaczenia
        q
          m
#              cos
#            and
              print chr ord ## 'another' - pierwsze litery slow z listy
                for qw
                  y
                    abs
                    ne
                    open
                    tied
                    hex
                    exp
                    ref
                  y
          m
xor
                            ## funkcje 'srand' i 'scalar' zastosowane do wyniku 'print'
                            ## daja wartosc która jest ignorowana
#  scalar srand
    print qq q q   ## druga spacja (miedzy literami 'q')
xor
                            ## operacja 'int' nie ma zadnego znaczenia
#  int
  eval
    lc
                            ## 'perl' - pierwsze litery slow z listy
      qq
        y
                            ## zlozenie funkcji 'cos' i 'sqrt'
                            ## wraz z lacznikiem 'and' nie ma zadnego znaczenia
#            sqrt cos
#          and
            print
              chr ord
                for qw
                  x
                    printf
                    each
                    return
                    local
                  x
        y
or
    print qq s s   ## trzecia spacja (miedzy literami 's')
  and
                            ## 'hacker' - pierwsze litery slow z listy

                            ## operator 'q' z separatorem 's' zwraca tekst nastepnych linijek,
                            ## ktory stanie sie argumentem 'eval'
    eval
      q
        s
                            ## podwyrazenia 'undef', 'oct', 'time'
                            ## wraz z lacznikami 'or' i 'xor' nie maja zadnego znaczenia
#           undef
#         or
#           oct
#         xor
#           time
#         xor
                            ## operator 'ref' dalej, dziala na wyniku 'print'
                            ## ale jego wynik ignorujemy
#           ref
              print         ## 'hacker' - poczatkowe litery wyrazow
                chr int ord lc
                  foreach qw
                    y
                      hex
                      alarm
                      chdir
                      kill
                      exec
                      return
                    y
        s
                            ## operacja porownania z wynikiem operacji 'split', 'sort', 'sin'
                            ## jest pomijalna
#          gt sin sort split

# ------------------------------------------------------------

Smacznego,

Stanisław Romański

-------------- następna część ---------
Załącznik HTML został usunięty...
URL:  <http://mail.pm.org/pipermail/warszawa-pm/attachments/20090609/760a042d/attachment.html>


Więcej informacji o liście Warszawa-pm