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

    +177

    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
    // Задача "Сложный XOR", олимпиада ACM контестер Украина.
    // Есть множество натуральных чисел от 0 до N. Играют двое игроков. Сначала один убирает из множества число,
    // потом второй. Если в множестве есть (осталось) число, равное побитовому XOR двух выбранных чисел, убирают
    // и его (в условии задачи битность числа не указана, но сказано, что 1 <= N <= 32). Играют пока в множестве
    // есть числа. Проигрывает тот, который не может совершить ход (на ком кончились числа).
    // Ввод - число N, вывод - игрок, который выиграл (оба игрока придерживаются выгодной стратегии).
    
    #include <iostream>
    #include <time.h>
    
    using namespace std;
    
    int main() {
    
    	int n;
    	cin >> n;
    
    	// Это очевидно
    	if (n==1) {
    		cout << "First";
    		return 0;
    	}
    	if (n==2) {
    		cout << "Second";
    		return 0;
    	}
    
    	// Это было в примере
    	if (n==3) {
    		cout << "First";
    		return 0;
    	}
    
    	int s = clock() % 2;		// rand() не работал чето :)
    
    	if (s==0) {
    		cout << "First";
    	} else {
    		cout << "Second";
    	}
    
    	return 0;
    }

    Говноолимпиадам - говнорешения!
    Скажете, зачем такое постить, это не говнокод... Фишка в том, что это незамысловатое решение *правильно прошло все тесты с первого раза!* :D

    Запостил: Actine, 16 Апреля 2011

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

    • строка 34 зачет))
      Ответить
    • Тут скорее не говнозадача, а говнотесты.
      Ответить
    • > rand() не работал
      Но нас не остановить!
      Ответить
    • > rand() не работал
      <cstdlib> же!
      Ответить
      • И <ctime> вместо <time.h> для полного счастья.
        Ответить
    • какая надуманная задача!
      в такую игру не интересно играть, следовательно - и программировать это г.
      Ответить
    • Вообще, авторы не расчитывали на это. Всё-таки отдельно есть целые книги, посвящённые программированию стратегических игр. Да и темболее, если жюри видит решение с рандомом, оно имеет вправе перезапускать решение до тех пор, пока результат не станет минимальным.
      Ответить
    • отвечу всем и сразу
      1. невзлюбил такие олимпиады потому что залог успеха в них - не творческое мышление, а заучивание книжек с алгоритмами (которые были придуманны еще в эпоху перфокарточек (чтобы меньше оных надо было) или вообще счета в столбец). Школьники и некоторые студенты, в меру непонимания, что такое тру-программирование, с удовольствием выстукивают эти задачи на паскале (да-да, паскаль обязателен, не факт что задачи, скомпиленные на си, выдадут результат, сопоставим с эталонным в тестах) с чувством особо
      2.
      Ответить
    • предыдущее сообщение прошу развидеть.

      отвечу всем и много. накипело, извините.

      Я как раз и невзлюбил такие олимпиады, потому что залог успеха в них - не творческое мышление, а заучивание книжек с алгоритмами (которые, к слову, были придуманны еще в эпоху перфокарточек (чтобы меньше оных надо было) или вообще счета в столбец). Школьники и некоторые студенты, в меру непонимания, что такое тру-программирование, с удовольствием выстукивают эти задачи на паскале (да-да, турбо(!)паскаль обязателен, не факт что задачи, скомпиленные на си, выдадут результат, сопоставим с эталонным в тестах) да еще с чувством особой элитарности.
      Я больше скажу. Большинство этих задач подразумевает написание двух-трех строчек vip-кода (анти-говнокода :) с какой-то бешенной рекурсией и на одной формуле, с которых ничего не очевидно, но зато оно укладывается и в лимит времени, и памяти. К слову, эти синтетические лимиты на то и придуманны, чтобы задача решалась единственным шаблонным способом. Все делается на скорость, так что обычно все пишется в main, верх крутизны - в отдельную функцию в глобальном нэймспейсе. Я сам на этих олимпиадах в школе сидел и должен был год после них лечиться нормальными языками (вообще не признавал ООП).
      Насчет <cstdlib> и <ctime>... не знал, не сишник я, но писать на турбопаскале это убого :)
      А дело здесь, да, либо в невероятном везении, либо в том, что авторы сами не знали решения и сделали тесты только на первые три значения. Мы ничего не выиграли (да и пришли просто постебаться, что удалось); если бы жюри посмотрело решения, им было бы о чем задуматься.
      Ответить
      • показать все, что скрыто> после них лечиться нормальными языками (вообще не признавал ООП).

        после них лечиться нормальными экскрементами (вообще не признавал копрофагию)
        Ответить
      • > не факт что задачи, скомпиленные на си, выдадут результат, сопоставим с эталонным в тестах
        пардон, как алгоритм зависит от ЯП? если прога на Си выдает не тот результат, что прога на Паскале - очевидно, что вы реализовали разные алгоритмы.

        а требование к ЯП на олимпиадах, это всего-то затем, что бы:
        1. экзаменаторы, знающие только этот ЯП, поняли программу
        2. все конкурсанты были бы поставлены в равные условия (например, вдруг вы воспользуетесь стандартной библой другого языка и поэтому, естественно, покажете лучшие результаты)
        Ответить
        • на АСМе экзаменаторы сорцы не читают. где-то в кладовке стоит линукс-машина с поставленной этой фигней ejudge.ru и сейф-патчем к ядру. и все шлют сорцы на автопроверку. на выбор дано несколько языков и компилляторов - g++, gcc (или как... короче, на с++ и си, мы писали в визуалке), дельфи, паскаль, джава. а вывод результата... ну, разница в формате вывода действительных чисел (вдруг паскаль выводит не 5 а 5.0 или в этом роде... а проверяются же строки в стандартном буффере.) Все же это лучше, чем когда мы на городских этапах школьных писали листинги в тетрадки.
          а об стандартных библиотеках, считается, участник вообще не должен догадываться. если в задаче написано - дано n целых чисел (1 <= n <= 100000, n разный от задачи до задачи), то участник должен сделать массив из 100000 интов (вместо списков, векторов...) Нет, оно не запрещено парсером, просто предполагается, что предел уровня участника - это ввод и вывод в std, написание метода и рекурсия. Зато зубрежка > мастерство. Изящное (книжное) решение приветствуется.
          Короче говоря, олимпиады с алгоритмического программирования имеют очень мало общего с настоящим программированием. Очень жаль, что школьники, будучи уверенными и накормленными обещаниями, мол, это престижно и вы станете венцом программерской элиты, верят и тратят время на изучение всего того, что давно скрыто в движках и стандартных библиотеках (поиск пути, сортировка...), в то же время стараясь сделать программу побыстрее а не читабельнее, порождая тонны вип-кода. а еще хуже, что этим занимаются взрослые люди (которые, наверное, не смогли освоить современные подходы к программированию, или не могут смириться со стремительным повышением уровня абстракции программ). Надеюсь, у Вас там олимпиады лучше.
          Ответить
          • увы, нет. Даже на собеседованиях при приеме проверяют, насколько ты хороший компилятор и оптимизатор - и никто не думает, что программисту нужно писать поддерживаемый код, и что требуется время на рефакторинг. Считается, что программист пишет код начистовую, а баги - это недосмотр программиста. И все время гонят в шею: быстрее, быстрее, как еще не сделал, тут же три экрана с двумя кнопочками, почему копаешься целый день, когда можно за три часа сделать? Сделал это, делай быстрее еще вот это, мы обещали, что сегодня будет готово!
            Вот так приходится делать компромисс между хорошим кодом (попутно регулируя степень тщательности проектирования) и собственной репутацией.

            Извините, тоже накипело.
            Ответить
            • тут все очень просто:
              управленец при принятии решения руководствуется в основном затратами на разработку - их нужно минимизировать ("быстрее, быстрее"), т.к. от этого зависит его доход. будущее проекта - ну это ж будет когда-нибудь - типа там и посмотрим - может и так нормально будет, и вообще это проблема программистов - пусть они и думают.
              Ответить
              • у него одно желание - отделаться побыстрее и получить бабки. О качестве никто не думает.
                Ответить
          • а как по-вашему можно в принципе проводить олимпиаду?
            как вообще можно сравнить участников, имея в распоряжении всего-лишь 6-8 часов?
            отсюда и получаем задания, рассчитанные на 1-2 часа работы.
            В производстве ПО цель совсем иная - не понять кто круче, а использовать все ресурсы (в смысле весь штат программистов) оптимальным образом.
            Соответственно, опыт олимпиад мало годится для производства ПО.
            Ответить
            • Олимпиада длится 5 часов, если командная, или до 3х часов, если личная. Вы, видимо не участвовали ни разу? И за это время вполне реально сравнить кто/какая команда лучше. И поверьте, все топовые олимпиадники - отличные программисты, наоборот верно не всегда.
              Ответить
              • были там топовые олимпиадники. десять задач за полчаса пощелкали... а вот все отличные программисты, которых я знаю, давно ушли из этого "спорта" и возвращаться не хотят.
                согласитесь же, знание исторических алгоритмов не поможет, если нужно реализовать класс для обмена сообщениями через xmpp, ну или даже регистрацию пользователей на сайте.
                Ответить
              • участвовал, но давно. в прошлом веке :)
                а что верить - не верить - это известный факт.
                Ответить
        • да, и пока мой напарник полчаса пишет адекватное с точки зрения ООП решение задачи про поиск пути в графе, "турбозадроты на турбопаскале" пишут рабочий говнокод, или випкод из пяти строк, за пять минут.
          Ответить
          • пока приложение достаточно простое, турбозадроты в выигрыше. Когда же речь идет о более крупных экземплярах, турбозадроты достигают жопной точки полного ада.
            Ответить
            • > достигают жопной точки полного ада
              poweroff; sleep 5; poweron &
              ???
              Ответить
      • Полностью не согласен с Вами. Не стоит смешивать программирование как работу и программирование как спорт (олимпиадное программирование == спортивное программирование). Соответственно и подходы к решению задач другие. Алгоритмы да, старые. Но это не значит, что они плохие и сейчас не применяются. В той или иной вариации мы их встречаем повсеместно. Главная цель этих олимпиад - научиться мыслить. Научиться решать задачи. Научиться быстро отсекать неверные варианты, прикидывать трудоемкость алгоритма, и не писать говнокод. Так что зря вы на это.
        Ответить
        • на спортивное такие идиотские всегда задачи
          Ответить
          • Что значит идиотские? Текст условия - да, специально смешной, что бы разрядить обстановку немного. А вот само задание - более чем серьезное. Тем более, сейчас на финале стараются давать задачи, которые близки к практическому применению (обработка изображений, текстовых данных, сжатие, шифрование и т.п.). И опять же, повторюсь, никогда вы не будете писать на работе программы, которые будут играть в камушки. Зато вы научитесь быстро думать
            Ответить
            • просто хотелось бы запрограммить что-то не гипотетическое, а интересное. Например, "быки-коровы" интересно. Ксор - не очень, ибо неочевидно
              Ответить
              • > "быки-коровы"
                тёлки и всё такое
                Ответить
                • "и вот из-за дерева выходит самец, с таким.... а она его уже ждет, вся такая. И он ее и так, и сяк, и вдоль и поперек...." (ц)
                  Ответить
        • > спортивное программирование
          программирование в длину
          программирование в ширину
          с шайбой, с мячом, тысячи их!
          Ответить
        • Я тоже с вами согласен. Только время-то едино. Его либо тратить нормально на подготовку к олимпиаде, либо на совершенствование знаний популярных языков и современных "рецептов" (ну или кто-то тратит на игры...)
          Мышление - оно есть первые несколько раз. Дальше задачи повторяются. Когда в школе, или на первых курсах, особо нечего делать было, конечно, для развития было интересно походить. причем не готовясь - что смог, то решил. и занимал в общем-то хорошие места.
          Алгоритмы... думал, где же они применяются в явном виде. Максимум - навигационное ПО. А так, оно давно реализованно все. ХХЫ-век, энкапсуляция :)
          Ответить
      • Меня когда-то это тоже бесило и казалось, что на олимпиадах нужно быть больше математиком, чем программистом. А потом внезапно стало пох. А ещё потом - не до такой ерунды.
        Ответить
      • У вас БОРЛАНД?
        Ответить
      • Чего минусуют - непонятно :) лично знаю золотого медалиста ЧМ по программированию, сейчас он живет в Сиэтле и работает в Microsoft, еще один чемпион (Петр Митричев) работает в гугле. Да и вообще, народ с таких олимпиад разбирают часто.
        Ответить
        • Повезло, значит, ему.
          Немного не в тему, но... Перед собственно олимпиадой идет выступление организаторов. Выходит на трибуну чел, который тоже занял золото в ЧМ этого АСМ-а (работает организатором олимпиад в регионе), так вот, выходит он и пишет на доске: Google Code Jam - $15000; Russian _какой-то_ Cup - $10000; _еще_какая_то_олимпа_ - $15000. на что его спрашивают, а АСМ сколько дает?
          Ответ был шедевральным: "АСМ ничего не дает. АСМ это престиж."
          Ответить
          • Вообще-то так и есть. спортсмены хотят выиграть Олимпийские игры не ради призовых, а ради того, что бы быть Олимпийским чемпионом. Так же и здесь. Деньги принесет хорошая работа после этого
            Ответить
    • Какое задание, такое и решение.
      Ответить
    • Меня в олимпиадах напрягает другое. Вот послал я решение, а оно завалилось на каком-то левом случае, типа пустого множества во входном файле. Но мне приходит только "неверный ответ на 42 тесте". И ищи, где у тебя баг. В реальной жизни тебе хоть наводку дадут, где искать, типа "при пустой базе данных выскакивает ошибка при открытии того окна". А тут почему-то надо телепатию развивать.
      Ответить
      • ха, меня такое тоже бесит. На обычных (не-АСМ) олимпиадах, какой процент тестов задача прошла, такой процент от максимума возможных ты получал. А здесь идет издевательская проверка на маргинальные решения. валится, валится... а потом замечаешь, что в условии "Задана строка длиной до 100000 символов" и замечаешь, что машинально сделал массив char[100000] a не [100002] ("\r\n").
        Или задача - дано число n, вычислить, во сколько бит оно поместится. пишу ceil(ln(n)/ln(2)) - валится. из-за точности флоата, как потом сказали. эталонное решение - перебор!
        Ответить
        • эээээ про "в сколько бит поместится n". видимо, n - целое положительное число?
          for(r = 0; n > 0; r ++) n = n >> 1;
          какой тут перебор?
          Ответить
          • ну, это, побитовый сдвиг - это только самые хакеры знают...
            когда я спросил координатора, тоже одного из тех продвинутых организаторов, почему с логарифмами падает, он сам посоветовал делать перебором. сработало даже.
            а со сдвигом отличное решение. не допер.
            Ответить
            • ceil - округление вверх же? так от этого ваще все плохо может стать. два логорифма, потом деление - конечно стоит забыть о точности. Вот этим, мне кажется, и отличается олимпиадник :) Сразу же видно, что целочисленные вещи не стоит считать в double. Все равно что использовать double i для счетчика цикла.
              Ответить
      • Набор тестов ограничен. Если бы все тестовые наборы данных были известны, то можно было бы получить решение другим способом и просто прошить в программу для этих случаев.
        Ответить
        • Я, очевидно, не говорю о том, чтобы сообщить числа из тестового набора. Но наводку давать хоть какую-то надо же. А то телепатическое программирование какое-то, в реальной жизни такого не бывает (сообщения типа "у миня ничиво ниработаит" не считаются).
          Ответить
          • Какую наводку? «Валится на пустом множестве»? Вот это и есть засветка одного тестового варианта. А про остальные вы что хотите узнать?
            Ответить
            • > Какую наводку? «Валится на пустом множестве»?

              Да.

              > Вот это и есть засветка одного тестового варианта.

              И что? В реале тоже тестер будет говорить "программа валится, а где - светить не буду".

              > А про остальные вы что хотите узнать?

              Если вариант ничем не выделяется, то так и написать - "неверный ответ на типичном тесте". Чтобы ответ был похож на реакцию тестера в реальной жизни.
              Ответить
        • А много кто так и делает. Посчитает числа Фибоначчи, или дома за несколько дней переберет все факториалы до 2^1000000 и прийдет с тхтшником :)
          Про rand() нам тоже говорили, правда, сказали, может проканать раза с десятого. Мы не верили... )
          Ответить
          • Это кто так делает? Такие действия подрывают дух соперничества. Зачем этим тогда заниматься?
            Ответить
          • Это что, какая-то заочная олимпиада? Ну так задачи нужно составлять так, чтобы предрасчёт всех вариантов занимал больше разумного (или установленного организаторами) лимита памяти.
            Ответить
      • Отсюда вывод - пишите код правильно изначально. Ведь любой дебаг уже подразумевает то, что Вы совершили ошибку и хотите ее найти. Ну и еще один плюс - учишься сочинять тесты, проверять граничные условия, переполнения, касты и массу других вещей
        Ответить
        • Правильные вещи говорите.

          Вот как раз учёт граничных и вырожденных случаев — то, что близко к реальным задачам. Потому, что программа может работать на определённом тестовом наборе и сломаться на других реальных данных. Нужно не надеяться на авось, а иметь некоторые гарантии насчёт худшего случая (а худшие случаи не так редки, как кажется).
          Ответить
      • В реальной жизни тебе бы пришлось самому тесты писать, и всё равно сомневаться, работает код или нет.

        А тут - есть тесты, можно проверять на них наличие ошибок. А для отладки - уж будьте любезны свой тест написать. Может вам тестер ещё и патч должен прислать с исправлением ошибки?
        Ответить
      • олимпиада командная, была задача на определение, попадет ли заданная точка в множество (и уравнение там). в ответе надо было дать ответ 1 или 0.
        так вот наша реализация не прошла ни одного теста, но по результатам апелляции нам дали полный балл за эту задачу - мы лишь перепутали вывод 0 и 1. а в задаче не было конкретизировано. Автор задачи решил, что она решена полностью.
        Очень многое зависит от организаторов олимпиад.
        Ответить
    • да, кто-то может подумать, что я против всех олимпиад. отнюдь. мне не нравится только АСМ-контестер. Наверное, и из-за самого подхода, и из-за дурацких условий (обычно это "Кролик приобрел нетбук и теперь хочет посчитать количество деревьев в лесу..." ага, трижды лол...), и из-за навязывания чувства элитарности. Сегодня наши приехали с олимпиады по программированию микроконтроллеров с восьмым местом по Украине (что для нашего ВУЗа вообще нереально круто), так это хоть в разработке драйверов применяется. Большинство олимпиад школьного типа - на зубрежку, это есть, но эта зубрежка - исключительно для того, чтобы задать учащемуся направление для дальнейшей мозговой работы.
      А вообще, пора наверное прекращать нашу здесь специальную олимпиаду в комментариях =) Разные и, главное, личные взгляды - это хорошо.
      Ответить
    • Я писал эту задачу. И чтобы ее решить нада было написать полный перебор той игры, и посмотреть решение для маленьких чисел, по индукции догадаться что там везде кроме случая n==1 и n==3 выигрывает второй игрок, забить это простое условие в код, что мы и сделали. Так как на системе еджадж запрещено использовать rand() и clock(), то строка
      int s = clock() % 2;
      делала то, что s всегда было равное 0. Ваш код оказался верным. Он говорит всегда что выиграл второй кроме случая n==1 и n==3. Совпадение.
      Помоему контест был неплохой, и там был мнoго разноплновых задач, интересних задач, видемо благодаря тому, что готовила контест топовая команда с Симферополя AKAI. Это была одна из самых простых задач на заметить закономерность, догадатся.
      Вопрос к автору: и сколько задач вы решили с 15 что там были за 5 часов?
      Это задача была дана чтобы с 158 команд(у моем регионе) 28 не поехали домой с 0 из 15 решенных задач. Но даже с такой задачей это случилось. вот пруфлинк http://olymp.sumdu.edu.ua/standings.php.
      П.С. это была задача N. ее решили 7 команд. задумайтесь лучше о уровне преподавания программирования в наших университетах.
      Ответить
      • > видемо догадатся
        ступидент детектед
        Ответить
      • честно отвечу - решили четыре где-то. Если не учитывать, что с этой повезло. Вторая провалилась на большом числе (с шестиугольником), хотя паскалисты заюзали extended и были счастливы (а мой long long просто не компилился). Графы я не умею решать и никогда не умел (и не стремился), а на поиск в ширину/глубину/с шайбой/с мячем там было немало задач. Действительно, в этом году в задачах и условия были адекватны, и задачи более-менее разноплановые.
        Как я уже говорил, я не ставил себе цель подготовиться к олимпиаде. Я пришел и увидел, что в алгоритмическом я ноль, в чем охотно признаюсь. Тем не менее, сейчас соображаю над неплохим, на мой взгляд, проектом, и незнание олимпиадных мне как-то не мешает.
        Насчет перебора. Вы перебрали все 32 варианта? И сколько времени это заняло? Или вы наперед знали, какие подходы к подобным задачам? Я руками проверил вариант 4 и решил, что зависит от четности (как в Простом ХОR'e). Для того, чтобы проследить такую закономерность, нужно перебрать хотя бы половину значений.
        Встречный вопрос (не из злости, просто не ожидал здесь напороться на участника :). А сколько решили вы? И на каком языке писали?
        Насчет уровня. Нам, если на то пошло, не обязаны объяснять алгоритмы олимпиадных задачек. У нас на первом курсе было какое-никакое, а все же ООП, а в начале второго мы индивидуально писали веб-порталы (тоже, какие-никакие, но писали, и это лично мне принесло больше пользы). (Нет, конечно, смешно, что после этого на третьем курсе нам будут читать школоbundle - "вёрд", эксель и фотошоп)

        P.S. Ну так если у нас получился define clock() 0, то теперь листинг 6381 становится тру-говнокодом :)
        Ответить
        • Вот в том и дело, Вы говорите, что никогда не занимались олимпиадным программированием, ведете какой-то проект и это Вам не мешает. Не мешает, не спорю. Но и ни капли не помогает. Уж поверьте, разница есть. И в образе мышления, и в написании кода. Просто советую Вам и всем вообще иногда порешивать такие задачки. Сайтов много, acm.timus.ru, codeforces.ru и масса других.
          Ответить
          • > codeforces.ru
            уже здесь появлялся, говноусловия допускали решение брутом, что вобщем-то и не удивительно, т.к.:
            "Генеральный спонсор — ВКонтакте"
            Ответить
    • Был на этой же олимпиаде. rand() на этих олимпиадах работает, лично проверял (К сожалению не прокатило =), максимум дошел до 4 теста). Что опечалило - так это отсутствие подсветки в класах. С 6-угольником тоже зафейлились на каком-то стремном тесте(и это при том, что решение задачи всего одна формула, неправда ли печаль?). Юзать просто так cout<< это очень дерзко на этих олимпиадах, как я понял. Про long long это вообще отдельная тема). Там что не задача, так надо юзать long long ну или _int64. Странно, что long long не cкомпилился у TC.
      Ответить
      • А дайте ссылку на задачи. Интересно посмотреть.
        Ответить

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