Головоломка программирования m3ph1st0s 1 (C ++) [закрыто]

26

Это первая из серии головоломок C ++ для вас. Надеюсь, вам понравится.

Итак, головоломка № 1:

Учитывая следующую программу:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Вставьте некоторый код в одну новую строку в любом месте внутри программы так, чтобы вывод был равен 0. Новая строка будет содержать не более 18 символов (включая пробелы), а остальные строки останутся неизмененными. Чтобы было понятно, вот пример правильного нового кода:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   int* p = NULL;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Новая строка с 15 символами была вставлена, так что все в порядке. Однако это не решает проблему.

Если это слишком просто для вас, не волнуйтесь, еще не все!

Богдан Александру
источник
2
Я очень рад, что кто-то время от времени публикует вопрос по C ++! Я имею в виду, что со всеми загадками, где решение C ++ будет состоять из 20 или 30 строк, люди, публикующие решения в J, K или Golfscript, через некоторое время разочаровываются.
Мистер Листер
3
Должен ли результат быть корректным, четко определенным C ++ или он может использовать UB? (Но, как заметил г-н Листер, оригинальный код даже не является допустимым C ++.)
Конрад Рудольф,
4
это не действительно. main должен возвращать int (читайте стандарт c ++)
BЈовић
2
мы упускаем суть здесь. поставить int и вернуть 0, если вы не возражаете, я не сделал.
Богдан Александру
11
@ Богдан: Дафук? С одной стороны, DevC ++ настолько несказанно древний, что его вывод не имеет значения. И, во-вторых, если какой-либо конкретный компилятор в любой заданной конфигурации в любое время, предназначенный для какой-либо ОС, примет это, он не делает его действительным C ++.
DeadMG

Ответы:

14
#define int float

должен работать так же и имеет одинаковую длину.

Дэн
источник
это то, что я имел в виду, когда впервые пришел с идеей
Богдан Александру
5
#define int floatна самом деле неопределенное поведение. Вам не разрешено придавать ключевым словам новое значение.
fredoverflow
Фред, ты можешь привести свои источники? В документации GCC cpp говорится: «Вы можете определить любой допустимый идентификатор как макрос, даже если это ключевое слово C».
Дэн
@Dan: Стандарт C ++ запрещает это.
DeadMG
3
Это может быть UB, но несколько популярных компиляторов все равно его поддерживают. Я сделал, #define int ERRORчтобы заставить себя использовать эквивалент int32_tвместо встроенных типов. К тому времени, когда я нашел время int main(), я забыл о макросе и подумал, почему, черт возьми, мой код не скомпилируется.
dan04
33

Мы можем избавиться от = 1, переместив его в другую область:

#include <iostream>
main() 
{
int a=0;if(0)
    const int a=1;
    const int b=2;
    const float c=0.5;
    std::cout << a/b-a*c;
}

Это я думаю 13 персонажей. Или еще лучше получить новый, aкоторый также приводит к 0:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
if(int a=2)
   std::cout << a/b-a*c;
}

Это 11 символов

frozenkoi
источник
24
#include <iostream>
main() 
{
   const int a=1;
#define a 0
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

1 новая строка, 12 новых символов

чернь
источник
Это то, что я хотел представить ... +1 для вас.
H2CO3
Моя первая идея, когда прочитал вопрос)))
Qwertiy
23

Итак #define a 0, Готово. Я видел, что было опубликовано - неудивительно.

Удивительно, но это не было опубликовано:

#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout<<0||
   std::cout << a/b-a*c;
}

14 символов

Что должно сделать, верно?

sehe
источник
21
#include <iostream>
main() 
{
const int a=0;//\
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

17 символов

Кстати, оригинальная программа не компилируется под MSVC, которая жалуется, что mainне имеет возвращаемого типа.

Мистер листер
источник
2
int a = 0; // \ также добьется цели
скопируйте
2
Абсолютно. Но является ли это соревнование "кратчайшей линией"?
Мистер Листер
Я так и думал, но это не так. Кстати, хороший трюк
копия
2
Да, самое короткое решение выигрывает на Codegolf SE. см чаво
BЈовић
2
@ BЈовић часто задаваемые вопросы говорят, что самое короткое решение выигрывает для актуальных вопросов по коду-гольфу. Этот вопрос не является четко определенным вопросом.
Кодзиро
11

18, включая перевод строки

#define float int
shiona
источник
Я не совсем уверен, что это работает ... ты объявил c как число с плавающей точкой и инициализировал его 0,5
Богдан Александру
5
Который будет обрезаться до нуля.
DeadMG
вы правы, забавная вещь, с которой я никогда не сталкивался при инициализации int с десятичным значением, я думал, что это будет ошибка компилятора, но это только выдаст предупреждение
Богдан Александру
2
@BogdanAlexandru ознакомьтесь со стандартом C ++, здесь подробно описывается неявное преобразование.
oldrinb
2
Обратите внимание, что хотя все компиляторы допускают это, стандарт запрещает переопределять ключевые слова (и floatявляется ключевым словом).
Авакар
11
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   1?std::cout<<0:
   std::cout << a/b-a*c;
}

15 символов

Андрей Регентов
источник
будет выводить больше «0»
Богдан Александру
2
почему троичный оператор не работает?
Андрей Регентов
9
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a 0;1
   std::cout << a/b-a*c;
}

14 символов.

Светляк
источник
7
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   return puts("0");
   std::cout << a/b-a*c;
}

17 символов

Ashrr
источник
1
Лучшее решение пока что, потому что оно бросает вызов всему, что связано с C ++.
fabspro
3
`put´ не был объявлен в этой области
shiona
@shiona, какой компилятор вы используете?
Ашрр
@Ashrr gcc (g ++) 4.5.4
shiona
1
Не думайте, этот код возвращает 0. Но вы можете заменить пробел через восклицательный знак. Во всяком случае, я не уверен, когда пут возвращает ноль.
Qwertiy
7
#include <iostream>
main()
{
   const int a=1;
   const int b=2;
   const float c=0.5;
std::cout<<0;//\
   std::cout << a/b-a*c;
}

Это 17 символов, так что это просто подходит.

Мэринус
источник
7

Я не знаю C ++, однако, основываясь на этом вопросе, не могли бы вы просто ввести строку, чтобы просто вывести 0? вопрос указывает, что вывод должен быть 0, но не указывает, что вы должны ИЗМЕНИТЬ вывод на 0.

std::cout << 0

(У меня есть 0 подсказок на C ++, возможно, кто-то может использовать эту концепцию, хотя)

NRGdallas
источник
Да ладно, результат должен быть просто 0, я думал, что это очевидно, иначе не было бы загадки, не так ли?
Богдан Александру
7
@BogdanAlexandru Вы обнаружите, что использование плохо написанного вопроса является обычной техникой для решения этих головоломок. Если вы хотите запретить пользователям использовать эти ярлыки, потратьте несколько дополнительных минут на анализ вашего вопроса и постарайтесь устранить любую потенциальную двусмысленность.
ardnew
3

12 символов, аналогично решению моба

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a b
   std::cout << a/b-a*c;
}

другие комбинации также работают, как #define a cили#define c 0

CSQ
источник
2

Я знаю, что это не , но мне кажется, что я сегодня в этой шляпе!

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;

--a;

   std::cout << a/b-a*c;
}

пять символов, включая перевод строки;

Тоби Спейт
источник
2
Это не компилируется, потому что aесть const.
Csq
К сожалению, я должен был дать его компилятору! :-(
Тоби Спейт
0

с ++, что угодно ...

echo "0"; exit
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

запустить через:

sh mp.cpp
ребенок кролика
источник
Хорошая попытка, но нарушает требование: действительный C ++.
Конрад Рудольф
-1
#include <iostream>
int main() 
{
int a;if(a)
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Как насчет этих 11 символов ...

кудель
источник
1
Проблема здесь в том, что int abefore ifне инициализируется, поэтому aможет иметь любое значение.
Frozenko
1
Это не определено, вы используете неинициализированное значение для a.
Конрад Рудольф