1. Куча / Говнокод #19877

    +5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    \let~\catcode~`76~`A13~`F1~`j00~`P2jdefA71F~`7113jdefPALLF
    PA''FwPA;;FPAZZFLaLPA//71F71iPAHHFLPAzzFenPASSFthP;A$$FevP
    A@@FfPARR717273F737271P;ADDFRgniPAWW71FPATTFvePA**FstRsamP
    AGGFRruoPAqq71.72.F717271PAYY7172F727171PA??Fi*LmPA&&71jfi
    Fjfi71PAVVFjbigskipRPWGAUU71727374 75,76Fjpar71727375Djifx
    :76jelse&U76jfiPLAKK7172F71l7271PAXX71FVLnOSeL71SLRyadR@oL
    RrhC?yLRurtKFeLPFovPgaTLtReRomL;PABB71 72,73:Fjif.73.jelse
    B73:jfiXF71PU71 72,73:PWs;AMM71F71diPAJJFRdriPAQQFRsreLPAI
    I71Fo71dPA!!FRgiePBt'el@ 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;Rri@stW aHAHHFndZPpqar.tridgeLinZpe.LtYer.W,:jbye

    И снова TeX.

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

    Запостил: inkanus-gray, 25 Апреля 2016

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

    • В качестве подсказки ссылка на приём, на котором основан самый интересный трюк:
      https://en.wikibooks.org/wiki/TeX/catcode
      Ответить
    • а вы говорите в J ничего непонятно
      Ответить
      • Смотри: первая команда (а именно \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}. Это макрос с тремя параметрами, который выводит свои аргументы в обратном порядке.
        Ответить
        • Очень интересно что аж не нужно
          Ответить
        • это генерилось. или руками?
          Ответить
          • Скорее всего, руками:
            http://www.slac.stanford.edu/comp/unix/package/tex/guides/webguide/webguide.html#x1-120003

            Там дальше пойдут ветвления и циклы.
            Ответить
            • 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
            Ответить
          • > 1 + 2 - один разделить на два
            Что?
            Ответить
            • Это J. Я не удивлюсь, если у них и правда так...
              Ответить
              • У + есть два варианта использования: сложение и конюгация, деления он никогда не значит
                2 + 3
                5
                   + 1j1
                1j_1
                Деление — это %.
                Ответить
              • У + есть два варианта использования: сложение и конюгация, деления он никогда не значит
                2 + 3
                5
                   + 1j1
                1j_1
                Деление — это %.
                Ответить
    • Нагуглил разбор полётов уже после того, как разобрал большую часть кода:
      http://ambrevar.bitbucket.org/xii/index.html
      Ответить
    • В /pr/, быдло!
      Ответить
    • Кстати, про текст: https://en.wikipedia.org/wiki/Category:Cumulative_songs

      Осторожно! Возможны кобенационные мраковские цепи.
      Ответить
    • Переведи на "PHP".
      Ответить

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