Кресты / Говнокод #26962 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
const int x_size(20), y_size(10); int x_pos(x_size/2+1); int y_pos(y_size/2+1);
enum border_types{lineNL, single, singleNL};
enum directions{UpLeft=1, UpRight, DownLeft, DownRight}dir;
void draw_border(enum border_types borders) {
	do{
		if(borders == single || borders == singleNL) break;
		for(int i=0; i<x_size+1; i++)
	  	  putchar('#');
	}while(false);
	putchar('#');
	if(borders == singleNL || borders == lineNL) std::cout << '\n';}
void display_update() {
	system("cls");
	draw_border(lineNL);
	for(int i=1; i<=y_size; i++)
	{
		draw_border(single);
		for(int j=1; j<=x_size; j++)
		{
			if(j == x_pos && i == y_pos)
			{
				putchar('x');
				continue;
			}
			putchar(32);
		}
		draw_border(singleNL);;
	}
	draw_border(lineNL);
	std::cout << "X: " << x_pos << "\tY: " << y_pos;}
void logic() {
	switch(x_pos)
	{
		case 1:
			if(dir == UpLeft) dir = UpRight;
			if(dir == DownLeft) dir = DownRight;
			break;
		case x_size:
			if(dir == UpRight) dir = UpLeft;
			if(dir == DownRight) dir = DownLeft;
	}
	switch(y_pos)
	{
		case 1:
			if(dir == UpLeft) dir = DownLeft;
			if(dir == UpRight) dir = DownRight;
			break;
		case y_size:
			if(dir == DownLeft) dir = UpLeft;
			if(dir == DownRight) dir = UpRight;
	}}
void move() {
	switch(dir)
	{
		case UpLeft:
			x_pos--;
			y_pos--;
			break;
		case UpRight:
			x_pos++;
			y_pos--;
			break;
		case DownLeft:
			x_pos--;
			y_pos++;
			break;
		case DownRight:
			x_pos++;
			y_pos++;
	}}
int main() {
	srand(time(0));
	rand();
	switch(rand()%4+1)
	{
		case UpLeft:
			dir = UpLeft;
			break;
		case UpRight:
			dir = UpRight;
			break;
		case DownLeft:
			dir = DownLeft;
			break;
		case DownRight:
			dir = DownRight;
	}
	while(!kbhit())
	{
		display_update();
		logic();
		move();
	}
	return 0;}

Сорян, пришлось уплотнить фигурные скобки, чтобы код уместился в 100 строк.

BelCodeMonkey BelCodeMonkey, (Updated )

Комментарии (65, +65)

Кресты / Говнокод #26958 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
class UnitedFigure : public Figure {
    Figure &f1;
    Figure &f2;

public:
    UnitedFigure (Figure &_f1, Figure &_f2) : f1(_f1), f2(_f2) {}

    double distance_to(const Point &p) const override {
        return std::min(f1.distance_to(p), f2.distance_to(p));
    }
}

Завезли ссылочные поля класса, это в каком стандарте?
Даже тестил когда то такое, наверное на C++03 и получал ошибку компилятора.
Я и не знал, что добавили такую прекрасную возможность выстрелить себе в ногу.

YpaHeLI_ YpaHeLI_, (Updated )

Комментарии (242, +242)

Кресты / Говнокод #26953 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
uint64_t stored_msg_id = _container_msg_id.get(ctrl_msg.sequence); // Получаем msg_id из мапы для связки сообщений
if (stored_msg_id)
    proto_fill(ctrl_msg, stored_msg_id); // если он там был то новому сообщению даем этот msg_id
else
    proto_fill(ctrl_msg);  // Иначе формируем новый msg_id

// Отсылаем сообщение 
...

// Если msg_id не был в _container_msg_id то произойдет попытка вставки msg_id полученного через proto_fill.
if (!stored_msg_id && !_container_msg_id.insert(ctrl_msg.sequence, ctrl_msg.msg_id))
{
    DEBUG(L, 0, "[%p] Can't store request's control message id (%llu) in bunch map" \
                ", response's msg_id will differ", this, msg.msg_id);
}

С точки зрения читабельности кода, в последнем ветвлении говнокод?

OlegUP OlegUP, (Updated )

Комментарии (26, +26)

Кресты / Говнокод #26946 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
foreach ($files as $n => $f) {
    $new_content = $common.$namespace_begin.$f.$namespace_end;

    $std_methods = array();
    preg_match_all('/std::[a-z_0-9]*/', $new_content, $std_methods);
    $std_methods = array_unique($std_methods[0]);

    $needed_std_headers = array();
    $type_headers = array(
        'std::move' => '',
        'std::vector' => '',
        'std::string' => '',
// [...]
        'std::unordered_set' => 'unordered_set');
    foreach ($type_headers as $type => $header) {
        if (in_array($type, $std_methods)) {
            $std_methods = array_diff($std_methods, array($type));
            if ($header && !in_array($header, $needed_std_headers)) {
                $needed_std_headers[] = $header;
            }
        }
    }

    if (!$std_methods) { // know all needed std headers
        $new_content = preg_replace_callback(
            '/#include <([a-z_]*)>/',
            function ($matches) use ($needed_std_headers) {
                if (in_array($matches[1], $needed_std_headers)) {
                    return $matches[0];
                }
                return '';
            },
            $new_content
        );
    }

Тут вот в https://govnokod.ru/20049 CHayT предлагал использовать «PHP» в качестве препроцессора для «C» — так вот в «Телеграме» совет оценили и решили взять на вооружение.
https://github.com/tdlib/td/blob/master/SplitSource.php

gost gost, (Updated )

Комментарии (20, +20)

Кресты / Говнокод #26943 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
#include <vector>
#include <cwchar>
#include <algorithm>
#include <iostream>
 
int main()
{
    std::vector<const wchar_t*> leaders{L"Ленин", L"Сталин", L"Маленков",
        L"Хрущёв", L"Брежнев", L"Андропов", L"Черненко", L"Горбачёв"};
 
    std::sort(leaders.begin(), leaders.end(), [](auto strA, auto strB) {
        return std::wcscmp(strA, strB) < 0;
    });
 
    std::setlocale(LC_ALL, "en_US.utf8");
    std::wcout.imbue(std::locale("en_US.utf8"));
    for (auto leader : leaders)
        std::wcout << leader << '\n';
}

Отсюда:
https://en.cppreference.com/w/cpp/string/wide/wcscmp

Naf-Naf Naf-Naf, (Updated )

Комментарии (14, +14)

Кресты / Говнокод #26913 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
int main()
{   
    using output1 = Eval<
        Input<'H', 'e', 'l', 'l', 'o'>,
        App<
            ',', '>', ',', '>', ',', '>', ',', '>', ',', '>',
            '<', '.', '<', '.', '<', '.', '<', '.', '<', '.'
        >
    >;
    std::cout << "Hello reverse (read/write): " << SpanToStringContinuous<output1>::value() << std::endl;

    using output2 = Eval<
        Input<>,
        App<'+', '+', '+', '[', '-', ']'>
    >;
    std::cout << "Simple loop (empty output): " << SpanToStringContinuous<output2>::value() << std::endl;

    // Source: Wikipedia
    using output3 = Eval<
        Input<>,
        App<
            '+', '+', '+', '+', '+', '+', '+', '+', '[', '>', '+', '+', '+',
            '+', '[', '>', '+', '+', '>', '+', '+', '+', '>', '+', '+', '+',
            '>', '+', '<', '<', '<', '<', '-', ']', '>', '+', '>', '+', '>',
            '-', '>', '>', '+', '[', '<', ']', '<', '-', ']', '>', '>', '.',
            '>', '-', '-', '-', '.', '+', '+', '+', '+', '+', '+', '+', '.',
            '.', '+', '+', '+', '.', '>', '>', '.', '<', '-', '.', '<', '.',
            '+', '+', '+', '.', '-', '-', '-', '-', '-', '-', '.', '-', '-',
            '-', '-', '-', '-', '-', '-', '.', '>', '>', '+', '.', '>', '+',
            '+', '.'
        >
    >;
    std::cout << "Hello World (wiki): " << SpanToStringContinuous<output3>::value() << std::endl;


    return EXIT_SUCCESS;
}

https://wandbox.org/permlink/AERueBhsiS4WxGZY, https://pastebin.com/Cywe05JY

Напейсал полностью компайл-таймовый интерпретатор «Брейнфака» на крестовых шаблонах.

gost gost, (Updated )

Комментарии (34, +34)

Кресты / Говнокод #26912 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
void tick(void)
{
	for (auto&& x : registry.objects)
		(x? std::function<void(void)>([&](void) {((IObject*)(x))->tick(); }) : [&]() {})();
}

Мозг сказал что "((IObject*)(x))->tick();" написать слишком сложно и повелел написать вот это.

digitalEugene digitalEugene, (Updated )

Комментарии (30, +30)

Кресты / Говнокод #26910 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
// https://govnokod.ru/26890#comment571155
// bormand 2 часа назад #
// Можно брейнфак запилить на операторах. Как раз вроде унарных хватает.
// & * - ~ ! -- + ++ --

#include <array>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <limits>

struct Brainfuck {
public:
    using IPType = uint16_t;
    constexpr static size_t MAX_MEMORY = std::numeric_limits<IPType>::max();

    std::array<uint8_t, MAX_MEMORY> memory{};
    std::vector<char> app{};
    IPType ip = 0;
    IPType cell = 0;

    IPType find_matching_tag(IPType cur_ip, char open, char close, int ip_direction)
    {
        size_t stack_size = 0;
        do  {
            if (app[cur_ip] == close) {
                --stack_size;
            }
            if (app[cur_ip] == open) {
                ++stack_size;
            }
            cur_ip += ip_direction;
        } while (stack_size > 0);
        return cur_ip - ip_direction;
    }

    IPType find_matching_close_tag(IPType cur_ip)
    {
        return find_matching_tag(cur_ip, '[', ']', 1);
    }

    IPType find_matching_open_tag(IPType cur_ip)
    {
        return find_matching_tag(cur_ip, ']', '[', -1);
    }

    void loop_open()
    {
        if (memory[cell] == 0) {
            ip = find_matching_close_tag(ip);
        } else {
            ++ip;
        }
    }

    void loop_close()
    {
        if (memory[cell] != 0) {
            ip = find_matching_open_tag(ip);
        } else {
            ++ip;
        }
    }

    void exec(char op)
    {
        switch (op) {
            case '>': ++cell; break;
            case '<': --cell; break;
            case '+': ++memory[cell]; break;
            case '-': --memory[cell]; break;
            case '.': std::putchar(memory[cell]); break;
            case ',': memory[cell] = static_cast<uint8_t>(std::getchar()); break;
            case '[': loop_open(); return;   // no ip advancing
            case ']': loop_close(); return;  // no ip advancing
        }
        ip++;
    }

    void run()
    {
        while (ip < app.size()) {
            exec(app[ip]);
        }
    }

public:
    Brainfuck & operator++() { app.push_back('>'); return *this; }
    Brainfuck & operator--() { app.push_back('<'); return *this; }
    Brainfuck & operator+() { app.push_back('+'); return *this; }
    Brainfuck & operator-() { app.push_back('-'); return *this; }
    Brainfuck & operator*() { app.push_back('.'); return *this; }
    Brainfuck & operator&() { app.push_back(','); return *this; }
    Brainfuck & operator!() { app.push_back('['); return *this; }
    Brainfuck & operator~() { app.push_back(']'); return *this; }
    Brainfuck & operator>>(const Brainfuck &) { run(); return *this; }
};

https://wandbox.org/permlink/XJUKGyb4YbnBVwOI

Бонус («99 bottles of beer»): https://pastebin.com/s4sBK9nX (взято с https://github.com/fabianishere/brainfuck/blob/master/examples/bottles-1.bf).

gost gost, (Updated )

Комментарии (77, +77)