- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 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.
Кто угадает, что выводит программа, тому ничего.
https://en.wikibooks.org/wiki/TeX/catcode
Теперь у нас алфавит служебных символов переназначен. Да, его можно переназначать прямо на ходу во время работы программы.
С учётом разобранной нами части кода этот кусок распарсится так:
Что он делает? Определяет макрос 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
Там дальше пойдут ветвления и циклы.
Короче, программа выводит поэму из 12 строф. В последней строфе 13 строк. Каким-то образом поэму удалось сжать в небольшую программку.
sfx zip voretion
То-то я и думаю что оно на выхлоп архиватора/криптософтины похоже.
Обратим внимание на самые интересные:
\def K#1#2{#1l#2#1} — превращает Kab в alba
\def R#1#2#3{#3#2#1} — переставляет свои аргументы: Rabc → cba
\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.P.S. Гугл, Яндекс и Бинг при поиске фрагментов этого кода теперь первой строкой показывают Говнокод.
1 + 2 - один разделить на два
1(*%+)2 - произведение поделить на сумму
если это возможно реализовать, то ок
Сейчас приходят в голову такие варианты:
1. Использовать паттерн-матчинг аргументов. Пример:
Тогда выражение \j 1 + 2 выведет 3. А если макрос сделать рекурсивным, то можно будет считать суммы любого количества слагаемых.
Недостаток: паттерн нельзя перегрузить. Т. е. при наличии \def\j #1+#2 нельзя определить \def\j #1*#2.
2. Назначить математические символы (+, -, *, /) операторами. Тогда придётся придумывать, как вытащить то, что слева. Сейчас я не знаю, можно ли это сделать.
3. Считать математические символы аргументом макроса. В макросе будет свитч по символу операции:
эх, как непостоянна любовь толпы
Что?
http://ambrevar.bitbucket.org/xii/index.html
Осторожно! Возможны кобенационные мраковские цепи.