Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

С днем программиста!!! атсиммаргорп менд С

Anna | 17.06.2014 | нет комментариев

Я тоже присоединяюсь к поздравлениям в честь дня программиста! И делаю это с помощью квайна-палиндрома.

Читая пост о мультиквайногенераторах и другие посты о квайнах в последнее время, мне захотелось сделать тоже что-нибудь интересное и нестандартное в области квайнов. Думать долго не пришлось, поскольку идея квайнов-палиндромов лежит на поверхности.

Квайн

Итак, чтобы понять что мне нужно, я сразу решил взять готовый квайн на википедии и попробовать его модифицировать.

Палиндром

Сразу написать квайн-палиндром для меня оказалось тяжело. Поэтому я решил начать с обычной программы-палиндрома. Но как написать программу так, чтобы чтобы она правильно исполнялась и при реверсе исходников, ведь получиться некомпилируемый набор символов? Сразу приходит в голову, что можно комментировать весь этот мусор. Так как в C# два вида комментариев (однострочные и многострочные), то и программы были написаны соответствующие:

Однострочные комментарии
//}}{)(niaM diov citats{P ssalc
class P{static void Main(){}}//
Многострочные комментарии
/**/class P{static void Main(){}};/*/;}}{)(niaM diov citats{P ssalc/**/

Второй вариант лучше, поскольку он не зависит от того, есть ли разрыв строки или нет. До него я не сразу додумался. Однако потом удалось нагуглить программы-палиндромы на разных языках на stackoverflow.

Утилиты для проверки программ

Поскольку реверсить код для комментариев процесс довольно нудный и может сопровождаться ошибками, то перед написанием квайна-палиндрома были написаны методы для проверки строк на палиндромность и, что более интересно, методы для проверки того, может ли входная строка компилироваться. Если да, то является ли скомпилированная программа квайном? Выглядит это примерно так:

Компиляция программы из строчки во время выполнения
Квайн-Палиндром

Результат после нескольких попыток минификации получились следующими. (Программы писались в виде половинок и с форматированием для удобства написания. После этого пробелы убирались и добавлялась недостающая часть в виде комментариев в начало или конец.)

Квайн-палиндром с использованием однострочных комментариев:

//}};)s+"r\n\r\"+)c(gnirts wen(etirW.elosnoC;)c(esreveR.yarrA;)(yarrArahCoT.s=c rav;)'\\','"',s,s(tamroF.gnirts=s;"//}}}};)s+}1{r}2{n}2{r}2{}1{+)c(gnirts wen(etirW.elosnoC;)c(esreveR.yarrA;)(yarrArahCoT.s=c rav;)'}2{}2{','}1{',s,s(tamroF.gnirts=s;}1{}0{}1{=s rav{{)(niaM diov citats{{P ssalc;metsyS gnisu"=s rav{)(niaM diov citats{P ssalc;metsyS gnisu
using System;class P{static void Main(){var s="using System;class P{{static void Main(){{var s={1}{0}{1};s=string.Format(s,s,'{1}','{2}{2}');var c=s.ToCharArray();Array.Reverse(c);Console.Write(new string(c)+{1}{2}r{2}n{2}r{1}+s);}}}}//";s=string.Format(s,s,'"','\\');var c=s.ToCharArray();Array.Reverse(c);Console.Write(new string(c)+"\r\n\r"+s);}}//

Квайн-палиндром с использованием многострочных комментариев:

/*С днем программиста!*/using System;class P{static void Main(){var s="{2}*С днем программиста!*/using System;class P{{static void Main(){{var s={1}{0}{1};s=string.Format(s,s,'{1}','{2}');var c=s.ToCharArray();Array.Reverse(c);Console.Write(s+'*'+new string(c));}}}}/";s=string.Format(s,s,'"','/');var c=s.ToCharArray();Array.Reverse(c);Console.Write(s+'*'+new string(c));}}/*/}};))c(gnirts wen+'*'+s(etirW.elosnoC;)c(esreveR.yarrA;)(yarrArahCoT.s=c rav;)'/','"',s,s(tamroF.gnirts=s;"/}}}};))c(gnirts wen+'*'+s(etirW.elosnoC;)c(esreveR.yarrA;)(yarrArahCoT.s=c rav;)'}2{','}1{',s,s(tamroF.gnirts=s;}1{}0{}1{=s rav{{)(niaM diov citats{{P ssalc;metsyS gnisu/*!атсиммаргорп менд С*}2{"=s rav{)(niaM diov citats{P ssalc;metsyS gnisu/*!атсиммаргорп менд С*/

По данной тематике удалось найти лишь одну дельную ссылку на квайн-палиндромы. Однако там не оказалось решения на C#.

Ссылка на проект на github: (в будущем коллекция будет пополняться): Freaky-Sources

Кидайте в комментарии квайны-палиндромы на других языках, а также просто палиндромы в честь дня атсиммаргорп или 31 уцинтяп или все вместе :)

Желаю меньше багов, больше интересных идей и просто хорошей пятницы в этот чудесный день!

 

 

 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB