Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [С/С++] Исходник с компилирующийся при потере


Автор: Гость_vadim 16.11.2005, 23:05
Добрый вечер, уважаемые знатоки.

Нужно написать программу выводящую на экран один раз число 2005
"Хитрость" же её заключается в том, что если в программе (имеется ввиду её исходник)
изменить ровно один любой символ на какой-нибудь другой так, что бы после этого она по-прежнему компилировалась, то программа должна вывести один раз число 2006.
Другими словами, программа должна определить - изменялся ли её исходный текст после того, как она вывела на экран число 2005 или нет.

Изменения регистра символов и пробелы допускаются.
Размер программы не больше 18 - 20 строк. (не столь важно, но желательно)
Желательно использование стандартных средств C / C++.


Автор: maxim1000 16.11.2005, 23:40
хм... можно попробовать что-нибудь вроде этого...
Код

#include <iostream>
void main()
{
  char *aaa;
  char *bbb=aaa;
  --bbb;
  --bbb;
  cout<<aaa-bbb;
  cout<<bbb-bbb;
  cout<<bbb-bbb;
  --bbb;
  --bbb;
  --bbb;
  if(0)
    --bbb;
  cout<<aaa-bbb;
}

по идее, менять можно только 0 в условии if...
Добавлено @ 23:40
P.S.
забавная задачка smile

Автор: Mayk 17.11.2005, 08:09
Цитата(maxim1000 @ 17.11.2005, 03:40)

по идее, менять можно только 0 в условии if...

Почти smile

Цитата(maxim1000 @ 17.11.2005, 03:40)
  --bbb;
  if(0)
    --bbb, //<-- запятая
  cout<<aaa-bbb;

И у нас получилось двести smile
semicolon еще один добавить перед последним cout надо. Ну или в блок {} внести.

Автор: Ignat 17.11.2005, 11:42
А потом влезаем дебаггером и убиваем jmp ))

Автор: maxim1000 17.11.2005, 11:55
Цитата
И у нас получилось двести

поймал... поймал smile
издание второе, переработанное:
Код

#include <iostream>
void main()
{
  char *aaa;;
  char *bbb=aaa;;
  --bbb;;
  --bbb;;
  cout<<aaa-bbb;;
  cout<<bbb-bbb;;
  cout<<bbb-bbb;;
  --bbb;;
  --bbb;;
  --bbb;;
  if(0)
    --bbb;;
  cout<<aaa-bbb;;
}

smile

Автор: En_t_end 17.11.2005, 13:04
LOL
Такого издевательства я ещё не видел...
Это что за препод такой приколист ?

Автор: sergejzr 17.11.2005, 13:06
Модератор: Название темы должно отражать ее суть!

Автор: Гость_vadim 18.11.2005, 00:24
Цитата(maxim1000 @ 17.11.2005, 11:55)
if(0)
    --bbb;;

maxim1000, а если так
Код
  if(0)    
      -*bbb;;    

Автор: Mayk 18.11.2005, 00:48
Гость_vadim
вот хитрец. А что ты на это скажешь?
Код

#include <iostream>
using namespace std;

int main()
{
  void *bb0;;
  void *bb11;;
  void *bb222;;
  void *bb3333;;
  void *bb44444;;
  void *bb555555;;
  void *bb6666666;;
  cout << &bb0 - &bb222;;
  cout << &bb0 - &bb0;;
  cout << &bb0 - &bb0;;
  if(0)
          cout << &bb0 - &bb6666666;
  else
          cout << &bb0 - &bb555555;
}


Добавлено @ 00:49
Только это - не уверен что портируемо.

Автор: Guest 18.11.2005, 01:01
Ну, кроме этого
Код
int main()
{
 ...
  void *bb11;;   //  ab11 или bb12
 ...
}

пока что ничего

Автор: Mayk 18.11.2005, 01:11
нет не так. В предыдущем примере запятая вместо минуса катит.
А вот так!
Код

#include <iostream>
#include <stdint.h>
using namespace std;
template <bool b>
struct s
{     enum{
                val22=sizeof(int16_t),
                val000=NULL,
                val5=sizeof(int8_t)xor(sizeof(int32_t)) ,
        };
};
template <>
struct s<false>
{     enum{
                val22=sizeof(int16_t),
                val000=NULL,
                val5=sizeof(int16_t)xor(sizeof(int32_t)),
        };
};
typedef s<1>f; 
int main()
{  f _f;;
  cout<<f::val22;;
  cout<<f::val000;;
  cout<<f::val000;;
  cout<<f::val5;;
  cout<<endl;;
}


По идее сменить можно только 1 на 0 в typedef'е.

Вот здесь запятые не вставишь smile

Автор: 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
Цитата(Guest @ 18.11.2005, 05:27)
Mayk, ты где такое компилил?

Гнусом

Цитата(Guest @ 18.11.2005, 05:27)

fatal error C1083: Cannot open include file: 'stdint.h': No such file or directory

Попробуй заментть на 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
Цитата(Guest @ 18.11.2005, 05:39)
Mayk, в любом случае нужно что-нибудь по-проще. Например, завтра скажут, что бы
программа выводила 1917, а после изменений - 1945, что делать будем? имхо, нужен
какой-нить универсальный алгоритм.

Ну дыкть оперируя размерами я думаю мы сможем получить нужные нам цифры.
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)

далее используя специализацию мы сможем легко переопределить любую цифру в любую другую smile

Автор: Гость_vadim 18.11.2005, 02:00
так скомпилилось
Код

#include <iostream>
//#include <inttypes.h>
using namespace std;
typedef __int32 int32_t;// (èëè typedef __i32 int32_t?)
typedef __int16 int16_t;// (èëè typedef __i16 int16_t?)
typedef __int8 int8_t;// (èëè typedef __i8 int32_t?)


template <bool b>
struct s
{
        enum{
                val22 = sizeof(int16_t),
                val000 = NULL,
                val5 = sizeof(int8_t) xor (sizeof(int32_t)) ,
        };
};

template <>
struct s<false>
{
        enum{
                val22 = sizeof(int16_t),
                val000 = NULL,
                val5 = sizeof(int16_t) xor (sizeof(int32_t)) ,
        };
};

typedef s<1> f; 
int main()
{
  f _f;;
  cout << f::val22 << f::val000 << f::val000 << f::val5;
}


но здесь можно менять, например
template <bool b> ---- >> template <bool k>
f _f;; --- >> f _d;;



Автор: Mayk 18.11.2005, 02:04
Цитата
f _f;; --- >> f _d;;

Вот эту строку можно выкинуть

Цитата
template <bool b> ---- >> template <bool k>

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;
Цитата
просто иначе x можно заменить на пробельный символ

на пробел нельзя менять


Автор: Mayk 18.11.2005, 02:20
Цитата(Guest @ 18.11.2005, 06:15)
typedef s<1> f; --->> typedef s<2> f;

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
Цитата
value_kk запихни в nameHolder()

А что это такое?

Автор: Mayk 18.11.2005, 02:30
Цитата

А что это такое?

ф-ция, содержащая имена.
Цитата(Mayk @ 18.11.2005, 06:04)
int nameHolder(){return val22 xor val000 xor val5 xor nameHolder();} в класс

Хотя лучше не надо - 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
что-то около того. я не все изменения что здесь писал туда вносил
Код

#include <iostream>
#include <stdint.h>
using namespace std;
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();}

};
template <>
struct s<false>
{
        enum{
                val22=sizeof(int16_t),
                val0=NULL,
                val555=sizeof(int32_t) xor sizeof(int8_t)
        };
        int nameHolder(){return val22 or val0 or val555 or nameHolder();}


};
enum {
        value_0=false,
        value_1=true,
};
typedef s<value_0> f;
template <bool> struct nameHolder2{nameHolder2();};
template <> struct nameHolder2<value_0>{nameHolder2();};
template <> struct nameHolder2<value_1>{nameHolder2();};
int main()
{
  cout << f::val22;;
  cout << f::val0;;
  cout << f::val0;;
  cout << f::val555;;
  cout << endl;;
}

Автор: Guest 18.11.2005, 03:09
Код
template <bool>
struct s
{
        enum{
                val22 = sizeof(int16_t),  // sizeoR 
                val0 = NULL,    //  NULR
                val555 = sizeof(int32_t) xor sizeof(int16_t)

        };
};

Автор: Mayk 18.11.2005, 03:15
Цитата(Guest @ 18.11.2005, 07:09)
                val22 = sizeof(int16_t),  // sizeoR
                val0 = NULL,    //  NULR

Ась?

Автор: Guest 18.11.2005, 03:17
Замени - увидишь

Автор: Mayk 18.11.2005, 03:18
Цитата(Guest @ 18.11.2005, 07:17)
Замени - увидишь

Цитата

06:21 ~/src$ g++ a.cpp
a.cpp:20: error: `NULR' was not declared in this scope
a.cpp:20: error: enumerator value for `val0' not integer constant
06:21 ~/src$ fg
vim a.cpp

[1]+  Stopped                vim a.cpp
06:21 ~/src$ g++ a.cpp
a.cpp:19: error: parse error before `)' token ///это sizeoR
a.cpp:22: error: missing ';' before right brace
a.cpp: In function `int nameHolder()':
a.cpp:23: error: `val22' undeclared (first use this function)
a.cpp:23: error: (Each undeclared identifier is reported only once for each
  function it appears in.)
a.cpp:23: error: `val0' undeclared (first use this function)
a.cpp:23: error: `val555' undeclared (first use this function)
a.cpp: At global scope:
a.cpp:25: error: parse error before `}' token
a.cpp: In function `int main()':
a.cpp:36: error: `val22' is not a member of type `s<false>'
a.cpp:37: error: `val0' is not a member of type `s<false>'
a.cpp:38: error: `val0' is not a member of type `s<false>'
a.cpp:39: error: `val555' is not a member of type `s<false>'


Цитата

Your Comeau C/C++ test results are as follows:

Comeau C/C++ 4.3.3 (Aug  6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing.  All rights reserved.
MODE:strict errors C++

"ComeauTest.c", line 8: error: identifier "sizeoR" is undefined
                  val22 = sizeoR(int16_t),
                          ^

"ComeauTest.c", line 8: error: function call is not allowed in a constant expression
                  val22 = sizeoR(int16_t),
                          ^

"ComeauTest.c", line 8: error: type name is not allowed
                  val22 = sizeoR(int16_t),
                                ^

"ComeauTest.c", line 9: error: identifier "NULR" is undefined
                  val0 = NULR,
                        ^

"ComeauTest.c", line 28: error: trailing comma is nonstandard
          value_1=true,
                      ^

Ну и?

Автор: 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
smile smile smile

Автор: Mayk 18.11.2005, 03:25

Ну или замени на
template <bool> struct nameHolder2{};
template <> struct nameHolder2<value_0>{};
template <> struct nameHolder2<value_1>{};

а main замени на
Код

int main()
{
  nameHolder2<true>();
  nameHolder2<false>();
  s<true>();
  s<false>();
  cout << f::val22;;
  cout << f::val0;;
  cout << f::val0;;
  cout << f::val555;;
  cout << endl;;
}


Добавлено @ 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();}
};

меняй

на
Код

template<bool> struct s{};
template <>
struct s<true>
{
        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();}
};


и пущай он давится smile smile

Автор: 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
Цитата(Guest @ 18.11.2005, 07:42)
Mayk, вроде бы всё в порядке.

Хорошо - у меня через пару минут после того ответа инет кончился smile

Цитата(kuka @ 18.11.2005, 15:43)
error C2065: 'xor' : undeclared identifier
error C2065: 'or' : undeclared identifier

какой фаил нуна подключить?

Не нужно ничего подключать - это альтернативное написание ^ и &&. Читать стандарт, пар 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
Цитата(Dov @ 19.11.2005, 14:20)
Ребята, а вы уверены, что sizeof выдаст одинаковый результат на разных машинах?

в 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
Да, уж... Страшновато смотреть на эти "извращения" smile , хотя ты знаешь, Mayk, всё это
натолкнуло меня на одну мыслю, smile как говорят - умная мысля приходит опосля.
Пошёл кумекать, скоро вернусь.
А может и не скоро. smile smile smile

Автор: Dov 19.11.2005, 14:45
Я вернулся. Если шо не так, прошу сильно не пинать.
Итак, вариант №4: (думаю, ещё не последний)
Код
#include <iostream.h>
enum {A0, B1, C2, D3, E4, F5, H6/*, I7, J8, L9*/}; 
void main()
{
    true ? cout << C2 << A0 << A0 << (0 ? H6 : F5) : cout << B1 << D3 << E4 /*<< I7 << J8 << L9*/;
}

Автор: Mayk 19.11.2005, 14:53
smile

Автор: Dov 19.11.2005, 15:03
Цитата(Mayk @ 19.11.2005, 14:53)
smile

Mayk, это шо такое? Улыбка Джоконды? smile smile smile

Автор: Mayk 19.11.2005, 15:04
Смайлик такой. Мол решение понравилось. Просто мне картинка " smile " нравится больше картинки " smile "

Автор: Dov 19.11.2005, 15:06
А ты что, уже успел потестить?

Автор: Mayk 19.11.2005, 15:19
нет. А зачем? Уж enum то точно принимает 0..9.

Автор: Dov 19.11.2005, 15:45
Это тебе спасибо, enum у тебя подглядел.
Цитата
хотя ты знаешь, Mayk, всё это натолкнуло меня на одну мыслю

Но всё-таки мне это решение не очень нравится, нужно искать что-то другое, что-нибудь более обширное.
Цитата
Например, завтра скажут, что бы программа выводила 1917, а после изменений - 1945, что делать будем? имхо, нужен какой-нить универсальный алгоритм.
Ну, эту-то задачу этот алгоритм кое-как решит, а вот если нужно будет вывести к примеру:
октябрь - 1917, а после изменений: май - 1945, тогда он обхезается. По этому я написал, что это ещё не поледний вариант. Будем думать.

Автор: S.A.P. 20.11.2005, 07:24
Итак вернемся к опровержениям smile .
Код

        enum{
                val22=sizeof(int16_t),
                val0=NULL,
                val555=sizeof(int32_t) xor sizeof(int8_t)
        };


где xor, x заменить на пробел, выйдет 2001

smile

Автор: Mayk 20.11.2005, 20:17
Цитата(Perchilla @ 20.11.2005, 11:24)
Итак вернемся к опровержениям

Баян.

Цитата(Mayk @ 18.11.2005, 06:04)
Добавлено @ 06:10
Кстати, все xor'ы следует заменить на or'ы - просто иначе x можно заменить на пробельный символ

Цитата(Guest @ 18.11.2005, 06:15)
Цитата
просто иначе x можно заменить на пробельный символ
на пробел нельзя менять

Цитата(Mayk @ 19.11.2005, 11:25)

ps. кстати - где я грил выше про замену xor на or - or следует читать как bitor естессно.



Добавлено @ 20:21
Цитата(Dov @ 19.11.2005, 19:45)
октябрь - 1917, а после изменений: май - 1945, тогда он обхезается.

Ну почему же. Тогда начнется просто мозго#@$#@ство - определяешь 255 элементов в enum'е и пошел
if(0)
cout << letterM << letterA < letterY << endl;
else
cout << letterO << letterC < letterT << endl;

ps. Если что, то я в курсе, что << можно заменить на <- smile

Автор: S.A.P. 20.11.2005, 20:35
Цитата(Mayk @ 20.11.2005, 20:17)
Баян.
ой smile .
Тогда тут
Код

true ? cout << C2 << A0 << A0 << (0 ? H6 :-F5) : cout << B1 << D3 << E4 /*<< I7 << J8 << L9*/;

( минус перед F5 ) будет 200-5

smile

Автор: Dov 20.11.2005, 23:12
Цитата(Mayk @ 20.11.2005, 20:17)
Ну почему же. Тогда начнется просто мозго#@$#@ство - определяешь 255 элементов в enum'е и пошел
if(0)
cout << letterM << letterA < letterY << endl;
else
cout << letterO << letterC < letterT << endl;

Mayk, конечно, так сделать можно, но всё это как-то не так, не по-программистски (имхо).
Мы ведь стремимся к тому, что бы алгоритм, нами придуманный мог справится не с одной какой-нибудь задачей, а с множеством однотипных задач, ты согласен? Вот если мы сможем изменять выводимые данные, не изменяя при этом наш алгоритм, тогда другое дело. Как говорится мухи - отдельно, компот - отдельно.

Цитата(Perchilla @ 20.11.2005, 20:35)
Тогда тут

код C++
1:
true ? cout << C2 << A0 << A0 << (0 ? H6 :-F5) : cout << B1 << D3 << E4 /*<< I7 << J8 << L9*/;

( минус перед F5 ) будет 200-5


Perchilla, как я понимаю пробелы на символы менять нельзя, так же, как и символы на пробелы. Имхо, пробелы оставлены для лучшего восприятия кода, не более. Ведь всегда можно обойтись без них ... почти всегда. Например в этом коде
Код
void main()
можно пробел поменять на, скажем, '*'. И шо мы тада бум делать?

Автор: Mayk 21.11.2005, 00:04
Perchilla
Это development версия. Имелось в виду[если пробелы любишь] smile
Код

if(true){{cout<<C2;}{cout<<A0;}{cout<<(A0);}{if(0){cout<<H6;}{cout<<F5;}}else{blablabla}


К тому же можно сделать замену:
Код

true ? cout << C2 <- A0 << A0 << (0 ? H6 :-F5) : cout << B1 << D3 << E4 /*<< I7 << J8 << L9*/


Цитата(Dov @ 21.11.2005, 03:12)
можно пробел поменять на, скажем, '*'. И шо мы тада бум делать?

Наблюдать сообщения об ошибке, что main может быть либо int main(), либо int main(int argc, char* argv[]).

Цитата(Dov @ 21.11.2005, 03:12)

Mayk, конечно, так сделать можно, но всё это как-то не так, не по-программистски (имхо).

Ну а что? Алгоритм мы знаем. Благодаря std::plus даже не один smile

Ну еще можно поиграть в интересную игру под названием "мясорубка" (очень вольный перевод слова hash). - мы хэшируем строки, компайл тайм сравниваем хэщи и если что не так - генерируем ошибку
Что нить типа такого . Это только идея. Оно не компилица, но идея ясна.
Код

char*str[] = {
"octoberfest! jaja!",
"я всегда буду читать manual'ы по албанскаму йазыку"
};
template <class T, T val,int add>
struct plus{
  T value=val+add;
};
template <int>
struct PLUSCHECKER{}
template <>
struct PLUSCHECKER<5>{enum {value=true}}
//plus checker (2+2+1)
PLUSCHECKER<plus<int,plus<int,plus<int,true,true>::value, plus<int,true,true>::value>::value>,true>::value;
template <const char* str>
struct  getHash{
    enum{
        HASH= plus<plus<curhash, str[NULL]>::value, str[NULL] ? getHash<plus<str,true>>::HASH : NULL;
    }
};
template <int>
struct HASHCHECKER{}
template <>
struct HASHCHECKER<42343242>{enum{val1=true;}} //getHash<str[0]>=423432242
template <>
struct HASHCHECKER<142657>{enum{val2=true;}}//getHash<str[0]>=142657

HASHCHECKER<getHash<str[0]>>::val1;
HASHCHECKER<getHash<str[1]>>::val2;

if(0) cout << str[NULL];
else cout << str[sizeof(char)/sizeof(char)];

Поясню что здесь происходит[если довести до ума] -
мы определяем класс plus для сложения.
PLUSCHECKER<5> определяет value.
Остальные PLUSCHECKERы его не содержат. Таким образом изменение плюса или 5 приведет к ошибке компиляции.
HASHCHECKER работает аналогично.
Добавлено @ 00:05
изменения буквы в исходных сообщениях повлечет изменения хэшей.
таким образом опять получится ошибка компиляции
Добавлено @ 00:06
так... по моему здесь даже не пара фактических ошибок, ну ладно. счас три ночи и я вернусь к хэшам после сна smile

Автор: Гость_vadim 21.11.2005, 07:30
Всем спасибо за помощь.

Автор: S.A.P. 21.11.2005, 08:42
Цитата(Dov @ 20.11.2005, 23:12)
Perchilla, как я понимаю пробелы на символы менять нельзя, так же, как и символы на пробелы. Имхо, пробелы оставлены для лучшего восприятия кода, не более. Ведь всегда можно обойтись без них ... почти всегда.


Цитата(Mayk @ 21.11.2005, 00:04)
Perchilla
Это development версия. Имелось в виду[если пробелы любишь]

дык дайте все таки рабочий, атомарный код, че ходить вокруг да около? smile

Пробелы на символы и символы на пробелы менять не буду smile .

Автор: Dov 24.11.2005, 18:08
Цитата(Perchilla @ 21.11.2005, 08:42)
дык дайте все таки рабочий, атомарный код, че ходить вокруг да около?

Пробелы на символы и символы на пробелы менять не буду

Perchilla, этот код у меня нормально работает (VC++6)

Цитата(Dov @ 19.11.2005, 14:45)
#include <iostream.h>
enum {A0, B1, C2, D3, E4, F5, H6/*, I7, J8, L9*/}; 
void main()
{
    true ? cout << C2 << A0 << A0 << (0 ? H6 : F5) : cout << B1 << D3 << E4 /*<< I7 << J8 << L9*/;
}

И вот такие варианты
Цитата(Mayk @ 21.11.2005, 00:04)
...cout << C2 <- A0 << A0...

не проходят.



Автор: S.A.P. 24.11.2005, 18:30
Цитата(Dov @ 24.11.2005, 18:08)
И вот такие варианты
Цитата (Mayk @ 21.11.2005, 00:04)
...cout << C2 <- A0 << A0...

не проходят.

В смысле не проходят?

А такие
Код

 ...cout << C2 <= A0 << A0...


Атветы не принемаюцца smile .

Автор: Dov 24.11.2005, 18:42
Цитата(Perchilla @ 24.11.2005, 18:30)
А такие

код C++
1:
...cout << C2 <= A0 << A0...

тем более. smile smile smile

Цитата
error C2676: binary '<=' : 'class ostream' does not define this operator or a conversion to a type acceptable to the predefined operator
Error executing cl.exe.

Автор: S.A.P. 24.11.2005, 18:54
Ну ладно, вот тебе "правильный" вариант
Код

 ...cout << 22 << A0 << A0...

Автор: Dov 24.11.2005, 19:03
Цитата(Perchilla @ 24.11.2005, 18:54)
Ну ладно, вот тебе "правильный" вариант

код C++
1: ...cout << 22 << A0 << A0...

поймал, Perchilla, молодец. smile smile smile
Но это легко исправить.
Код
#include <iostream.h>
enum {AA0, BB1, CC2, DD3, EE4, FF5, HH6}; 
void main()
{
    true ? cout << CC2 << AA0 << AA0 << (0 ? HH6 : FF5) : cout << BB1 << DD3 << EE4;
}

Автор: Dov 2.12.2005, 02:21
Цитата(Mayk @ 21.11.2005, 00:04)
Что нить типа такого . Это только идея. Оно не компилица, но идея ясна.
Код
char*str[] = {
"octoberfest! jaja!",
"я всегда буду читать manual'ы по албанскаму йазыку"
};

Mayk, спасибо за идею. smile Массив строк !!! smile
Вот, наваял такой примерчик:
Код
#include <iostream.h> 
#include <string.h>
enum {AA, BB, CC, DD, EE};
void main() 
{
    char *s[] = {"2005", "2005", "2006", "2006", "2006"}; 
    cout << (strcmp(s[AA], s[BB]) ? s[EE] : (strcmp(s[CC], s[EE]) ? s[DD] : (strcmp(s[DD], s[EE]) ? s[CC] : s[BB])));
}

Цитата(Dov @ 20.11.2005, 23:12)
Вот если мы сможем изменять выводимые данные, не изменяя при этом наш алгоритм, тогда другое дело. Как говорится мухи - отдельно, компот - отдельно.
Теперь, имхо, можно.

Автор: Dov 5.12.2005, 23:26
Так-с, последний штрих, без массива строк и без enum`a.
Код
#include <iostream.h> 
#include <string.h>
    
void main() 
{
    char *AA = "2005", *BB = "2005", *CC = "2006", *DD = "2006", *EE = "2006"; 
    cout << (strcmp(AA, BB) ? EE : (strcmp(CC, EE) ? DD : (strcmp(DD, EE) ? CC : BB)));
}

Автор: Fixin 12.12.2005, 19:55
Цитата
программа должна определить - изменялся ли её исходный текст после того, как она вывела на экран число 2005 или нет
Может, я чего и не понял, но кажется, я этого ни в одном приведенном коде не видел. smile smile smile smile

Автор: Dov 12.12.2005, 21:14
Цитата
Нужно написать программу выводящую на экран один раз число 2005
"Хитрость" же её заключается в том, что если в программе (имеется ввиду её исходник)
изменить ровно один любой символ на какой-нибудь другой так, что бы после этого она по-прежнему компилировалась, то программа должна вывести один раз число  2006.

Fixin, ты что со второго абзаца всегда читаешь? smile

Автор: Fixin 12.12.2005, 21:28
Я не понял. Наверно я совсем...
Добавлено @ 21:29
Во всех этих примерах ее нужно перекомпилировать, чтоб она 2006 вывела? так?

Автор: Dov 12.12.2005, 21:33
Цитата(Fixin @ 12.12.2005, 21:28)
Я не понял. Наверно я совсем...
Добавлено @ 21:29
Во всех этих примерах ее нужно перекомпилировать, чтоб она 2006 вывела? так?

Ну, конечно. Мы же исходник изменяем.

Автор: Fixin 12.12.2005, 21:34
а почему не поменять 5 на 6?

Автор: Dov 12.12.2005, 21:36
Всмысле

Автор: Fixin 12.12.2005, 21:40
Код

void main()
{
          cout << "2005";
}
Потом 5 меняем на 6.
Добавлено @ 21:41
Условиям не противоречит, но ведь я неправ?

Автор: Dov 12.12.2005, 21:49
Fixin, предположим ты написал эту прогу
Цитата(Fixin @ 12.12.2005, 21:40)

void main()
{
          cout << "2005";
}
и говоришь мне. Вот, Dov, смотри, эта прога выводит число 2005.
Но если ты поменяешь в коде хоть один символ, то она выведет число 2006.


Fixin, а теперь скажи, сможет ли эта прога вывести число 2006, если я поменяю в ней хотя бы один любой символ?

Автор: Fixin 12.12.2005, 21:53
Цитата(Dov @ 12.12.2005, 22:49)
в ней хотя бы один любой символ?
Но ведь не совсем любой... круглую скобку квадратной - и не заработает. Наверное, имеется ввиду имя переменной?

Автор: Dov 12.12.2005, 21:57
НЕ забывай это
Цитата
изменить ровно один любой символ на какой-нибудь другой так, что бы после этого она по-прежнему компилировалась.



Автор: Fixin 12.12.2005, 22:00
Усе, понял, лови еще 1 +.
Добавлено @ 22:01
Эх, завтра...

Автор: Dov 12.12.2005, 22:06
Цитата(Fixin @ 12.12.2005, 22:00)
Усе, понял
Фууууууууух, наконец-то. smile smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)