1. C++ / Говнокод #17460

    +58

    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
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    #include <fstream>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    typedef unsigned int uint;
    std::string sMsg;
    
    int GetShift()
    {
    	int iResult = 0;
    	for(uint i = 0; i < sMsg.size(); i++)
    	{
    		if(!isalpha(sMsg[i])) continue;
    		
    		if(isupper(sMsg[i]))
    		{
    			iResult = int(sMsg[i]) - int('A');
    			break;
    		}
    		else if(islower(sMsg[i]))
    		{
    			iResult = int(sMsg[i]) - int('a');
    			break;
    		}
    	}
    	return iResult;
    }
    
    int Pos(const char* _Str, char _Ch)
    {
    	int i = 0;
    	while(*_Str)
    	{
    		if(*_Str == _Ch)
    		{
    			return i;
    		}
    		_Str++;
    		i++;
    	}
    	return -1;
    }
    
    int main()
    {
    	std::ifstream fin("input.txt");
    	std::ofstream fout("output.txt");
    	
    	std::getline(fin, sMsg);
    	
    	int iShift = GetShift();
    	if(iShift == 0)
    	{
    		fout << sMsg;
    	}
    	else
    	{
    		char* szOriginal = (char*)malloc(100);
    		strcpy(szOriginal, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    		char* szShift = (char*)malloc(100);
    		strcpy(szShift, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ");
    		szShift += iShift;
    		
    		char* szOriginalL = (char*)malloc(100);
    		strcpy(szOriginalL, "abcdefghijklmnopqrstuvwxyz");
    		char* szShiftL = (char*)malloc(100);
    		strcpy(szShiftL, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
    		szShiftL += iShift;
    		
    		for(int i = 0; i < sMsg.size(); i++)
    		{
    			if(!isalpha(sMsg[i]))	
    				fout << sMsg[i];
    			else
    			{
    				if(isupper(sMsg[i]))
    				{
    					int iPos = Pos(szShift, sMsg[i]);
    					fout << *(szOriginal + iPos);
    				}
    				else if(islower(sMsg[i]))
    				{
    					
    					int iPos = Pos(szShiftL, sMsg[i]);
    					fout << *(szOriginalL + iPos);
    				}
    			}
    		}
    		
    		free(szOriginal);
    		free(szShift);
    		free(szOriginalL);
    		free(szShiftL);
    	}
    	
    	fin.close();
    	fout.close();
    	return 0;
    }

    В рамках подготовки к прошедшей областной олимпиаде по информатике среди школьников Минской области решал задачи. Данный говнокод решение задачи про шифр цезаря (данная задача была на областной олимпиаде в 2013 - 2014 учебном году).
    Задача: расшифровать строку, которая зашифрована шифром Цезаря, так, чтобы полученная расшифровка была минимальна лексикографически.
    Зашифрованная строка находится в файле input.txt, результат надо было вывести output.txt

    Запостил: Janycz, 16 Января 2015

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

    • показать все, что скрыто> char* szShift = (char*)malloc(100);
      > szShift += iShift;
      > free(szShift);
      Пиздец.
      Ответить
      • Пиздец — это арифметика указателей в сишке, которая приводит к такой питушне, а также привычка надеяться на мусоросборщик (которого в сишке по умолчанию нет), идущая из других языков.
        Ответить
        • Ниасилятор арифметики указателей детектед.
          Ответить
      • Кстати, а что будет если попробовать освободить кусок памяти который ты не аллочил? Получишь падение типа invalid pointer?
        Ответить
      • Вспомнил, как играл с плюсами, прослезился. Или с сишкой, не помню.
        Хранил я какую-то метаинформацию, а после неё начиналось что-то полезное. Я сдвигал указатель туда, где полезное, хранил и передавал его нужным функциям, потом удалял как честный человек.
        И долго думал, почему программа умирает.
        Ответить
        • показать все, что скрытоНу надо было перед удалением сдвигать обратно, тогда всё норм.
          Ответить
        • Причем в такой ситуации вообще непонятно кто его должен очищать.

          Хорошо напверное пользоваться только тем куском памяти, который ты сам создал. Создал -- передал куда надо -- там его заполнили --- ты его прочитал -- очистил. И всё.
          Ответить
          • показать все, что скрыто> кто его должен очищать
            Функция, противоположная его запиливанию же. Инкапсуляция, все дела:
            void * alloc_shit(size_t size) {
                char * buf = malloc(sizeof(shit_header) + size);
                shit_header * header = (shit_header*)buf;
                // TODO: fill header
                return buf + sizeof(shit_header);
            }
            
            void free_shit(void * p) {
                free(p - sizeof(shit_header));
            }
            Ответить
            • В Тарасо Борманд (ну вы поняли, в каком) Паскале по точно такому алгоритму сделали защиту для динамически выделяемых строк: заголовок хранит ёмкость строки, в программу возвращается указатель на buf + sizeof(header), а перед удалением размер заголовка вычитается.
              Ответить
            • А что делает арифметика для воида? По единичке прибавляет?
              Ответить
          • показать все, что скрытоP.S. У меня на подобной фигне отладочный аллокатор был запилен, который связывал все выделенные блоки в джвусвязный список. Можно было посмотреть какие блоки памяти выделены в каких строках проги и т.п.
            Ответить
            • А кто знает как вручную в релизном приложении проверять стек, вставляя проверки местами по коду под 2013 студии в 64хбитной винде в 32хбитном приложении? Перекомпилировать все в дебаге не могу, ибо проект очень большой, а на дебаг сборку все забили уже как много лет и короче она не поддерживается по сути. Неделю убью перебивая ключи в каждой дллке, чтобы проверить стек в паре мест.
              Ответить
              • показать все, что скрытоhttps://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx
                this?

                P.S. А, блин, /RTC cannot be used with compiler optimizations ;(
                Ответить
                • Да знаю я. Но я умру от закликивания. Я оптимизацию выключил в части проекта, а вот /RTC нужно включать только при включении каких-то ещё ключей везде по проектам. Если хоть в одной либе не включены некоторые ключи, то оно вообще все не компилится на линкере. У нас там классы экспортируются из длл :( , а длл хоть залейся.

                  Вообще было бы офигенно, если из одного потока в другой поток нельзя было указатели передавать на объекты в стеке и система била сразу в глаз с разворота.
                  Ответить
              • Мне приходит в голову вставлять по коду везде RAII-объект (сверяющий ss, esp, ebp и fs:[0]) в конструкторе фиксировать и в деструкторе сверять значение и контрольную сумму значений.

                Ну и может все что ниже в стеке - заполнять на какую-то длину каким-нибудь специальным значением 4 кб например до цикла не создающего временные объекты, а после этого цикла проверять, что они не изменились.

                Потом между временными объектами вставлять объекты упакованные с выравниванием 1 байт, забитые специальным значением например на 1 кб, а в деструкторе которых сверять не потерли ли их.

                Как проверить целостность фреймов в стеке? Возвратных адресов из функций? Адресов обработчиков SEH?
                Ответить
                • показать все, что скрыто> вставлять по коду везде RAII-объект
                  Не спасёт от переполненного буфера, т.к. все эти параметры окажутся незадетыми, запорются только данные да адрес возврата. Вот вторая идея, про объекты, заполненные специальным значением, вроде бы поинтересней.

                  > из одного потока в другой поток нельзя было указатели передавать
                  А вот от соседнего треда, продолжающего насиловать труп, увы, ничего не спасёт. Он же это может сделать намного позже. Походу придётся искать все места, где берутся адреса локальных переменных, и читать код тех функций, куда их передают... Ибо сохранение указателя на локальную переменную - однозначное ССЗБ.
                  Ответить
                  • > и читать код тех функций
                    Ну может какие анализаторы кода заюзать? Какие есть годные? Желательно чтобы без возни и "по русски"-бесплатно или бесплатно.

                    Неужели нет ни у кого кулстори как он побеждал порчи памяти?
                    Ответить
                    • От себя замечу что для порчи кучи ищу с помощью full heap из (gflags или appverif) из DDK. Вдруг кому поможет
                      Ответить
        • >Вспомнил, как играл с плюсами, прослезился.
          И как, выиграл?
          Кресты, это же как игра с шулером UBшными картами — без шансов.
          Ответить
          • Плюсы выиграли. И закрепили результат после того, как я почитал про хаскель.
            Ответить
            • >И закрепили результат после того, как я почитал про хаскель.
              Это как?
              Ответить
              • Крестологика стала более понятной и родной.
                Ответить
                • Крестотравмированный
                  Ответить
                • OMG! Я всегда знал что кресты с хаскилом повязанны слезами невинных программистов.
                  А какая она, крестологика? В каком аспекте они близки:?
                  Ответить
                  • констом и шаблонами вместо вывода типов наверное)
                    Ответить
                  • Вот вырасту, стану большим и умным как Борманд, тогда что-то внятное смогу сказать. Пока только эмоции переполняют.

                    Шаблоны, шаблоны шаблонов, конструкторы типов, универсальность, подставим в параметры абстрактную питушню и получим генератор генераторов для нашего массива, параметризованного множеством интов и царской керосиновой лампой. template<T> class X: public T {}; Таинственные символы << и >> возможность >=> их ++ переопределения. Всё гениальное уже придумано до нас. std::vector std::transform Data.List.permutations boost::spirit Prelude.flip. Универсальность и красота, универсальность и красота, универсальность и где мой мозг?
                    Ответить
                    • показать все, что скрыто> стану большим и умным как Борманд...
                      ... разочаруюсь в крестах и хаскеле, сопьюсь, захиккую и буду смотреть аниме, в котором милые девочки делают милые вещи.

                      Шутка (но в каждой шутке есть доля правды).

                      Лучше D покури. Там метапрограмминг поинтересней замутили. Минус - D для продакшена пока рискованно юзать (но тебе ведь не для продакшена, а для души?).
                      Ответить
                      • > захиккую и буду смотреть аниме
                        Уже. Вот например я сейчас смотрю Блич. Говно, а что делать. Милых девочек нет. Не в этом аниме, не так, да и не нужны.
                        Ответить
                        • показать все, что скрыто> Вот например я сейчас смотрю Блич.
                          Блин, как вы вообще смотрите эти длинносенёны? Мне 64 серии алхимика казались чем-то заоблачным, еле-еле решился на него, хоть и годнота...
                          Ответить
                          • Вечерами перед сном нечем заняться. Или на говнокоде сидеть, или книги читать или аниме смотреть. Чем взрослее, тем выбор все больше падает на легкое, то есть на смотреть. А говнокод просто надоел.
                            Ответить
                            • > А говнокод просто надоел.
                              Тоже верно. Кстати хотел об этом сказать, уж лучше читать хаскел чем втыкать аниме или сраться в интернете за политику, например...
                              Да, я просто его не осилил.
                              Ответить
                              • Может начать срать за политику? Программирование разочеровывет из-за того что Хаски или Эрланг не особо ужились в мире и вообще плохо внедряются новые технологии. Даже роботов нет или гугломобилей. Тока завтраками кормят. И вообще разработка компов 5го поколения загнулась и искусственного интеллекта не будет. И даже надежда ИИ: закон мура и масштабируемость многоядерности соснула пополной
                                Ответить
                                • И вообще приходится программировать на убогих крестах с долгой компиляцией и прочим говном вместо какого-нибудь Хаски, ну или на худой конец сишарпика. Уже от крестов мне не уйти... Рок...
                                  Ответить
                                  • показать все, что скрыто> Уже от крестов мне не уйти...
                                    Неси свой крест, бро... А у нас контора последние годы перекатывается в веб, причём пыховский и пёрловский, что меня печалит. Если планируемый проектик на QML не получит зелёный свет - уйду искать счастья в больших городах, надоело всё.
                                    Ответить
                                  • можно подтянуть сраный эрланг и свалить в сраную швецию на сраном тракторе
                                    Ответить
                                    • квакус итт о_О
                                      Он всех пропагандирует. Прямо церковь у него
                                      В больших городах все также. Если у тебя опыт на крестах, то и будешь ты нести свой крест.

                                      а кмл каким боком к вебу? так что зеленого не будет
                                      Ответить
                                      • показать все, что скрыто> В больших городах все также.
                                        В нашем усть-зажопинске одна годная программерская контора. Во всех остальных местах придётся работать вспомогательным персоналом, на досуге заправляя картриджи. Сам понимаешь, без запасного аэродрома крест, плавно превращающийся в пых, нести не комильфо. Если бы не тёплая ламповая атмосфера и более-менее интересные проекты - давно бы свалил.

                                        > кмл каким боком к вебу
                                        Никаким, там планировался линух и C++/QML прога. Сейчас всё от заказчика зависит - если хуй окончательно не положат из-за крымнаша и его последствий, то будем пилить.
                                        Ответить
                                      • > В больших городах все также. Если у тебя опыт на крестах, то и будешь ты нести свой крест.
                                        хе-хе
                                        ну это уж как устроиться

                                        на днях приходил собеседоваться парень, который всё собеседование жутко гордился тем, что 6 лет назад при институте писал ненужно на MFC, и т.к. у него аж 4 года крестоопыта, ему раз плюнуть сделать ынтерпрайз как на asp.net mvc, так и на j2ee.. ну или на ассемблере, если вдруг надо
                                        Ответить
                                        • он может и гордился, но я бы его не взял как и ты
                                          Ответить
                                        • показать все, что скрыто> раз плюнуть сделать ынтерпрайз как на asp.net mvc, так и на j2ee.. ну или на ассемблере
                                          Взяли?
                                          Ответить
                                          • он был неубедителен
                                            нельзя делать публичные ложные выводы о своей компетентности и потенциале из своего сомнительного опыта на крестах,
                                            нельзя претендовать на позицию сеньора-архитектора, плавая в ответах, связанных с архитектурой, не понюхав большей половины базовых ынтерпрайзных вещей,
                                            нельзя хвалиться тем, что за последние 4 месяца без работы он вместо того, чтобы читать книжки по программированию, читал книжки про торговлю на форексе

                                            да и в 31 год его учить уже новому бессмысленно, врядли будут горящие глаза и осознание, что до потолка компетенции ещё далеко, с таким настроением-то

                                            в общем, скорее всего не MFC же виновато
                                            или...
                                            Ответить
                                        • показать все, что скрыто- Вы сможете юзать asp.net mvc?
                                          - Конечно, я на этом MFC 6 лет назад при институте кодил!
                                          Ответить
                                • >Даже роботов нет или гугломобилей. Тока завтраками кормят.
                                  Ну появилась же потреблядская шняга типа Siri
                                  https://www.youtube.com/watch?v=B3ygkiXEurY
                                  Чтоб всякую херню проще покупать.

                                  >И вообще разработка компов 5го поколения загнулась и искусственного интеллекта не будет.
                                  >И даже надежда ИИ: закон мура и масштабируемость многоядерности соснула пополной
                                  А в 60х-70х была эйфория, когда появились нейронные сети, думали если построить достаточно большую сеть, с мириадами перцептронов, она станет разумной (ну по аналогии с мозгом).
                                  Ответить
                                • показать все, что скрыто> масштабируемость многоядерности соснула
                                  Закон Амдала неумолим...

                                  > и вообще плохо внедряются новые технологии
                                  Да что тут удивительного? Они всё существование человечества плохо внедрялись, если не требовались для выживания, войны или получения удовольствия.
                                  Ответить
                                • показать все, что скрыто>>И вообще разработка компов 5го поколения загнулась и искусственного интеллекта не будет

                                  это правда
                                  Ответить
                          • Вся печаль в том, что блич я все равно не досмотрю, так как на 3nn какой-то серии его дропнул не то что даже средний аниме-кун, а даже создатель.
                            Ответить
                      • > буду смотреть аниме
                        Уж лучше царское аниме смотреть, чем быть заедушным питушком.

                        > но тебе ведь не для продакшена, а для души?
                        Это да. Вот только лень что-то новое изучать.
                        Ответить
                        • А вот хотел бы вернуть в зад, то время, что потратил на изучение хаски. Вот я изучил, а он и не нужен. Не иде, не отладчика, ещё и cabal\хакадж ломается при установке пакетов. Бездушная хрень
                          Ответить
                          • показать все, что скрытоНу хаски ради концепций полезен, имхо. После него как-то свободней чувствуешь себя в других языках - можно без страха юзать иммутабельные структуры, ФВП, чистые функции и т.п. Так что польза есть, но не прямая.
                            Ответить
                            • > ради концепций
                              Вот-вот, разве LispGovno запомнил из хаскеля только боль и страдания? Явно что-то хорошее в его жизни было.
                              Ответить
                              • Я в спойлере тоже написал, чтоб его немного утешить.
                                Кстати концепты хачкеля можно смело красть, не изучая при этом ебанутого языка.
                                Ответить
                              • Да запомнил, да применял вне хаски, но нафиг это кому нужно. Да ещё и начальники, которые хаски не читали это не оценивают. Говно какое-то иммутабильное пишишь. Пиши блять нормальный понятный императивный код.
                                Ответить
                                • > Пиши блять нормальный понятный императивный код.
                                  А вы чё думаете, я троллил всё это время?
                                  Ответить
                          • >>А вот хотел бы вернуть в зад, то время, что потратил на изучение хаски. Вот я изучил, а он и не нужен.
                            Га-га-га. Бляяяяяяя.
                            [успокаивается]
                            Уважаю за честность.
                            Вот так оно в жизни и бывает: учил Haskell, а в суровой реальности платят за MFC.Ну ничё концепты идеи еще пригодятся.
                            Ответить
                            • показать все, что скрытоНу, по крайней мере, у него мозг не разложился от унылой работы с MFC да PHP. Еще одна польза хаскелей и других бесполезных языков.
                              Ответить
                              • Ну это ещё вопрос. Я выше написал, что разложился. Неправильное питание, отсутствие света, отсутствие подвижности, отсутствие спорта и чтение книг (в том числе и про хаскель) приводят к разложению мозга. Овощь. даже тни нет.
                                Ответить
                                • показать все, что скрыто> даже тни нет
                                  Ну что-то тебя совсем накрыло в этом году... Ты для себя реши, нужна ли тян тебе или же она нужна окружающим, которые тебя доябывают в духе "28 лет, а не женился" и т.п. Если тебе - ставь цель и добивайся. Если только окружающим - смело ложи на их разговоры хуй и не принимай близко к сердцу. А самокопания и сожаления о прошлом, имхо, ни к чему.
                                  Ответить
                                  • Спасибо. :)
                                    Окружающим вроде, но посмеиваются, да. А родители так вообще негодуют. Старик, а не женат.
                                    Ответить
                    • >Таинственные символы << и >> возможность >=> их ++ переопределения.
                      Я всегда говорил что это блядство. Пока я не смогу нормально это >=> гуглить, толку не будет.

                      >получим генератор генераторов для нашего массива
                      Вообще в 90% слишком повышенная абстрактность вредна. Люди начинают сходить с ума, городят слишком обобщённые и слишком непонятные говнорешения, забывают о KISS.
                      Я понимаю что иногда это надо, но кресты провоцируют писать заумь.
                      Ответить
                      • показать все, что скрыто> Пока я не смогу нормально это >=> гуглить, толку не будет.
                        https://www.haskell.org/hoogle/ - нормально ищет по доке. Лучше, чем ничего.
                        Ответить
                        • Хуясе. Теперь смогу ваши говнокоды читать...
                          А для крестов такого нету? А. Я совсем забыл что там ебанутые значки еще и контекстозависимы.
                          Ответить
                          • показать все, что скрытоДа у крестов значков раз два и обчёлся. Можно таблицу один раз загуглить да выучить. Но проблема не в том...

                            > контекстозависимы
                            ... а как раз вот в этом. Так что поиск по значку не особо поможет. Там нужно добывать маны по типам аргументов, и искать в них смысл этих значков...
                            Ответить
                            • >Можно таблицу один раз загуглить да выучить.
                              А есть свежая? С [] лямбдами и прочей херней.

                              Просто почти все значки сишки/крестов уже стандарт де-факто и так или иначе юзаются в других языках.
                              А в хаскеле видимо чего-то посуровее курили.
                              Ответить
                              • показать все, что скрыто> С [] лямбдами и прочей херней.
                                А там кроме лямбды ([](){} и []{}) и initializer list (std::vector<int> a {1,2,3,4,5}) никаких значков и не добавляли. Ну разве что сделали синтаксис еще более контекстнозависимым, и теперь можно писать std::vector<std::vector<int>> вместо std::vector<std::vector<int> > (раньше с оператором путало, если пробел забыть).
                                Ответить
                                • > и теперь можно писать std::vector<std::vector<int>> вместо std::vector<std::vector<int> > (раньше с оператором путало, если пробел забыть).

                                  А ну так то всё известные вещи. Спрашиваю мож проебал чего, кресты они ведь не перестают удивлять (скорее безумными комбинациями существующих синтаксических элементов).
                                  Ответить
                          • Кстати, одна из самых полезных фич хугла - искать подходящии функции по их сигнатурам.
                            Ответить

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