| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [С/С++] Исходник с компилирующийся при потере |
| Автор: Гость_vadim 16.11.2005, 23:05 |
| Добрый вечер, уважаемые знатоки. Нужно написать программу выводящую на экран один раз число 2005 "Хитрость" же её заключается в том, что если в программе (имеется ввиду её исходник) изменить ровно один любой символ на какой-нибудь другой так, что бы после этого она по-прежнему компилировалась, то программа должна вывести один раз число 2006. Другими словами, программа должна определить - изменялся ли её исходный текст после того, как она вывела на экран число 2005 или нет. Изменения регистра символов и пробелы допускаются. Размер программы не больше 18 - 20 строк. (не столь важно, но желательно) Желательно использование стандартных средств C / C++. |
| Автор: maxim1000 16.11.2005, 23:40 | ||
хм... можно попробовать что-нибудь вроде этого...
по идее, менять можно только 0 в условии if... Добавлено @ 23:40 P.S. забавная задачка |
| Автор: Mayk 17.11.2005, 08:09 | ||||
Почти
И у нас получилось двести semicolon еще один добавить перед последним cout надо. Ну или в блок {} внести. |
| Автор: Ignat 17.11.2005, 11:42 |
| А потом влезаем дебаггером и убиваем jmp )) |
| Автор: maxim1000 17.11.2005, 11:55 | ||||
поймал... поймал издание второе, переработанное:
|
| Автор: En_t_end 17.11.2005, 13:04 |
| LOL Такого издевательства я ещё не видел... Это что за препод такой приколист ? |
| Автор: sergejzr 17.11.2005, 13:06 |
| Модератор: Название темы должно отражать ее суть! |
| Автор: Гость_vadim 18.11.2005, 00:24 | ||||
maxim1000, а если так
|
| Автор: Mayk 18.11.2005, 00:48 | ||
| Гость_vadim вот хитрец. А что ты на это скажешь?
Добавлено @ 00:49 Только это - не уверен что портируемо. |
| Автор: Guest 18.11.2005, 01:01 | ||
Ну, кроме этого
пока что ничего |
| Автор: Mayk 18.11.2005, 01:11 | ||
| нет не так. В предыдущем примере запятая вместо минуса катит. А вот так!
По идее сменить можно только 1 на 0 в typedef'е. Вот здесь запятые не вставишь |
| Автор: Guest 18.11.2005, 01:27 |
| Mayk, ты где такое компилил? У меня vc++6.0 fatal error C1083: Cannot open include file: 'stdint.h': No such file or directory |
| Автор: Mayk 18.11.2005, 01:31 | ||||
Гнусом
Попробуй заментть на inttypes.h Если не сработает - выкинь вязанку в топку. Знаю в борланде какой-то из файлов точно есть из этих двух (inttypes.h и stdint.h). |
| Автор: Гость_vadim 18.11.2005, 01:34 |
| fatal error C1083: Cannot open include file: 'inttypes.h': No such file or directory |
| Автор: Mayk 18.11.2005, 01:36 |
| Ладно, можешь вместо #include <...int....h> прописать typedef __int32 int32_t; (или typedef __i32 int32_t?) typedef __int16 int16_t; (или typedef __i16 int16_t?) typedef __int8 int8_t; (или typedef __i8 int32_t?) В конце концов перебиндь всякие DWORD'ы. ps. если выкинуть запятые после val5 , то и comeau берет. |
| Автор: Guest 18.11.2005, 01:39 |
| Mayk, в любом случае нужно что-нибудь по-проще. Например, завтра скажут, что бы программа выводила 1917, а после изменений - 1945, что делать будем? имхо, нужен какой-нить универсальный алгоритм. |
| Автор: Mayk 18.11.2005, 01:48 | ||
Ну дыкть оперируя размерами я думаю мы сможем получить нужные нам цифры. 0 - это NULL. 1 - sizeof(int8_t), sizeof(char) на крайний случай 2 - sizeof(int16_t), sizeof(short) на крайний случай 4 - sizeof(int32_t), sizeof(int) на крайний случай 5 - sizeof(int32_t)xor(sizeof(int8_t)) 6 - sizeof(int32_t)xor(sizeof(int16_t)) 7 - sizeof(int8_t)or(sizeof(int16_t))or(sizeof(int32_t)) 8 - sizeof(int64_t), sizeof(long long) на крайний случай 9 - sizeof(int64_t) or sizeof(int8_t) далее используя специализацию мы сможем легко переопределить любую цифру в любую другую |
| Автор: Гость_vadim 18.11.2005, 02:00 | ||
так скомпилилось
но здесь можно менять, например template <bool b> ---- >> template <bool k> f _f;; --- >> f _d;; |
| Автор: Mayk 18.11.2005, 02:04 | ||||
Вот эту строку можно выкинуть
b тоже можно выкинуть. Добавлено @ 02:08 А для того, чтобы нельзя было менять символы в неиспользуемом class'е можно добавить ф-цию int nameHolder(){return val22 xor val000 xor val5 xor nameHolder();} в класс Добавлено @ 02:10 Кстати, все xor'ы следует заменить на or'ы - просто иначе x можно заменить на пробельный символ |
| Автор: Guest 18.11.2005, 02:15 | ||
typedef s<1> f; --->> typedef s<2> f;
на пробел нельзя менять |
| Автор: Mayk 18.11.2005, 02:20 | ||
enum { value_0=false, value_1=true, value_kk = value_0 or value_1; }; typedef s<value_0> f; value_kk запихни в nameHolder() |
| Автор: Гость_vadim 18.11.2005, 02:23 | ||
А что это такое? |
| Автор: Mayk 18.11.2005, 02:30 | ||||
ф-ция, содержащая имена.
Хотя лучше не надо - valuekk = value0 or value1 можно заменить на value1 or value1; Лучше вот такой nameHolder для них. template <bool> struct nameHolder2{nameHolder2();}; template <> struct nameHolder2<value_0>{nameHolder2();}; template <> struct nameHolder2<value_1>{nameHolder2();}; |
| Автор: Guest 18.11.2005, 02:42 |
| Mayk, я уже запутался что куда писать. Если не трудно выложи код полностью |
| Автор: Mayk 18.11.2005, 02:48 | ||
что-то около того. я не все изменения что здесь писал туда вносил
|
| Автор: Guest 18.11.2005, 03:09 | ||
|
| Автор: Mayk 18.11.2005, 03:15 | ||
Ась? |
| Автор: Guest 18.11.2005, 03:17 |
| Замени - увидишь |
| Автор: Mayk 18.11.2005, 03:18 | ||||||
Ну и? |
| Автор: Guest 18.11.2005, 03:21 |
| У меня компилит. даже так компилит template <bool> struct nameHolder2{nameHolder2();}; -->> template <bool> struct nameHolder2{nameHolder5();}; // nameHolder2() ==>> nameHolder5() |
| Автор: Mayk 18.11.2005, 03:22 |
| компилятор в топку |
| Автор: Guest 18.11.2005, 03:24 |
| |
| Автор: Mayk 18.11.2005, 03:25 | ||||
| Ну или замени на template <bool> struct nameHolder2{}; template <> struct nameHolder2<value_0>{}; template <> struct nameHolder2<value_1>{}; а main замени на
Добавлено @ 03:27 далее template <bool> struct s { enum{ val22 = sizeof(int16_t), val0 = NULL, val555 = sizeof(int32_t) xor sizeof(int16_t) }; int nameHolder(){return val22 or val0 or val555 or nameHolder();} }; меняй на
и пущай он давится |
| Автор: Guest 18.11.2005, 03:42 |
| Mayk, вроде бы всё в порядке. Мож быть кто-нить завтра ещё потестит, вернее уже сегодня. А пока что тебе большое СПАСИБО. |
| Автор: kuka 18.11.2005, 11:43 |
| error C2065: 'xor' : undeclared identifier error C2065: 'or' : undeclared identifier какой фаил нуна подключить? |
| Автор: Mayk 19.11.2005, 07:25 | ||||
Хорошо - у меня через пару минут после того ответа инет кончился
Не нужно ничего подключать - это альтернативное написание ^ и &&. Читать стандарт, пар 2.5 (во всяком случае 2.5 в ISO/IEC 14882)) Так что однозначно нужно Или порыскать по инклюдам в поисках #define xor, #define and ps. кстати - где я грил выше про замену xor на or - or следует читать как bitor естессно. |
| Автор: Dov 19.11.2005, 10:20 |
| Ребята, а вы уверены, что sizeof выдаст одинаковый результат на разных машинах? |
| Автор: Mayk 19.11.2005, 12:30 | ||
в intN_t не может быть padding битов . А про архитектуры которые имеют типы размером в 2 или 4 бита не слышал. Но можно пойти таким путём(более человеческий): const int { //конст инт ко всем как бы - лениво мне кутнпастить digit0 = NULL;; digit1 = div(sizeof(char),sizeof(char)).quot//, вместо . не подставить :-) digit2 = std::plus<int>()(digit1,digit1); digit3 = std::plus<int>()(digit1,digit2); ... digitN = std::plus<int>()(digit1,digit{N-1}); /// или еще как угодно суммировать и проч } |
| Автор: Dov 19.11.2005, 12:50 |
| Да, уж... Страшновато смотреть на эти "извращения" натолкнуло меня на одну мыслю, Пошёл кумекать, скоро вернусь. А может и не скоро. |
| Автор: Dov 19.11.2005, 14:45 | ||
| Я вернулся. Если шо не так, прошу сильно не пинать. Итак, вариант №4: (думаю, ещё не последний)
|
| Автор: Mayk 19.11.2005, 14:53 |
| |
| Автор: Dov 19.11.2005, 15:03 | ||
Mayk, это шо такое? Улыбка Джоконды? |
| Автор: Mayk 19.11.2005, 15:04 |
| Смайлик такой. Мол решение понравилось. Просто мне картинка " |
| Автор: Dov 19.11.2005, 15:06 |
| А ты что, уже успел потестить? |
| Автор: Mayk 19.11.2005, 15:19 |
| нет. А зачем? Уж enum то точно принимает 0..9. |
| Автор: Dov 19.11.2005, 15:45 | ||||
Это тебе спасибо, enum у тебя подглядел.
Но всё-таки мне это решение не очень нравится, нужно искать что-то другое, что-нибудь более обширное.
октябрь - 1917, а после изменений: май - 1945, тогда он обхезается. По этому я написал, что это ещё не поледний вариант. Будем думать. |
| Автор: S.A.P. 20.11.2005, 07:24 | ||
Итак вернемся к опровержениям
где xor, x заменить на пробел, выйдет 2001 |
| Автор: Mayk 20.11.2005, 20:17 | ||||||||||
Баян.
Добавлено @ 20:21
Ну почему же. Тогда начнется просто мозго#@$#@ство - определяешь 255 элементов в enum'е и пошел if(0) cout << letterM << letterA < letterY << endl; else cout << letterO << letterC < letterT << endl; ps. Если что, то я в курсе, что << можно заменить на <- |
| Автор: S.A.P. 20.11.2005, 20:35 | ||||
Тогда тут
( минус перед F5 ) будет 200-5 |
| Автор: Dov 20.11.2005, 23:12 | ||||||
Mayk, конечно, так сделать можно, но всё это как-то не так, не по-программистски (имхо). Мы ведь стремимся к тому, что бы алгоритм, нами придуманный мог справится не с одной какой-нибудь задачей, а с множеством однотипных задач, ты согласен? Вот если мы сможем изменять выводимые данные, не изменяя при этом наш алгоритм, тогда другое дело. Как говорится мухи - отдельно, компот - отдельно.
Perchilla, как я понимаю пробелы на символы менять нельзя, так же, как и символы на пробелы. Имхо, пробелы оставлены для лучшего восприятия кода, не более. Ведь всегда можно обойтись без них ... почти всегда. Например в этом коде
|
| Автор: Mayk 21.11.2005, 00:04 | ||||||||||
| Perchilla Это development версия. Имелось в виду[если пробелы любишь]
К тому же можно сделать замену:
Наблюдать сообщения об ошибке, что main может быть либо int main(), либо int main(int argc, char* argv[]).
Ну а что? Алгоритм мы знаем. Благодаря std::plus даже не один Ну еще можно поиграть в интересную игру под названием "мясорубка" (очень вольный перевод слова hash). - мы хэшируем строки, компайл тайм сравниваем хэщи и если что не так - генерируем ошибку Что нить типа такого . Это только идея. Оно не компилица, но идея ясна.
Поясню что здесь происходит[если довести до ума] - мы определяем класс plus для сложения. PLUSCHECKER<5> определяет value. Остальные PLUSCHECKERы его не содержат. Таким образом изменение плюса или 5 приведет к ошибке компиляции. HASHCHECKER работает аналогично. Добавлено @ 00:05 изменения буквы в исходных сообщениях повлечет изменения хэшей. таким образом опять получится ошибка компиляции Добавлено @ 00:06 так... по моему здесь даже не пара фактических ошибок, ну ладно. счас три ночи и я вернусь к хэшам после сна |
| Автор: Гость_vadim 21.11.2005, 07:30 |
| Всем спасибо за помощь. |
| Автор: S.A.P. 21.11.2005, 08:42 | ||||
дык дайте все таки рабочий, атомарный код, че ходить вокруг да около? Пробелы на символы и символы на пробелы менять не буду |
| Автор: Dov 24.11.2005, 18:08 | ||||||
Perchilla, этот код у меня нормально работает (VC++6)
И вот такие варианты
не проходят. |
| Автор: S.A.P. 24.11.2005, 18:30 | ||||
В смысле не проходят? А такие
Атветы не принемаюцца |
| Автор: Dov 24.11.2005, 18:42 | ||||
тем более.
|
| Автор: S.A.P. 24.11.2005, 18:54 | ||
Ну ладно, вот тебе "правильный" вариант
|
| Автор: Dov 24.11.2005, 19:03 | ||||
поймал, Perchilla, молодец. Но это легко исправить.
|
| Автор: Dov 2.12.2005, 02:21 | ||||||
Mayk, спасибо за идею. Вот, наваял такой примерчик:
|
| Автор: Dov 5.12.2005, 23:26 | ||
Так-с, последний штрих, без массива строк и без enum`a.
|
| Автор: Fixin 12.12.2005, 19:55 | ||
|
| Автор: Dov 12.12.2005, 21:14 | ||
Fixin, ты что со второго абзаца всегда читаешь? |
| Автор: Fixin 12.12.2005, 21:28 |
| Я не понял. Наверно я совсем... Добавлено @ 21:29 Во всех этих примерах ее нужно перекомпилировать, чтоб она 2006 вывела? так? |
| Автор: Dov 12.12.2005, 21:33 | ||
Ну, конечно. Мы же исходник изменяем. |
| Автор: Fixin 12.12.2005, 21:34 |
| а почему не поменять 5 на 6? |
| Автор: Dov 12.12.2005, 21:36 |
| Всмысле |
| Автор: Fixin 12.12.2005, 21:40 | ||
Добавлено @ 21:41 Условиям не противоречит, но ведь я неправ? |
| Автор: Dov 12.12.2005, 21:49 | ||
Fixin, предположим ты написал эту прогу
Но если ты поменяешь в коде хоть один символ, то она выведет число 2006. Fixin, а теперь скажи, сможет ли эта прога вывести число 2006, если я поменяю в ней хотя бы один любой символ? |
| Автор: Fixin 12.12.2005, 21:53 | ||
|
| Автор: Dov 12.12.2005, 21:57 | ||
НЕ забывай это
|
| Автор: Fixin 12.12.2005, 22:00 |
| Усе, понял, лови еще 1 +. Добавлено @ 22:01 Эх, завтра... |
| Автор: Dov 12.12.2005, 22:06 | ||
|