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

    +23

    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
    //VS 2010 C++
    #include <Windows.h>
    #include <time.h>
    #include <queue>
    #pragma comment(lib, "winmm.lib")
    char shapeForms[7][4][5][6] = {{{{0,0,0,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,1,1,1,1},{0,0,0,0,0}},{{0,0,0,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,1,1,1,1},{0,0,0,0,0}}},{{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,1,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,1,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,1,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,1,1,0}}},{{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,1},{0,0,0,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,0},{0,0,0,1,1},{0,0,0,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,0},{0,0,1,1,1},{0,0,0,0,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,0},{0,0,1,1,0},{0,0,0,1,0}}},{{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,0,1,1}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,0},{0,0,1,1,0},{0,0,1,0,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,0,1,1}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,0},{0,0,1,1,0},{0,0,1,0,0}}},{{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,1},{0,0,1,0,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,0,1,0},{0,0,0,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,0},{0,1,1,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,1,0}}},{{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,1},{0,0,1,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,1,0,0},{0,0,1,1,0},{0,0,0,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,1},{0,0,1,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,1,0,0},{0,0,1,1,0},{0,0,0,1,0}}},{{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,1},{0,0,0,0,1}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,1,1,0},{0,0,1,0,0},{0,0,1,0,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,1,0,0,0},{0,1,1,1,0}},{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,1,0},{0,0,0,1,0},{0,0,1,1,0}}}}, field[32][28] = {0}, shape[5], shape_r[5], modifiers[4][3] = {{0,-1,0},{0,1,0},{1,0,0},{0,0,64}}, keys[4] = {'A', 'D', 'W', 'S'}, keyPressed = -1, lk = 0; //shape - 1: shape state; 2: shape type; 3: y; 4: x;
    std::queue<std::pair<COORD, std::pair<char, char>>> paste;
    COORD t;
    unsigned int Score(0);
    void draw(COORD cd, char c) {if((cd.Y = cd.Y - 4)||true) if(cd.Y >= 0) {SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cd);
    printf("%c", c);}}
    bool next_frame(bool mode, bool isShapeFell) {for(char y(0); y != 5; ++y) {for(char x(0); x != 6; ++x) {t.X = shape[4]+x; t.Y = shape[3]+y; 
    			if(shapeForms[shape[2]][shape[1]][y][x] == 1) {if(field[t.Y][t.X] == 0) paste.push(std::make_pair(t, std::make_pair(-37, 1)));
    				if(field[t.Y][t.X] == 2 || field[t.Y][t.X] == 3) isShapeFell = true;}else if(field[t.Y][t.X] == 1) paste.push(std::make_pair(t, std::make_pair(32, 0)));}}
    	if(isShapeFell) {while(paste.size()) paste.pop();
    		if(mode) for(char i(0); i != 31; ++i) for(char j(0); j != 25; ++j) if(field[i][j] == 1) field[i][j] = 3;
    		return false;}else {for(paste; paste.size() != 0; paste.pop()) {draw(paste.front().first, paste.front().second.first);
    			field[paste.front().first.Y][paste.front().first.X] = paste.front().second.second;}}
    	return true;}
    bool clearFullLines() {for(char isLineExist(1); isLineExist == 1;) {isLineExist = 0;
    		for(char j(0), up(0), down(0), cnt(0); j != 31; (++j) && (cnt = 0)) {for(char i(3); i != 25; ++i) if(field[j][i] == 3) if(j < 5) return false; else cnt++;
    			if(cnt == 22) {if(isLineExist == 0 && (isLineExist = 1) && (down = j)) up = j;
    			else down = j;}else if(isLineExist == 1 && (Score = Score + down-up+1)) {for(char q = down, tmp(0); q >= char(4); (--q)) for(char p(3); p != 25; (++p) && (tmp = 0)) {for(t.X = p, t.Y = q; tmp == 0; tmp = 1);
    					field[q][p] = 0; draw(t, 32);
    					if(field[up+q-down-1][p] == 3) draw(t, -37);
    					t.Y = up+q-down-1;
    					field[q][p] = field[up+q-down-1][p];
    					field[up+q-down-1][p] = 0;}
    				goto next_search;}}
    	next_search:;}
    	return true;}
    int main() {timeBeginPeriod(2);
    	system("mode con cols=42 lines=28");
    	srand(clock()+time(NULL));
    	memset(field, 2, sizeof(field));
    	for(char i(0); i != 28; ++i) for(char j(0), q(0); j != 32; ++j && (q = 0)) for(t.X = i, t.Y = j; q == 0; q = 1) draw(t, -80);
    	for(char i(3); i != 25; ++i) for(char j(0), q(0); j != 30; ++j && (q = 0)) for(t.X = i, t.Y = j; q == 0; (q = 1) && (field[j][i] = 0)) draw(t, 32);
    	for(int tm = 100;true;) {next_turn: if(!clearFullLines() && printf("You fail!")) {system("pause");
    			return 0;}
    		for(t.X = 30, t.Y = 5; false;);  
    		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), t);
    		printf("Score: %i ", Score);
    		shape[1] = rand()*4/(RAND_MAX+1); shape[2] = rand()*7/(RAND_MAX+1); shape[4] = rand()*20/(RAND_MAX+1)+3;
    		for(shape[3] = 0; true; shape[3]++) {for(char h(0); h != 5; ++h) {Sleep(tm); tm = 70;
    				for(char i(0); i != 4 && keyPressed == -1; ++i) if(GetKeyState(keys[i]) < 0) keyPressed = i;
    				if(keyPressed != -1 && !(lk == keyPressed && lk == 2)) {for(char j(0); j != 5; ++j) shape_r[j] = shape[j];
    					shape[4] += modifiers[keyPressed][1]; shape[1] = (shape[1] + modifiers[keyPressed][0])%4;
    					tm -= modifiers[keyPressed][2];
    					lk = keyPressed;
    					keyPressed = -1; 
    					if(!next_frame(false, false)) {for(char j(0); j != 5; ++j) shape[j] = shape_r[j];
    						if(!next_frame(true, false)) goto next_turn;}}else {if(!next_frame(true, false)) goto next_turn;
    					if(keyPressed == -1) lk = -1;
    					if(lk != 2) lk = 0;else keyPressed = -1;}}}}}

    Была задача за минимальное кол-во строк реализовать простой тетрис. Особого внимания заслуживает 6 строчка кода. Всё очень плохо?
    Управление WSAD.

    Запостил: o0oflashero0o, 26 Декабря 2013

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

    • Хммм, он работает.
      Больше так не пиши).
      Ответить
      • На чём скомпилировано? Проверено только на Visual Studio 2010.
        Ответить
        • #pragma comment(lib, "winmm.lib") - что поддерыживается чем-то кроме компиляторов Майкрософта?
          Ответить
          • Вроде только вижуалка так умеет.
            Ответить
            • Говорят, clang стремится стать заместителем cl.exe.
              Ответить
              • Если он будет компилить строго по стандарту - обидятся все, кто юзает расширения и багофичи от M$.
                А если он будет полностью совместим с M$VC, то в чем смысл? Разве что M$ заипались пилить свой компилятор (как и разрабы Opera), и хотят прикрутить вместо него кланг...

                Так что х.з., нужно ли.
                Ответить
                • Я однажды переносил свой собственный код с gcc на MSVC, и он громко сломался. Выяснилось, что во всех ошибках был виноват я, а gcc был во многом более прощающий, чем MSVC.

                  Если clang-cl будет полностью совместим с cl.exe, можно будет юзать его прямо из Visual Studio.
                  Ответить
                  • Я однажды переносил свой собственный код с MSVC на gcc, и он громко сломался. Выяснилось, что во всех ошибках был виноват я, а MSVC был во многом более прощающий, чем gcc (например разрешал описывать шаблоны внутри функций).

                    Все они слишком всепрощающие :(
                    Ответить
                    • Мда, неужели не доводилось видеть проекты для многих платфом? Эти мириады из макросов, вставляющих викидающих фрагменты кода взависимости от компилера, эти чудные головобольки для 16-битных строк (wchar_t, short int).
                      Ответить
                      • да, не так давно видел libgdx - фреймфорк для жабы, умеющий и в андроид, и в хтмл5, и а обычную жабу. правда, дока скудная, многих фич нет или не описаны - хотя на дворе 2014ый...
                        Ответить
                        • > умеющий и в андроид, и в хтмл5
                          О_о
                          Ответить
                          • "Cross Platform
                            Publish your games on Windows, Mac, Linux, Android, iOS, BlackBerry and HTML5, all with the same code base."
                            http://libgdx.badlogicgames.com/index.html
                            Ответить
                      • на что только не идут люди, лишь бы не юзать буст
                        Ответить
                  • > id - 440
                    Не перевелись ещё олдфаги на GK.
                    Ответить
                • Кланг еще и автокомплитом подрабатывает. Так что польза будет.
                  Ответить
                  • Разрабам визуалки - не спорю. Им сразу гора с плеч, если они выкинут свой компилер и заменят его шлангом ;)

                    А юзеры особой разницы не заметят (если будет полная совместимость с M$VC), либо будут материться что M$ пидарасы и все сломали (если ее не будет).

                    Тут профит разве что в халявной сборке визуалковских проектов без визуалки. Но что делать с либами, которые идут в комплекте визуалки, они же вроде как проприетарные?
                    Ответить
                    • Ну вот флексовый компилятор базируется на проприетарной либе (более того, без нее вообще ничего кроме минимального ж.скриптоподобного кода не соберет), и тем не менее опенсорс.
                      Адобу нет профита с разработчиками судиться, они там очень долго делили-рядили, как бы так им разрешить пользоваться проприетарной либой, и чтобы лицензию от Апачи можно было прилепить. В итоге нашли какой-то выход. Думаю Микрософт тоже бы нашел, если бы захотел.
                      Скорее будет зависеть от позиции разработчиков: согласятся ли они на ткое сожительство, или не будут дошой кривить.
                      Ответить
                    • >>если они выкинут свой компилер и заменят его шлангом
                      Хм. А как же мнимая совместимость с сборками дотнета? (Мнимая ибо плюсы в принципе нормальный CIL код не способны сгенерировать)
                      Ответить
                • > багофичи

                  багорофичи )))
                  Какой багор )))
                  Ответить
      • Интересно, будет ли работать под linux или просто под нативными плюсами, возможно надо будет заменить функции ввода.
        Ответить
        • > возможно надо будет заменить функции ввода
          Трабла в том, что в стандарте плюсов не прописаны такие функции ввода (установка курсора, очистка экрана и т.п.). И нужно либо платформозависимые средства юзать, либо внешнюю кроссплатформенную либу.

          > будет ли работать под linux
          #include <Windows.h>
          Ответить
          • Ясно. Думаю, Qt решит все эти проблемы.
            Ответить
            • Формочками и графикой ;) Курсор в консоли двигать не умеет.
              Ответить
              • n, мать их, curses спасут отца русской демократии?
                Ответить
          • > Трабла в том, что в стандарте плюсов не прописаны такие функции ввода

            Мне последнее время все больше кажется что та часть стандартной библиотеки, та что работает с аппаратурой\ос в сишке и крестах должна быть как можно тоньше.
            Ответить
    • Почему код написан в стиле пьяного дракона?
      Ответить
      • Жил был Змей Горыныч. А у Змеев Горынычей, как известно, три головы. Одна голова любила женщин, вторая голова любила женщин, а третья усиленно пидорстововала - сосала всем кому ни попадя. Вот две головы рассуждают, как им быть.
        -Позорит нас эта голова. Пойдем-ка к крестьянам, пусть они ее отрубят.
        -Замолчи, дурак!.. Ведь не ровен час, услышит - начнет, чего доброго, в жопу ебаться!..
        Ответить
    • >> Была задача за минимальное кол-во строк реализовать простой тетрис

      Какие извращенные задачи
      Ответить
      • Это было больше соревнованием чем реальной задачей :) Единственным условием при написании было: не писать более одной операции в одном блоке в одну строчку.
        Ещё есть змейка, но там дракон уже не пьяный, а обкуренный.
        Ответить
        • Ну мне после этого по коду сказать нечего - ибо все остальное яввное говно возникает из ебанутого условия

          Вопрос - вы суда похвастаться? Для этого вообще то хабра есть
          Ответить
          • Да ну, куда уж тут... Говнокод же.
            Ответить
            • Ну я могу долго обсерать повторяющиеся куски, ебанутые присвоения и тд Начинать?
              Ответить
              • Итак всё ясно, но если реально можно что-то сократить сильно, то хотел бы увидеть.
                Ответить
          • На хабр надо полезное заливать, а тут по фану.
            Ответить
          • почему условие ебанутое?
            без него всё было бы проще, любой код занял бы 1 строку
            Ответить
            • Не любой. Инклуды в одну строку не влезут.
              Ответить
              • а если их содержимое скопипастить?
                Ответить
                • gcc -E тогда уж, чтобы избавиться от всех препроцессорных инструкций.

                  556 килобайт высрало от <queue>, <iostream> и <ctime>...

                  Но код после копипасты или -E перестанет быть кроссплатформенным ;(
                  Ответить
        • >не писать более одной операции в одном блоке в одну строчку.

          Используй оператор «запятая». Заодно хороший способ обфускации.
          Строки 26-28:
          field[up+q-down-1][p] = ((t.Y = up+q-down-1),(field[q][p] = field[up+q-down-1][p]),0)}
          Ответить
          • Ну тогда пропадает интерес, можно считать, что это тоже запрещено. Хотелось бы реально записать код кратко, а не искать пути обхода условия.
            Ответить
            • > а не искать пути обхода условия.
              > for (t.X = 30, t.Y = 5; false;);
              А это тогда что? :) Самый настоящий обход условия. А по сути то же самое, что и t.X = 30, t.Y = 5;
              Ответить
              • Да, действительно, но это не так критично, как запихать весь код в одну строку. Надо было ставить себе более четкую задачу по стилю оформления.
                Ответить
                • На старых системах можно было бы:
                  int main() {
                  const char* code = " //Машинный код готового тетриса в одну строчку
                  /*здесь вызываем код содержащийся в строковом литерале.*/}
                  На современных выполнить что-то в сегменте данных просто так не дадут.
                  Ответить
                  • В php работает. чтднт
                    Ответить
                    • В php можно засунуть пыховский байткод в строку и исполнить его?
                      Ответить
                      • Через расширения можно. Навскидку: apc_bin_load, bcompiler_read (не чистый байткод, а специальный дамп, но всё же).
                        Ответить
                        • Ну через расширения и на си можно. Правда не кроссплатформенно будет.
                          Ответить
            • тогда пишите на питоне, с запретом на оператор, разрешающий писать в строчку
              Ответить
        • Толедо сделал шахматы, которые довольно неплохо играют, и написал при этом меньше кода чем ваш тетрис.
          Ответить
          • А линк можно?
            Ответить
            • http://nanochess.110mb.com/chess4.html
              Ответить
              • js же. По плюсам вообще мало коротких кодов видел, в основном на js, получается короче. Вот тут тоже есть тетрис на 30 строк, но он совсем примитивный, да и назвать это тетрисом сложно.
                http://30lines.info/
                Ответить
                • > js же
                  Там на сайте у толедо есть и сишная версия, емнип.
                  Ответить
                  • хотелось бы посмотреть на неё до офускрации
                    Ответить
                    • Вот более-менее читаемая версия: https://github.com/bormand/nanochess

                      Правда я пытался разобрать js, а не C, но я думаю, что логика ничем не отличается, только ввод-вывод другой.
                      Ответить
        • >> Единственным условием при написании было: не писать более одной операции в одном блоке в одну строчку.

          >>shape[1] = rand()*4/(RAND_MAX+1); shape[2] = rand()*7/(RAND_MAX+1); shape[4] = rand()*20/(RAND_MAX+1)+3;
          >>for(shape[3] = 0; true; shape[3]++) {for(char h(0); h != 5; ++h) {Sleep(tm); tm = 70;
          Читерство.

          Это ж C++, юзайте больше препроцессора.
          Правильный код в таких конкурсах должен быть абсолютно, подчеркиваю _абсолютно_ нечитаемым.
          Ответить
    • #include <Windows.h>
      #include <time.h>
      #include <queue>
      #pragma comment(lib, "winmm.lib")
      остальной код в одну строчку
      Ответить
    • Гиперкубические строки...
      Ответить
    • > paste.pop();

      читая по диагонали, мозг увидел `taste.poop()`
      Ответить

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