Куча говна / Говнокод #19877 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
\let~\catcode~`76~`A13~`F1~`j00~`P2jdefA71F~`7113jdefPALLF
PA''FwPA;;FPAZZFLaLPA//71F71iPAHHFLPAzzFenPASSFthP;A$$FevP
<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="81c0c1">[email protected]</a>@FfPARR717273F737271P;ADDFRgniPAWW71FPATTFvePA**FstRsamP
AGGFRruoPAqq71.72.F717271PAYY7172F727171PA??Fi*LmPA&&71jfi
Fjfi71PAVVFjbigskipRPWGAUU71727374 75,76Fjpar71727375Djifx
:76jelse&<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="603557560a0609302c212b2b575157522657510c5752575130213838575126362c0e2f33052c5751332c3219010432200f2c">[email protected]</a>
RrhC?yLRurtKFeLPFovPgaTLtReRomL;PABB71 72,73:Fjif.73.jelse
B73:jfiXF71PU71 72,73:PWs;AMM71F71diPAJJFRdriPAQQFRsreLPAI
I71Fo71dPA!!FRgiePBt'<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="04616844">[email protected]</a> lTLqdrYmu.Q.,Ke;vz vzLqpip.Q.,tz;
;Lql.IrsZ.eap,qn.i. i.eLlMaesLdRcna,;!;h htLqm.MRasZ.ilk,%
s$;z zLqs'.ansZ.Ymi,/sx ;LYegseZRyal,@i;@ TLRlogdLrDsW,@;G
LcYlaDLbJsW,SWXJW ree @rzchLhzsW,;WERcesInW qt.'oL.Rtrul;e
doTsW,Wk;<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5705253e17242300">[email protected]</a> aHAHHFndZPpqar.tridgeLinZpe.LtYer.W,:jbye

И снова TeX.

Кто угадает, что выводит программа, тому ничего.

Запостил: inkanus-gray inkanus-gray, (Updated )

Комментарии (34) RSS

    • Смотри: первая команда (а именно \let~\catcode) назначает символу ~ операцию \catcode. Следующие команды разбираются так:
      % исходник % как парсится    % что означает
      ~`76       % \catcode`7=6    % назначим символу 7 операцию #
      ~`A13      % \catcode`A=13   % назначим символу A операцию ~
      ~`F1       % \catcode`F=1    % назначим символу F операцию {
      ~`j00      % \catcode`j=00   % назначим символу j операцию \
      ~`P2       % \catcode`P=2    % назначим символу P операцию }


      Теперь у нас алфавит служебных символов переназначен. Да, его можно переназначать прямо на ходу во время работы программы.
      Ответить
    • Поскольку тема кому-то интересна, продолжим разбор:
      jdefA71F~`7113jdefP

      С учётом разобранной нами части кода этот кусок распарсится так:
      \def A#1{\catcode`#1=13\def}

      Что он делает? Определяет макрос A с одним параметром(#1), который назначает своему аргументу catcode=13 («активный» символ, который будет работать как оператор) и вставляет ключевое слово \def.

      После этого фрагмент ALLFP развернётся в \catcode`L=13 \def L{}. Т. е. делаем символ L активным оператором и определяем макрос L как {} (пустую операцию).

      Более интересный фрагмент A//71F71iP развернётся в \catcode`/=13 \def /#1{#1i}. Символ / делаем оператором, определяем макрос / с одним параметром, который к своему аргументу будет добавлять символ «i».

      Ещё более интересный фрагмент ARR717273F737271P развернётся в \catcode`R=13 \def R#1#2#3{#3#2#1}. Это макрос с тремя параметрами, который выводит свои аргументы в обратном порядке.
      Ответить
          • P.S. Хотя я не уверен, что руками... Надо дальше разобрать.

            Короче, программа выводит поэму из 12 строф. В последней строфе 13 строк. Каким-то образом поэму удалось сжать в небольшую программку.
            Ответить
            • > Каким-то образом поэму удалось сжать в небольшую программку.
              sfx zip voretion

              То-то я и думаю что оно на выхлоп архиватора/криптософтины похоже.
              Ответить
              • Выпишем все макросы в алфавитном порядке:
                \def !{eig}
                \def ${ev}
                \def &#1\fi{\fi#1}
                \def '{w}
                \def *{stmas}
                \def /#1{#1i}
                \def ;{}
                \def ?{istmas{}m}
                \def @{f}
                \def A#1{\catcode`#1=13\def}
                \def B#1 #2,#3:{\if.#3.\elseB#3:\fiX{#1}U#1 #2,#3:}
                \def D{ing}
                \def G{our}
                \def H{{}}
                \def I#1{o#1d}
                \def J{ird}
                \def K#1#2{#1l#2#1}
                \def L{}
                \def M#1{#1di}
                \def Q{ers{}}
                \def R#1#2#3{#3#2#1}
                \def S{th}
                \def T{ve}
                \def U#1#2#3#4 #5,#6{\par#1#2#3#5ing\ifx:#6\else&U#6\fi}
                \def V{\bigskipR}
                \def W#1{}
                \def X#1{\bigskip On{}the{}#1 the{}day{}of{}of{}Christmas{}my{}true{}love{}gave{}to{}me{}}
                \def Y#1#2{#2#1#1}
                \def Z{{}a{}}
                \def q#1.#2.{#1#2#1}
                \def z{en}

                Обратим внимание на самые интересные:
                \def K#1#2{#1l#2#1} — превращает Kab в alba
                \def R#1#2#3{#3#2#1} — переставляет свои аргументы: Rabccba
                \def W#1{} — «вычёркиватель», вычёркивает свой аргумент.
                \def Y#1#2{#2#1#1} — превращает Yab в baa
                \def q#1.#2.{#1#2#1} — превращает qa.b. в aba

                Ничего не напоминает?

                А макросы B и U вообще рекурсивные и мне даже страшно представить, что они делают.
                Ответить
                • P.S. Макросы &, B, U, q также демонстрируют, что ТеХ при поиске аргументов макроса выполняет pattern matching, т. е. аргументы можно разделять заданным набором знаков препинания (точки у q; пробел и запятая у B и U; даже целый паттерн \fi у макроса &).

                  P.P.S. Гугл, Яндекс и Бинг при поиске фрагментов этого кода теперь первой строкой показывают Говнокод.
                  Ответить
    • Кстати, как думаешь, можно ли из ТеХа сделать интерпретатор языка J? В ТеХе любой символ можно определить как макрос, при необходимости с параметрами, причём при исполнении макроса можно переопределять символы языка (примеры такого поведения мы уже посмотрели).
      Ответить
      • я с ТеХ не знаком, но существительные располагаются с разных сторон от глагола

        1 + 2 - один разделить на два
        1(*%+)2 - произведение поделить на сумму

        если это возможно реализовать, то ок
        Ответить
        • Я сам на продвинутом уровне программирование в ТеХе не знаю. Я его больше для вёрстки использовал...

          Сейчас приходят в голову такие варианты:
          1. Использовать паттерн-матчинг аргументов. Пример:
          \def\j #1+#2{\count0=#1\advance\count0 by #2{}\the\count0}

          Тогда выражение \j 1 + 2 выведет 3. А если макрос сделать рекурсивным, то можно будет считать суммы любого количества слагаемых.

          Недостаток: паттерн нельзя перегрузить. Т. е. при наличии \def\j #1+#2 нельзя определить \def\j #1*#2.

          2. Назначить математические символы (+, -, *, /) операторами. Тогда придётся придумывать, как вытащить то, что слева. Сейчас я не знаю, можно ли это сделать.

          3. Считать математические символы аргументом макроса. В макросе будет свитч по символу операции:
          \def\sum #1#2{\count0=#1\advance\count0 by #2{}\the\count0}
          \def\dif #1#2{\count0=#1\advance\count0 by -#2{}\the\count0}
          \def\mul #1#2{\count0=#1\multiply\count0 by #2{}\the\count0}
          \def\div #1#2{\count0=#1\divide\count0 by #2{}\the\count0}
          
          \def\j #1#2#3{%
            \if#2+ \sum{#1}{#3}%
            \else\if#2- \dif{#1}{#3}%
               \else\if#2* \mul{#1}{#3}%
                    \else\if#2/ \div{#1}{#3}%
                         \fi%
                    \fi%
               \fi%
            \fi%
          }
          
          \j 1+2
          \j 2*3
          \bye
          Ответить
            • У + есть два варианта использования: сложение и конюгация, деления он никогда не значит
              2 + 3
              5
                 + 1j1
              1j_1
              Деление — это %.
              Ответить
            • У + есть два варианта использования: сложение и конюгация, деления он никогда не значит
              2 + 3
              5
                 + 1j1
              1j_1
              Деление — это %.
              Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8