Головоломка программирования 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 символов


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 символов

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


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

Я не совсем уверен, что это работает ... ты объявил c как число с плавающей точкой и инициализировал его 0,5
Богдан Александру

5
Который будет обрезаться до нуля.
DeadMG

вы правы, забавная вещь, с которой я никогда не сталкивался при инициализации int с десятичным значением, я думал, что это будет ошибка компилятора, но это только выдаст предупреждение
Богдан Александру

2
@BogdanAlexandru ознакомьтесь со стандартом C ++, здесь подробно описывается неявное преобразование.
oldrinb

2
Обратите внимание, что хотя все компиляторы допускают это, стандарт запрещает переопределять ключевые слова (и floatявляется ключевым словом).
Авакар


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 символов


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 ++, возможно, кто-то может использовать эту концепцию, хотя)


Да ладно, результат должен быть просто 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


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.
Конрад Рудольф

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.