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

    +57

    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
    #include <cstdio>
    #include <cstring>
    
    int main() {
        unsigned long long int a[100000];
        unsigned long long int N;
        unsigned long long int max,max1;
        unsigned long long int maxC,maxC1;
        unsigned long long int maxN[100000];
        unsigned long long int ans = 0;
        unsigned long long int ans1 = 0;
        max = max1 = maxC = maxC1 = 0;
        scanf("%llu",&N);
        for (unsigned long long int i = 0; i < N; ++i) {
            scanf("%llu",a + i);
            if (a[i] > a[max]) {
                max1 = max;
                maxC1 = maxC;
    //            memcpy(maxN,maxN1,maxC*sizeof(unsigned long long int));
                max = i;
                maxC = 1;
                maxN[0] = max;
            } else if (a[i] == a[max]) {
                maxN[maxC++] = i;
            } else if (a[i] > a[max1]) {
                max1 = i;
                maxC1 = 1;
            } else if (a[i] == a[max1]) {
                maxC1++;
            }
        }
        if (maxC == 1) {
            ans = a[max];
            if (a[max] == a[max1] + 1) {
                if (a[max] < (maxC1 + 1) * a[max1]) {
                    printf("%llu\n",a[max]);
                    return 0;
                }
            }
            if (max > 0) {
                if (a[max - 1] + 1 < ans - 1) {
                    if (a[max - 1] + 1 == a[max1]) {
                        if (a[max1] * (maxC1 + 1 + (a[max] - 1 == a[max1]?1:0)) < ans) {
                            ans1 = a[max1] * (maxC1 + 1 + (a[max] - 1 == a[max1]?1:0));
                            if (ans > ans1) ans = ans1;
    //                        prunsigned long long intf ("1 : %d\n",ans);
                        }
                    }
                    else { 
                        ans1 = a[max] - 1 + (a[max] - 1 == a[max1]?a[max1] * maxC1:0);
                        if (ans > ans1) ans = ans1;
    //                    prunsigned long long intf ("2 : %d\n",ans);
                    }
                }
            }
            if (max < N - 2) {
                if (a[max + 1] + 1 < ans - 1) {
                    if (a[max + 1] + 1 == a[max1]) {
                        if (a[max1] * (maxC1 + 1 + (a[max] - 1 == a[max1]?1:0)) < ans) {
                            ans1 = a[max1] * (maxC1 + 1 + (a[max] - 1 == a[max1]?1:0));
                            if (ans > ans1) ans = ans1;
    //                        prunsigned long long intf ("3 : %d\n",ans);
                        }
                    }
                    else { 
                        ans1 = a[max] - 1 + (a[max] - 1 == a[max1]?a[max1] * maxC1:0);
                        if (ans > ans1) ans = ans1;
    //                    prunsigned long long intf ("4 : %d\n",ans);
                    }
                }
            }
            printf("%llu\n",ans);
            return 0;
        } // one max line
        bool f = true;
        bool f1 = true;
        if (a[max] * maxC > a[max] + 1) {
    //        prunsigned long long intf("here %d\n",maxC);
            for (unsigned long long int i = 0; i < maxC; ++i) {
                if (f1 && ((maxN[i] && a[maxN[i] - 1]) || (maxN[i] < N - 1 && a[maxN[i] + 1]))) f1 = false; // get from near line
                if (f && ((maxN[i] && a[maxN[i] - 1] < a[max] - 1) || (maxN[i] < N - 1 && a[maxN[i] + 1] < a[max] - 1))) f = false;
            }
        }
        ans1 = ans = maxC * a[max];
        
        if (!f && a[max] > 1) ans = (maxC - 1) * a[max];
        if (!f1) ans1 = a[max] + 1;
        printf("%llu\n",ans>ans1?ans1:ans);
        return 0;
    }

    Серега говнокодит задачу с OpenCup'a от 15.03.2015 (задача L - Бассейн счастья)

    kosta3ov, 15 Марта 2015

    Комментарии (26)
  2. C++ / Говнокод #17786

    +54

    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
    #include <iostream>
    using namespace std;
    
    struct Foo
    {
    	int i[0];
    };
    
    int main() {
    	// your code goes here
    	Foo f1;
    	Foo f2[5];
    	cout << sizeof(f1) << endl;
    	cout << sizeof(f2) << endl;
    	return 0;
    }

    http://rextester.com/NAA5246
    http://rextester.com/GKLFG82436
    http://rextester.com/SSZ22454
    http://rextester.com/ZEY11320

    DlangGovno, 14 Марта 2015

    Комментарии (12)
  3. C++ / Говнокод #17777

    +56

    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
    template<typename T, typename E=emp> class _interlock;
    		template<typename T> class _interlock
    			<T,
    			typename std::enable_if<
    				std::is_same<
    					typename std::conditional<
    						std::is_same<udi,typename std::make_unsigned<T>::type>::value,
    						udi,
    						uqi
    					>::type,
    					typename std::make_unsigned<T>::type
    				>::value
    			>::type
    			>
    		{
    		public:
    
    			_interlock
    				<T,
    				typename std::enable_if<
    				std::is_same<
    				typename std::conditional<
    				std::is_same<udi,typename std::make_unsigned<T>::type>::value,
    				udi,
    				uqi
    				>::type,
    				typename std::make_unsigned<T>::type
    				>::value
    				>::type
    				>
    				(T x=0)
    			{
    				number=x;
    			}
    
    			//Возвращается прежнее значение
    			T operator + (T x)
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,(_sign_t)x);
    			}
    
    			//Возвращается прежнее значение
    			T operator - (T x)
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,-(_sign_t)x);
    			}
    
    			//Чтение
    			T operator () ()
    			{
    				return number;
    			}
    
    			//Замена на x
    			T operator () (T x)
    			{
    				return (T)InterlockedExchange((_unsign_t*)&number,(_unsign_t)x);
    			}
    
    			//Сравнение с y, замена на x, если равны
    			T operator () (T x, T y)
    			{
    				return (T)InterlockedCompareExchange((_unsign_t*)&number,(_unsign_t)x,(_unsign_t)y);
    			}
    			
    			T operator ++ ()
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,1)+1;
    			}
    
    			T operator -- ()
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,-1)-1;
    			}
    
    			T operator ++ (int)
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,1);
    			}
    
    			T operator -- (int)
    			{
    				return (T)InterlockedExchangeAdd((_unsign_t*)&number,-1);
    			}
    
    		private:
    			typedef typename std::make_unsigned<T>::type _unsign_t;
    			typedef typename std::make_signed<T>::type _sign_t;
    			volatile T number;
    		};

    Функция "ИЛИ" для типов через type_traits для шаблона. А также атомарный: сумматор, счётчик, компаратор с возможностью условной и безусловной замены значения в одном лице. Для типов: udi (unsigned int), sdi (signed int), uqi (unsigned long long), sqi (signed long long). Тип emp = void (от слова empty).

    Tirannozavr, 13 Марта 2015

    Комментарии (24)
  4. C++ / Говнокод #17761

    +68

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    int a, b ;
    //some code
    int numCount = 0;
    while ((a + numCount++) < b)    // посчитать кол-во чисел между a и b, включая a и b
       ;

    это великолепно!

    Croessmah, 11 Марта 2015

    Комментарии (12)
  5. C++ / Говнокод #17750

    +54

    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
    void Game::initialize()
    {
        if (SDL_Init(SDL_INIT_VIDEO))
            exit(1);
        
        window = new Window("Game", 640, 480);
        try
        {
            window->create();
        }
        catch (const Exception& exception)
        {
            std::cout << exception.getError() << '\n';
            delete window;
            exit(1);
        }
        
        canvas = new Canvas();
        try
        {
            canvas->initialize(window->getWindow());
        }
        catch (const Exception& exception)
        {
            std::cout << exception.getError() << '\n';
            delete canvas;
            exit(1);
        }
    }

    jangolare, 09 Марта 2015

    Комментарии (21)
  6. C++ / Говнокод #17739

    +59

    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
    LPVOID  lpInfo = NULL;;
    UINT    unInfoLen = 0;
    
    DWORD  dwLangCode = 0;
    if (!GetTranslationId(lpInfo, unInfoLen, GetUserDefaultLangID(), dwLangCode, FALSE))
    {
        if (!GetTranslationId(lpInfo, unInfoLen, GetUserDefaultLangID(), dwLangCode, TRUE))
        {
          if (!GetTranslationId(lpInfo, unInfoLen, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), dwLangCode, TRUE))
          {
            if (!GetTranslationId(lpInfo, unInfoLen, MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), dwLangCode, TRUE))
              // use the first one we can get
              dwLangCode = *((DWORD*)lpInfo);
          }
        }
    }

    докомментировались, ебанатики...

    blackhearted, 06 Марта 2015

    Комментарии (17)
  7. C++ / Говнокод #17731

    +62

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    void f(bool *ok = 0)
    {
        //тут возникла ошибка
        if (ok)
            *ok = false;
        return;
    }
    
    //далее в коде
    bool ok = false;
    f(&ok);

    не, ну заебок, чо

    blackhearted, 05 Марта 2015

    Комментарии (85)
  8. C++ / Говнокод #17730

    +51

    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
    #if defined(alignas) /* check C++ keywords */ \ 
    || defined(alignof) \ 
    || defined(asm) \ 
    || defined(auto) \ 
    || defined(bool) \ 
    
    <...snip...>
    
    || defined(virtual) \ 
    || defined(void) \ 
    || defined(volatile) \ 
    || defined(wchar_t) \ 
    || defined(while) 
    #error keyword defined before including C++ standard header 
    #endif /* defined... */

    Из заголовочных файлов VS 2012.

    http://www.viva64.com/en/b/0146/

    someone, 05 Марта 2015

    Комментарии (7)
  9. C++ / Говнокод #17725

    +51

    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
    #include <ppl.h>
    #include <windows.h>
    #include <ppltasks.h>
    #include <iostream>
    #include <vector>
    
    using namespace Concurrency;
    using namespace std;
    
    CRITICAL_SECTION cs6;
    
    int main(int argc, char* argv[])
    {
    	size_t concurentThreadsSupported = std::thread::hardware_concurrency();
    	cout << concurentThreadsSupported << endl;
    	//deadlock hazard increased with concurentThreadsSupported decreasing
    
    	size_t taskAmountForWasteVirtualCores = concurentThreadsSupported - 1;//must be equal to (virtual processor thread amount from Concurrency::IResourceManager) - 1
    	vector<task<void>> t;
    	for (size_t i = 0; i<taskAmountForWasteVirtualCores; ++i)
    		t.push_back(create_task([]{
    			Sleep(INFINITE);//some very long IO operation or deadlocked by EnterCriticalSection or sql transaction or other
    		}));
    	Sleep(1000);
        cout << "another way:" << endl;
        InitializeCriticalSection(&cs6);
        auto locker = create_task([]{
            cout << "locker" << endl;
            EnterCriticalSection(&cs6);//same as begin sql transaction
            cout << "locker entered cs 6" << endl;
            Concurrency::wait(500);//Deadlock by any concurrency context switching directly or indirectly by std or MFC (events, mutex, etc)
            cout << "locker played" << endl;
            LeaveCriticalSection(&cs6);//same as end sql transaction
            cout << "~locker ok" << endl;
        });
        auto locked = create_task([]{
            cout << "locked" << endl;
            EnterCriticalSection(&cs6);//same as begin sql transaction
            cout << "locked entered cs 6" << endl;
            Concurrency::wait(500);
            cout << "locked played" << endl;
            LeaveCriticalSection(&cs6);//same as end sql transaction
            cout << "~locked ok" << endl;
        });
    	Sleep(1000);
    	cout << "FAIL" << endl;
    	return 0;
    }

    Нашел дидлок)
    http://rextester.com/KHC72232
    http://rextester.com/EMG65441

    laMer007, 04 Марта 2015

    Комментарии (11)
  10. C++ / Говнокод #17720

    +52

    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
    void ArmInterface::dispatchMessage(QString name, QJsonArray args)
    {
        //флаг того что мы не смогли обработать
        bool notCallbacks = true;
        //проходим по всем методам( которые кстати можно создать в рантайме )
        for( int i = 0; i < metaObject()->methodCount() ; i++ )
        {
            QMetaMethod method = metaObject()->method( i);        
            
            //имя метода подходит под имя под сообщение от сервера? Прекрасно проверяем дальше.
            if ( method.name() != name )
            {
                qWarning() << "method.name() != name" << " -> " <<method.name() << " != " << name;
                //так как метод не найден мы просто выйдем отсюда, не дожидаясь ничего плохого
                continue;            
            }
            //метод у нас публичный? Если да то можно запускать обработку иначе заявим что низя
            if ( method.access() != QMetaMethod::Public )
            {
                qWarning() << "Method " << method.name()<< " not public!";
    #ifdef IGNORE_NOT_PUBLIC_METHOD
                continue;
    #endif
            }
            //несовдатает количество аргументов? Хватит это терпеть пишем warning, и если надо выходим из этого диспатчера
            int countParams = method.parameterCount();
            if ( args.count() != method.parameterCount() )
            {
                qWarning() << "Method " << method.name() << " params count = " << method.parameterCount() << " and received args params count =  "  << args.count();
    #ifndef IGNORE_METHOD_PARAMS_COUNT
                continue;
    #endif
                //берем наименьшее количество параметров
                countParams = countParams > args.count() ? countParams : args.count();
            }
            
            //создание валидного QGenericArgument 
            auto genericArg = [ this, method, args ]( int index ) -> QGenericArgument{
                //out of range? 
                if ( args.count() <= index || 
                     method.parameterCount() <= index )
                    return QGenericArgument();
                void * data = 0;
                //сохраняем временный QVariant для дальнейшей более удобной работы с ним
                QVariant  temp = args.at( index ).toVariant();
                //попытка конвертирования типов. Если что-то не получается, пишем в лог. Мб надо будет сделать преждевременный выход, если сконвертировать не получается.
                if ( !temp.convert( method.parameterType( index) ) )
                {
                    qWarning()<< objectName() << " method : " << method.name() <<
                                 " Not convert " << method.parameterNames().at( index ) << args.at( index ).toVariant().typeName() << 
                                 " from " << args.at( index ).toVariant().typeName() << 
                                 " to " << QMetaType::typeName( method.parameterType( index) )  ;
                };
                //у нас есть такой аргумент? Если нет - то ничего не делаем
                if ( args.count() > index )
                {
                    data = QMetaType::create( method.parameterType( index ) , temp.data() );
                }
                const char * name = 0;
                //у нас есть имя аргумента и аргумент в него? Если чего-то нет - то ничего и не будем ничего делать
                if ( method.parameterNames().count() > index && data)
                    name = method.parameterNames().at( index ).data();
    
                return QGenericArgument(
                            name, 
                            data);
            };
            
            //тут можно вызывать! 
            method.invoke( this, 
                           //генерируем аргументы
                           genericArg(0),
                           genericArg(1),
                           genericArg(2),
                           genericArg(3),
                           genericArg(4),
                           genericArg(5),
                           genericArg(6),
                           genericArg(7),
                           genericArg(8),
                           genericArg(9));
            notCallbacks = false;
            //раз вызвали значит нашли подходящий callback, а следовательно искать дальше ненадо. Выходим нафиг.
            break;
        }
        //вызвали что -нить? Если вызвали то не вызываем ничего. А иначе идем в другую функцию - которая разбирается как раз с такими сообщениями.
        //Если надо перехватить совершенно все сообщения - перегружать функцию в которой находимся.
        if ( !notCallbacks )
            dispathUndefinedMessage( name, args );
    }

    Написал и мучаюсь - гавнокод или все таки нет.

    ахда, мне надо выучить русский )

    Dart_Sergius, 02 Марта 2015

    Комментарии (22)