HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>18 янв 2024</li>
2 <ul><li>18 янв 2024</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Если жизнь кажется вам слишком запутанной, попробуйте расшифровать работы участников этого конкурса.</p>
4 </ul><p>Если жизнь кажется вам слишком запутанной, попробуйте расшифровать работы участников этого конкурса.</p>
5 <p>Кадр: фильм "Начало" / Warner Bros. Pictures</p>
5 <p>Кадр: фильм "Начало" / Warner Bros. Pictures</p>
6 <p>Востоковед, интересующийся IT. В прошлом редактор раздела "Системный блок" журнала "Fакел", автор журналов Computer Gaming World RE, Upgrade Special, руководитель веб-ресурсов компании 1С-Softclub.</p>
6 <p>Востоковед, интересующийся IT. В прошлом редактор раздела "Системный блок" журнала "Fакел", автор журналов Computer Gaming World RE, Upgrade Special, руководитель веб-ресурсов компании 1С-Softclub.</p>
7 <p>Чем проще и читабельнее код, тем лучше - такой совет дают всем начинающим программистам. И большинство старается ему следовать. Но есть и исключения - когда код запутывают намеренно, делая его непонятным и нечитаемым. Это называется обфускацией (от англ. obfuscate - сбивать с толку).</p>
7 <p>Чем проще и читабельнее код, тем лучше - такой совет дают всем начинающим программистам. И большинство старается ему следовать. Но есть и исключения - когда код запутывают намеренно, делая его непонятным и нечитаемым. Это называется обфускацией (от англ. obfuscate - сбивать с толку).</p>
8 <p>Как правило, исходный код обфусцируют, чтобы защитить его от <a>ревёрс-инжиниринга</a> - то есть декомпиляции с целью изучения или взлома. А в случае, например, с JavaScript - чтобы он быстрее загружался с сервера. Но есть и те, кто занимается этим в соревновательных целях. Сегодня поговорим как раз об этом.</p>
8 <p>Как правило, исходный код обфусцируют, чтобы защитить его от <a>ревёрс-инжиниринга</a> - то есть декомпиляции с целью изучения или взлома. А в случае, например, с JavaScript - чтобы он быстрее загружался с сервера. Но есть и те, кто занимается этим в соревновательных целях. Сегодня поговорим как раз об этом.</p>
9 <p>23 марта 1984 года два программиста, Лэндон Курт Нолл и Ларри Бассел, работавшие в компании National Semiconductor, столкнулись с особенно кривым кодом. Ларри в тот день пытался пофиксить баг в классической командной оболочке Unix (Bourne shell), а Лэндон работал с сетевым протоколом ранней версии BSD. В какой-то момент оба вышли из своих кабинетов проветрить мозги.</p>
9 <p>23 марта 1984 года два программиста, Лэндон Курт Нолл и Ларри Бассел, работавшие в компании National Semiconductor, столкнулись с особенно кривым кодом. Ларри в тот день пытался пофиксить баг в классической командной оболочке Unix (Bourne shell), а Лэндон работал с сетевым протоколом ранней версии BSD. В какой-то момент оба вышли из своих кабинетов проветрить мозги.</p>
10 <p>- Ты не поверишь, с каким кодом я сейчас вожусь…</p>
10 <p>- Ты не поверишь, с каким кодом я сейчас вожусь…</p>
11 <p>- Ты бы видел, какие там проблемы с головой у того, кто писал код.</p>
11 <p>- Ты бы видел, какие там проблемы с головой у того, кто писал код.</p>
12 <p>- Это больше чем плохой код, человек старался его испортить по максимуму.</p>
12 <p>- Это больше чем плохой код, человек старался его испортить по максимуму.</p>
13 <p><strong>Разговор Лэндона Нолла и Ларри Бассела,</strong>создателей<a>The International Obfuscated C Code Contest</a></p>
13 <p><strong>Разговор Лэндона Нолла и Ларри Бассела,</strong>создателей<a>The International Obfuscated C Code Contest</a></p>
14 <p>Вернувшись в офис, Лэндон Нолл опубликовал сообщение в Usenet-группах<a>net.lang.c</a>и <a>net.unix-wizards</a>с призывом запутать ещё больше тот код, который они только что обсуждали. Идею он взял из популярного тогда<a>литературного конкурса</a>, где нужно было написать самую ужасную первую строчку романа. Но вместо строки - худшая программа на C размером не более 512 байт.</p>
14 <p>Вернувшись в офис, Лэндон Нолл опубликовал сообщение в Usenet-группах<a>net.lang.c</a>и <a>net.unix-wizards</a>с призывом запутать ещё больше тот код, который они только что обсуждали. Идею он взял из популярного тогда<a>литературного конкурса</a>, где нужно было написать самую ужасную первую строчку романа. Но вместо строки - худшая программа на C размером не более 512 байт.</p>
15 <p>На призыв Нолла откликнулось немало программистов, которые стали присылать свои запутанные программы. Тогда Нолл и Бассел решили превратить это в конкурс по обфускации кода - так появился The International Obfuscated C Code Contest (<a>IOCCC</a>).</p>
15 <p>На призыв Нолла откликнулось немало программистов, которые стали присылать свои запутанные программы. Тогда Нолл и Бассел решили превратить это в конкурс по обфускации кода - так появился The International Obfuscated C Code Contest (<a>IOCCC</a>).</p>
16 <p>"С помощью этого конкурса я хотел внушить людям две вещи. Во-первых, отвращение к плохому стилю кодинга. Во-вторых, понимание, как много мы теряем из-за неудачно структурированного кода".</p>
16 <p>"С помощью этого конкурса я хотел внушить людям две вещи. Во-первых, отвращение к плохому стилю кодинга. Во-вторых, понимание, как много мы теряем из-за неудачно структурированного кода".</p>
17 <p><strong>Лэндон Нолл</strong>, файл README конкурса</p>
17 <p><strong>Лэндон Нолл</strong>, файл README конкурса</p>
18 <p>Нолл называл этот подход сатирическим программированием, подразумевая, что сатира помогает выявлять и обличать человеческие пороки и глупость. Но позже выяснилось, что, помимо глумления над плохим кодом, у конкурса есть ещё и образовательная ценность: чтобы понять запутанный код участников, нужно глубоко разбираться в тонкостях языка C.</p>
18 <p>Нолл называл этот подход сатирическим программированием, подразумевая, что сатира помогает выявлять и обличать человеческие пороки и глупость. Но позже выяснилось, что, помимо глумления над плохим кодом, у конкурса есть ещё и образовательная ценность: чтобы понять запутанный код участников, нужно глубоко разбираться в тонкостях языка C.</p>
19 <p><a>IOCCC</a>проводится не каждый год, а с перерывами - последний на момент написания статьи конкурс состоялся в 2020 году. Сейчас цели The International Obfuscated C Code Contest<a>декларируются</a>так:</p>
19 <p><a>IOCCC</a>проводится не каждый год, а с перерывами - последний на момент написания статьи конкурс состоялся в 2020 году. Сейчас цели The International Obfuscated C Code Contest<a>декларируются</a>так:</p>
20 <ul><li>Написать наиболее запутанную программу на C в рамках правил.</li>
20 <ul><li>Написать наиболее запутанную программу на C в рамках правил.</li>
21 <li>Показать важность хорошего стиля в программировании.</li>
21 <li>Показать важность хорошего стиля в программировании.</li>
22 <li>Озадачить компиляторы C необычным кодом.</li>
22 <li>Озадачить компиляторы C необычным кодом.</li>
23 <li>Продемонстрировать тонкости языка C.</li>
23 <li>Продемонстрировать тонкости языка C.</li>
24 <li>Предоставить безопасный форум для обсуждения плохого кода на C.</li>
24 <li>Предоставить безопасный форум для обсуждения плохого кода на C.</li>
25 </ul><p>Есть подробные<a>рекомендации</a>, какие программы представлять на конкурс по запутыванию кода и каким требованиям они должны соответствовать. Например, организаторы не слишком жалуют программы, зависимые от определённого софта или железа. Многословность кода также не в почёте - чтобы завоевать сердца членов жюри, работа должна быть лаконичной, автономной и удивлять необычностью задумки.</p>
25 </ul><p>Есть подробные<a>рекомендации</a>, какие программы представлять на конкурс по запутыванию кода и каким требованиям они должны соответствовать. Например, организаторы не слишком жалуют программы, зависимые от определённого софта или железа. Многословность кода также не в почёте - чтобы завоевать сердца членов жюри, работа должна быть лаконичной, автономной и удивлять необычностью задумки.</p>
26 <p>Существуют также конкретные правила конкурса обфускации, которые могут меняться из года в год. Происходит это отчасти потому, что организаторы намеренно оставляют "дыры" в правилах. Участники должны найти эти лазейки и воспользоваться ими. Например, совершить какое-то действие, которое технически разрешено, но не соответствует духу конкурса.</p>
26 <p>Существуют также конкретные правила конкурса обфускации, которые могут меняться из года в год. Происходит это отчасти потому, что организаторы намеренно оставляют "дыры" в правилах. Участники должны найти эти лазейки и воспользоваться ими. Например, совершить какое-то действие, которое технически разрешено, но не соответствует духу конкурса.</p>
27 <p>За наихудшее нарушение правил на конкурсе есть даже отдельная номинация. Например, в 1994 году в ней победил Шимон Русинкевич, написавший<a>самую маленькую программу</a>, способную воспроизводить саму себя. Когда программа выполнялась, она выводила ноль байт, что эквивалентно её исходному коду.</p>
27 <p>За наихудшее нарушение правил на конкурсе есть даже отдельная номинация. Например, в 1994 году в ней победил Шимон Русинкевич, написавший<a>самую маленькую программу</a>, способную воспроизводить саму себя. Когда программа выполнялась, она выводила ноль байт, что эквивалентно её исходному коду.</p>
28 <p>"Хотя smr.c - это не совсем корректная программа на C, при этом она не является совсем некорректной! Некоторые компиляторы C могут скомпилировать пустой файл в программу, которая ничего не делает. Но, даже если он этого не сможет, инструкции по сборке, предоставленные в этой записи, создадут исполняемый файл".</p>
28 <p>"Хотя smr.c - это не совсем корректная программа на C, при этом она не является совсем некорректной! Некоторые компиляторы C могут скомпилировать пустой файл в программу, которая ничего не делает. Но, даже если он этого не сможет, инструкции по сборке, предоставленные в этой записи, создадут исполняемый файл".</p>
29 <p><strong>Судья конкурса</strong><a>о работе Русинкевича</a></p>
29 <p><strong>Судья конкурса</strong><a>о работе Русинкевича</a></p>
30 <p>После обнаружения "дыры" латают, поэтому правила следующего года уже немного отличаются от предыдущих.</p>
30 <p>После обнаружения "дыры" латают, поэтому правила следующего года уже немного отличаются от предыдущих.</p>
31 <p>Итоги конкурса обфускации подводит жюри, которое определяет победителей по нескольким основным номинациям: "Худшее злоупотребление препроцессором C", "Самое ошибочное поведение" и так далее. Список счастливчиков публикуется на официальном сайте, что и является наградой.</p>
31 <p>Итоги конкурса обфускации подводит жюри, которое определяет победителей по нескольким основным номинациям: "Худшее злоупотребление препроцессором C", "Самое ошибочное поведение" и так далее. Список счастливчиков публикуется на официальном сайте, что и является наградой.</p>
32 <p>Одним из <a>победителей</a>1988 года стал британский программист Иэн Филлиппс. По словам судей, его код выглядел так, будто автор просто тыкал пальцами в клавиатуру наугад. Так выглядит вступительный фрагмент кода Филлипса:</p>
32 <p>Одним из <a>победителей</a>1988 года стал британский программист Иэн Филлиппс. По словам судей, его код выглядел так, будто автор просто тыкал пальцами в клавиатуру наугад. Так выглядит вступительный фрагмент кода Филлипса:</p>
33 main( _, t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#;\ #q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;\ q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; \ r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ \ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;\ {nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")<p>Однако при запуске программа выводила вполне осмысленный текст песни The Twelve Days of Christmas, в которой поётся про "куропатку на грушевом дереве":</p>
33 main( _, t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#;\ #q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;\ q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; \ r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ \ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;\ {nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")<p>Однако при запуске программа выводила вполне осмысленный текст песни The Twelve Days of Christmas, в которой поётся про "куропатку на грушевом дереве":</p>
34 <p>On the first day of Christmas my true love gave to me</p>
34 <p>On the first day of Christmas my true love gave to me</p>
35 <p>a partridge in a pear tree.</p>
35 <p>a partridge in a pear tree.</p>
36 <p>On the second day of Christmas my true love gave to me</p>
36 <p>On the second day of Christmas my true love gave to me</p>
37 <p>two turtle doves</p>
37 <p>two turtle doves</p>
38 <p>and a partridge in a pear tree.</p>
38 <p>and a partridge in a pear tree.</p>
39 <p>On the third day of Christmas my true love gave to me</p>
39 <p>On the third day of Christmas my true love gave to me</p>
40 <p>three french hens, two turtle doves</p>
40 <p>three french hens, two turtle doves</p>
41 <p>and a partridge in a pear tree.</p>
41 <p>and a partridge in a pear tree.</p>
42 <p>Как это работает? Майк Марковский сделал<a>подробный разбор</a>устройства этой программы, мы же остановимся на основных моментах. Для начала заменим, тернарные операторы - записи вида a ? b : c - на конструкции if/else:</p>
42 <p>Как это работает? Майк Марковский сделал<a>подробный разбор</a>устройства этой программы, мы же остановимся на основных моментах. Для начала заменим, тернарные операторы - записи вида a ? b : c - на конструкции if/else:</p>
43 xmas(int t, int _, char *a) { if (t &lt; -72) { return xmas(_, t, words); } if (t &lt; -50) { if (_ == *a) { return putchar(a[31]); } else { return xmas(-65, _, a+1); } }<p>После этого становится понятно, что переменная t управляет направлением рекурсии. При этом первое условие if (t &lt; -72) особенно не влияет на функциональность программы и добавлено, чтобы запутать читателя.</p>
43 xmas(int t, int _, char *a) { if (t &lt; -72) { return xmas(_, t, words); } if (t &lt; -50) { if (_ == *a) { return putchar(a[31]); } else { return xmas(-65, _, a+1); } }<p>После этого становится понятно, что переменная t управляет направлением рекурсии. При этом первое условие if (t &lt; -72) особенно не влияет на функциональность программы и добавлено, чтобы запутать читателя.</p>
44 <p>В ходе дальнейшего анализа выяснилось, что в коде есть шифр подстановки, то есть нужные буквы сдвинуты на 31 позицию вправо. Например, восклицательный знак на первом месте в строке сопровождается через 31 позицию символом новой строки. Разобравшись с этим шифром, Марковский понял, как образуется текст.</p>
44 <p>В ходе дальнейшего анализа выяснилось, что в коде есть шифр подстановки, то есть нужные буквы сдвинуты на 31 позицию вправо. Например, восклицательный знак на первом месте в строке сопровождается через 31 позицию символом новой строки. Разобравшись с этим шифром, Марковский понял, как образуется текст.</p>
45 <p>Вот как выглядела дешифровка слов в коде:</p>
45 <p>Вот как выглядела дешифровка слов в коде:</p>
46 "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\ On the /first/second/third/fourth/fifth/sixth/seventh/eighth/ninth/tenth/e ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \ leventh/twelfth/ day of Christmas my true love ga q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \ ve to me0/twelve drummers drumming, /eleven pipers piping, /ten lords a-lea ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \ ping,0/nine ladies dancing, /eight maids a-milking, /seven swans a\ iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ -swimming,0/six geese a-laying, /five gold rings;0/four ca ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \ lling birds, /three french hens, /two turtle doves0and /a partridge in a pea }'+}##(!!/"; r tree.00/<p>А вот как сам Майк прокомментировал итоги расшифровки:</p>
46 "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\ On the /first/second/third/fourth/fifth/sixth/seventh/eighth/ninth/tenth/e ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \ leventh/twelfth/ day of Christmas my true love ga q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \ ve to me0/twelve drummers drumming, /eleven pipers piping, /ten lords a-lea ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \ ping,0/nine ladies dancing, /eight maids a-milking, /seven swans a\ iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ -swimming,0/six geese a-laying, /five gold rings;0/four ca ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \ lling birds, /three french hens, /two turtle doves0and /a partridge in a pea }'+}##(!!/"; r tree.00/<p>А вот как сам Майк прокомментировал итоги расшифровки:</p>
47 <p>"Это одна из наиболее запутанных программ на языке C, с которыми я когда-либо сталкивался, поскольку в ней наряду с рекурсией используется шифр подстановки. За этим последовало добавление небольшого количества ненужного кода и использование случайных аргументов, хотя на самом деле аргументы не использовались. Очень креативно!"</p>
47 <p>"Это одна из наиболее запутанных программ на языке C, с которыми я когда-либо сталкивался, поскольку в ней наряду с рекурсией используется шифр подстановки. За этим последовало добавление небольшого количества ненужного кода и использование случайных аргументов, хотя на самом деле аргументы не использовались. Очень креативно!"</p>
48 <p><strong>Майк Марковский</strong>, доктор технических наук Делавэрского университета</p>
48 <p><strong>Майк Марковский</strong>, доктор технических наук Делавэрского университета</p>
49 <p>Участники конкурса обфускации делают всё, чтобы максимально извратить и запутать код. Например, заставляют препроцессор C делать вещи, для которых он не предназначен, или намеренно избегают общепринятых подходов в языке C, находя наиболее сложные способы сделать какую-то банальную вещь.</p>
49 <p>Участники конкурса обфускации делают всё, чтобы максимально извратить и запутать код. Например, заставляют препроцессор C делать вещи, для которых он не предназначен, или намеренно избегают общепринятых подходов в языке C, находя наиболее сложные способы сделать какую-то банальную вещь.</p>
50 <p>Чётких критериев кода-победителя не существует. Но обычно это программа с несколькими уровнями запутанности, где одна фича реализована не только не интуитивно понятным образом, но также опирается на несколько слоёв трудно читаемого кода.</p>
50 <p>Чётких критериев кода-победителя не существует. Но обычно это программа с несколькими уровнями запутанности, где одна фича реализована не только не интуитивно понятным образом, но также опирается на несколько слоёв трудно читаемого кода.</p>
51 <p>Дэвид Корн, автор оболочки Unix Korn Shell, написал программу длиной всего в одну строку для конкурса 1987 года. Благодаря обфускации его программа заставляет читателя думать, что она не скомпилируется.<a>По словам Нолла</a>, даже сам создатель языка C Деннис Ритчи изначально упустил тонкую логику программы.</p>
51 <p>Дэвид Корн, автор оболочки Unix Korn Shell, написал программу длиной всего в одну строку для конкурса 1987 года. Благодаря обфускации его программа заставляет читателя думать, что она не скомпилируется.<a>По словам Нолла</a>, даже сам создатель языка C Деннис Ритчи изначально упустил тонкую логику программы.</p>
52 main() { printf(&amp;unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}<p>Некоторые участники любят форматировать исходный код в разные образы вроде ASCII-арта. Например, программа одного из победителей 27-го конкурса Юсуке Эндо рисует часы в зеркальном отображении.</p>
52 main() { printf(&amp;unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}<p>Некоторые участники любят форматировать исходный код в разные образы вроде ASCII-арта. Например, программа одного из победителей 27-го конкурса Юсуке Эндо рисует часы в зеркальном отображении.</p>
53 <a>Программа</a>Юсуке Эндо<em>Скриншот: ioccc.org / Skillbox Media</em><p>А код Карла Бэнкса в виде самолёта - не что иное, как настоящий симулятор полёта. И нет, дело не только в форматировании кода в виде летательного средства. Запуская программу, вы становитесь пилотом одномоторного самолёта Piper Cherokee, который летит на высоте около километра над уровнем земли.</p>
53 <a>Программа</a>Юсуке Эндо<em>Скриншот: ioccc.org / Skillbox Media</em><p>А код Карла Бэнкса в виде самолёта - не что иное, как настоящий симулятор полёта. И нет, дело не только в форматировании кода в виде летательного средства. Запуская программу, вы становитесь пилотом одномоторного самолёта Piper Cherokee, который летит на высоте около километра над уровнем земли.</p>
54 <a>Самолёт</a>Карла Бэнкса<em>Скриншот:</em><em>ioccc.org / Skillbox Media</em><p>Самолёт управляется с клавиатуры с помощью стрелок и кнопок<strong>Page Up</strong>и <strong>Page Down</strong>. На вашем дисплее в левом нижнем углу есть три прибора: спидометр, компас и альтиметр, который измеряет высоту над уровнем земли в футах.</p>
54 <a>Самолёт</a>Карла Бэнкса<em>Скриншот:</em><em>ioccc.org / Skillbox Media</em><p>Самолёт управляется с клавиатуры с помощью стрелок и кнопок<strong>Page Up</strong>и <strong>Page Down</strong>. На вашем дисплее в левом нижнем углу есть три прибора: спидометр, компас и альтиметр, который измеряет высоту над уровнем земли в футах.</p>
55 "Вид из кабины" авиасимулятора Бэнкса<em>Изображение:<a>IOCCC Flight Simulator</a></em><p>Согласитесь, при столь скромных объёмах исходного кода функциональность вполне впечатляющая.</p>
55 "Вид из кабины" авиасимулятора Бэнкса<em>Изображение:<a>IOCCC Flight Simulator</a></em><p>Согласитесь, при столь скромных объёмах исходного кода функциональность вполне впечатляющая.</p>
56 <p>"Это настоящее чудо. Когда люди говорят, что ограничения по размеру слишком жёсткие, - что ж, мы можем просто показать им эту программу. Она действительно выходит за рамки!"</p>
56 <p>"Это настоящее чудо. Когда люди говорят, что ограничения по размеру слишком жёсткие, - что ж, мы можем просто показать им эту программу. Она действительно выходит за рамки!"</p>
57 <p><a><strong>Комментарий</strong></a><strong>судьи конкурса</strong></p>
57 <p><a><strong>Комментарий</strong></a><strong>судьи конкурса</strong></p>
58 <p>Развлечения развлечениями, но есть работы, которые содержат в себе исторические отсылки и даже серьёзный философский посыл. Так, например, Коди Фергюсон, написал<a>симулятор</a>знаменитой немецкой шифровальной машины "Энигма", благодаря взлому которой прославился Алан Тьюринг.</p>
58 <p>Развлечения развлечениями, но есть работы, которые содержат в себе исторические отсылки и даже серьёзный философский посыл. Так, например, Коди Фергюсон, написал<a>симулятор</a>знаменитой немецкой шифровальной машины "Энигма", благодаря взлому которой прославился Алан Тьюринг.</p>
59 <p>"Я хочу посвятить эту программу миллионам погибших во время Второй мировой войны.</p>
59 <p>"Я хочу посвятить эту программу миллионам погибших во время Второй мировой войны.</p>
60 <p>Нет слов, которые могли бы по-настоящему описать эту трагедию, но я хочу с помощью моего симулятора "Энигмы" почтить каждого человека, который погиб, пострадал, пропал без вести или потерял близких в одной из величайших трагедий в истории человечества".</p>
60 <p>Нет слов, которые могли бы по-настоящему описать эту трагедию, но я хочу с помощью моего симулятора "Энигмы" почтить каждого человека, который погиб, пострадал, пропал без вести или потерял близких в одной из величайших трагедий в истории человечества".</p>
61 <p><strong>Коди Фергюсон.</strong><a>Most enigmatic</a></p>
61 <p><strong>Коди Фергюсон.</strong><a>Most enigmatic</a></p>
62 <p>Автор этой<a>программы</a>пожелал остаться неизвестным. Это уникальная авторская интерпретация "Hello, world". Действительно, мало какой джун решится продолжить изучать язык, пережив такое "первое знакомство":</p>
62 <p>Автор этой<a>программы</a>пожелал остаться неизвестным. Это уникальная авторская интерпретация "Hello, world". Действительно, мало какой джун решится продолжить изучать язык, пережив такое "первое знакомство":</p>
63 int i;main(){for(;i["]&lt;i;++i){--i;}"];read('-'-'-',i+++"hell\ o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}<p>"Автору было очень стыдно, что он выдал такую чушь, поэтому я обещал защитить его приватность. Скажу лишь, что автор этой программы хорошо знаком с языком C".</p>
63 int i;main(){for(;i["]&lt;i;++i){--i;}"];read('-'-'-',i+++"hell\ o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}<p>"Автору было очень стыдно, что он выдал такую чушь, поэтому я обещал защитить его приватность. Скажу лишь, что автор этой программы хорошо знаком с языком C".</p>
64 <p><a><strong>Комментарий</strong></a><strong>судьи конкурса</strong></p>
64 <p><a><strong>Комментарий</strong></a><strong>судьи конкурса</strong></p>
65 <p>Дон Янг выполнил обфускацию<a>кода</a>так, что его можно читать в любом направлении. Функционально это "поворачиватель" текста. Если дать ему текст через стандартный ввод (stdin), он выведет тот же текст в стандартный вывод (stdout), но повёрнутый на 90 градусов против часовой стрелки.</p>
65 <p>Дон Янг выполнил обфускацию<a>кода</a>так, что его можно читать в любом направлении. Функционально это "поворачиватель" текста. Если дать ему текст через стандартный ввод (stdin), он выведет тот же текст в стандартный вывод (stdout), но повёрнутый на 90 градусов против часовой стрелки.</p>
66 Программа Дона Янга<em>Скриншот: </em><em>ioccc.org / Skillbox Media</em><p>Эта<a>работа</a>использует игровую механику Tetris для генерации изображений. Программа берёт изображение-источник, и её алгоритм преобразует пиксели этого изображения в геометрические фигуры на игровом поле "Тетриса".</p>
66 Программа Дона Янга<em>Скриншот: </em><em>ioccc.org / Skillbox Media</em><p>Эта<a>работа</a>использует игровую механику Tetris для генерации изображений. Программа берёт изображение-источник, и её алгоритм преобразует пиксели этого изображения в геометрические фигуры на игровом поле "Тетриса".</p>
67 <a>Генератор</a>изображений<em>Изображение: ioccc.org</em><p>Отдельно стоит отметить, что в 27-м конкурсе, который прошёл в 2020 году, в четырёх из 15 номинаций победили программы, написанные российским программистом<a>Ильёй Курдюковым</a>. Вот что это за программы:</p>
67 <a>Генератор</a>изображений<em>Изображение: ioccc.org</em><p>Отдельно стоит отметить, что в 27-м конкурсе, который прошёл в 2020 году, в четырёх из 15 номинаций победили программы, написанные российским программистом<a>Ильёй Курдюковым</a>. Вот что это за программы:</p>
68 <ul><li><strong>Лучшая утилита.</strong>Ею стала<a>программа</a>для вычисления хешей MD5, которая динамически генерирует таблицу констант для расчёта этих хешей. Код форматирован в виде шара.</li>
68 <ul><li><strong>Лучшая утилита.</strong>Ею стала<a>программа</a>для вычисления хешей MD5, которая динамически генерирует таблицу констант для расчёта этих хешей. Код форматирован в виде шара.</li>
69 </ul><a>Вычислитель</a>хешей MD5<em>Скриншот: </em><em>ioccc.org / Skillbox Media</em><ul><li><strong>Наименее детализированная.</strong><a>Программа</a>, которая делит изображение на определённое число сегментов в зависимости от их содержимого.</li>
69 </ul><a>Вычислитель</a>хешей MD5<em>Скриншот: </em><em>ioccc.org / Skillbox Media</em><ul><li><strong>Наименее детализированная.</strong><a>Программа</a>, которая делит изображение на определённое число сегментов в зависимости от их содержимого.</li>
70 <li><strong>Лчушяа нбеолшьяа пргроамма.</strong>Небольшой<a>код</a>, который добавляет опечатки в текст, меняя буквы местами.</li>
70 <li><strong>Лчушяа нбеолшьяа пргроамма.</strong>Небольшой<a>код</a>, который добавляет опечатки в текст, меняя буквы местами.</li>
71 <li><strong>Лучшее надругательство над языком.</strong>В оригинале - "оскорбление ламатьявэ", что переводится с эльфийского как "прирождённое чутьё к языку, его звучанию, ощущение красоты речи". Ирония в том, что<a>программа</a>, написанная Курдюковым, генерирует случайный абсурдный текст из заданного словаря, используя<a>цепь Маркова</a>.</li>
71 <li><strong>Лучшее надругательство над языком.</strong>В оригинале - "оскорбление ламатьявэ", что переводится с эльфийского как "прирождённое чутьё к языку, его звучанию, ощущение красоты речи". Ирония в том, что<a>программа</a>, написанная Курдюковым, генерирует случайный абсурдный текст из заданного словаря, используя<a>цепь Маркова</a>.</li>
72 </ul><p>Илья согласился дать небольшой комментарий для Skillbox Media "Код" и рассказал о своём участии в конкурсе и его особенностях.</p>
72 </ul><p>Илья согласился дать небольшой комментарий для Skillbox Media "Код" и рассказал о своём участии в конкурсе и его особенностях.</p>
73 <p><strong>- </strong><strong>Как вам пришла идея поучаствовать в этом конкурсе? В чём, на ваш взгляд, его важность?</strong></p>
73 <p><strong>- </strong><strong>Как вам пришла идея поучаствовать в этом конкурсе? В чём, на ваш взгляд, его важность?</strong></p>
74 <p>- В 2020 году я сидел без работы, было много свободного времени. Решил поучаствовать, чтобы привлечь к себе внимание. Но на самом деле, никакой особой профессиональной ценности в победе в таком конкурсе нет, она производит впечатление лишь на ценителей жанра. Возможно, когда-то давно польза была, а сейчас язык C не так популярен. Мало того, это не показатель, что ты умеешь писать понятный код, а совсем наоборот.</p>
74 <p>- В 2020 году я сидел без работы, было много свободного времени. Решил поучаствовать, чтобы привлечь к себе внимание. Но на самом деле, никакой особой профессиональной ценности в победе в таком конкурсе нет, она производит впечатление лишь на ценителей жанра. Возможно, когда-то давно польза была, а сейчас язык C не так популярен. Мало того, это не показатель, что ты умеешь писать понятный код, а совсем наоборот.</p>
75 <p>Про IOCCC я узнал на прошлой работе. Начальник восхищался одной из работ, опубликованных на конкурсе, - это была программа с трассировкой лучей, которую автор кода разместил на своём сайте-визитке. Тогда меня не особо впечатлило, но потом я вспомнил про конкурс по обфускации кода и решил поучаствовать.</p>
75 <p>Про IOCCC я узнал на прошлой работе. Начальник восхищался одной из работ, опубликованных на конкурсе, - это была программа с трассировкой лучей, которую автор кода разместил на своём сайте-визитке. Тогда меня не особо впечатлило, но потом я вспомнил про конкурс по обфускации кода и решил поучаствовать.</p>
76 <p>Из-за ограничений на размер работы в 2-4 КБ вытекает, что сложные программы будут разрабатываться как поиск<a>колмогоровской сложности</a>. Но про этот термин мало кто знает, больше известно понятие Code Golf - именно к такому формату можно отнести IOCCC.</p>
76 <p>Из-за ограничений на размер работы в 2-4 КБ вытекает, что сложные программы будут разрабатываться как поиск<a>колмогоровской сложности</a>. Но про этот термин мало кто знает, больше известно понятие Code Golf - именно к такому формату можно отнести IOCCC.</p>
77 <p><strong>-</strong><strong>Насколько хорошо нужно владеть языком C, чтобы участвовать в конкурсе?</strong></p>
77 <p><strong>-</strong><strong>Насколько хорошо нужно владеть языком C, чтобы участвовать в конкурсе?</strong></p>
78 <p>- Для игры в Code Golf (на любом языке) надо иметь определённый "оптимизирующий" склад ума, когда тебе интересно улучшать алгоритм по разным критериям - чтобы он быстрее работал или меньше занимал места. А в процессе улучшается знание языка - например, я запомнил приоритет операторов (operator precedence) в C, чтобы тратить меньше скобок.</p>
78 <p>- Для игры в Code Golf (на любом языке) надо иметь определённый "оптимизирующий" склад ума, когда тебе интересно улучшать алгоритм по разным критериям - чтобы он быстрее работал или меньше занимал места. А в процессе улучшается знание языка - например, я запомнил приоритет операторов (operator precedence) в C, чтобы тратить меньше скобок.</p>
79 <p>Ещё добавлю, что опыт написания короткого кода на C не пригодится для практического программирования, эти приёмы ухудшают читабельность кода и не соответствуют почти ни одному соглашению о стиле. Только в коде OpenCV я видел использование оператора "запятая" - думаю что многие программисты на С/C++, даже с большим стажем, не слышали о таком операторе.</p>
79 <p>Ещё добавлю, что опыт написания короткого кода на C не пригодится для практического программирования, эти приёмы ухудшают читабельность кода и не соответствуют почти ни одному соглашению о стиле. Только в коде OpenCV я видел использование оператора "запятая" - думаю что многие программисты на С/C++, даже с большим стажем, не слышали о таком операторе.</p>
80 <p>В юности я развлекался с Code Golf на языке ассемблера, причём даже не знал этого названия. Но и до сих пор, бывает, балуюсь подобным. Например, в прошлом году написал LZMA-декомпрессор на x86_64-ассемблере, пытаясь достичь минимального размера кода и бинарного файла.</p>
80 <p>В юности я развлекался с Code Golf на языке ассемблера, причём даже не знал этого названия. Но и до сих пор, бывает, балуюсь подобным. Например, в прошлом году написал LZMA-декомпрессор на x86_64-ассемблере, пытаясь достичь минимального размера кода и бинарного файла.</p>
81 <p>Кстати, есть игра<a>Human Resource Machine</a>, которая позволяет писать на ассемблероподобном языке, там у каждого уровня есть достижения за минимальный размер или максимальную производительность кода.</p>
81 <p>Кстати, есть игра<a>Human Resource Machine</a>, которая позволяет писать на ассемблероподобном языке, там у каждого уровня есть достижения за минимальный размер или максимальную производительность кода.</p>
82 <p><strong>- Работы каких конкурсантов вы могли бы выделить и почему?</strong></p>
82 <p><strong>- Работы каких конкурсантов вы могли бы выделить и почему?</strong></p>
83 <p>- Проблема в том, что оценить работу по существу можно, только декодировав обфусцированный код, а то, что именно программы делают, редко является чем-то очень сложным и полезным, из-за ограничений по размеру. Наверное,<a>8086tiny</a>(эмулятор 8086) впечатляет больше всего по сложности кода, что был упакован в такие размеры.</p>
83 <p>- Проблема в том, что оценить работу по существу можно, только декодировав обфусцированный код, а то, что именно программы делают, редко является чем-то очень сложным и полезным, из-за ограничений по размеру. Наверное,<a>8086tiny</a>(эмулятор 8086) впечатляет больше всего по сложности кода, что был упакован в такие размеры.</p>
84 <p>The IOCCC сегодня - старейший действующий интернет-конкурс по обфускации кода. Начавшись с попытки посмеяться над кривым кодом горе-программистов, он быстро перерос в состязание настоящих профессионалов, ведь написание запутанных программ требует глубокого понимания языка. Неудивительно, что некоторым победителям прошлых лет предложили хорошую работу.</p>
84 <p>The IOCCC сегодня - старейший действующий интернет-конкурс по обфускации кода. Начавшись с попытки посмеяться над кривым кодом горе-программистов, он быстро перерос в состязание настоящих профессионалов, ведь написание запутанных программ требует глубокого понимания языка. Неудивительно, что некоторым победителям прошлых лет предложили хорошую работу.</p>
85 <p>Среди побочных следствий конкурса - выявление структурных особенностей языка C и слабостей стандартных компиляторов. Например,<a>Фонд свободного программного обеспечения</a>использовал конкурсные работы для регрессионного тестирования своего компилятора C.</p>
85 <p>Среди побочных следствий конкурса - выявление структурных особенностей языка C и слабостей стандартных компиляторов. Например,<a>Фонд свободного программного обеспечения</a>использовал конкурсные работы для регрессионного тестирования своего компилятора C.</p>
86 <p>Если захотите принять участие в конкурсе, внимательно ознакомьтесь с актуальными<a>правилами</a>(напомним, они меняются от соревнования к соревнованию). И пожалуйста, в реальных проектах не пишите код так, как в программах, поданных на конкурс :)</p>
86 <p>Если захотите принять участие в конкурсе, внимательно ознакомьтесь с актуальными<a>правилами</a>(напомним, они меняются от соревнования к соревнованию). И пожалуйста, в реальных проектах не пишите код так, как в программах, поданных на конкурс :)</p>
87 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
87 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>