Загадка програмування 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 та return 0, якщо ви не заперечуєте, я цього не зробив.
Богдан Олександру

11
@Bogdan: Dafuq? Для одного, DevC ++ настільки невимовно стародавній, що його вихід не має значення. По-друге, незалежно від того, приймає чи ні якийсь компілятор у будь-якій заданій конфігурації в будь-який момент часу, орієнтований на будь-яку ОС, це не робить його дійсним C ++.
DeadMG

Відповіді:


14
#define int float

також повинен працювати і має однакову довжину.


це те, що я мав на увазі, коли вперше прийшов із ідеєю
Богдан Олександру,

5
#define int floatнасправді невизначена поведінка. Вам не дозволяється надавати ключовим словам нове значення.
fredoverflow

Фреде, ти можеш навести свої джерела? Документи cpp GCC кажуть: "Ви можете визначити будь-який дійсний ідентифікатор як макрос, навіть якщо це ключове слово C".
День

@Dan: Стандарт C ++ забороняє це.
DeadMG

3
Це може бути UB, але все-таки кілька популярних компіляторів підтримують його. Я зробив, #define int ERRORщоб змусити себе використовувати еквівалент int32_tзамість вбудованих типів. До того часу, як я обійшов int main(), я забув про макрос і задумався, чому чорт мого коду не складе.
dan04

33

Ми можемо позбутися a = 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. див. faq
BЈоviћ

2
@ BЈовичћ FAQ говорить, що найкоротше рішення виграє для актуальних питань з кодом-гольфу. Це питання не є чітко кодовим питанням гольфу.
kojiro

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;

--а;

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

п'ять символів, включаючи новий рядок;


2
Це не компілюється, тому що aє const.
Csq

На жаль, я мав би дати це компілятору! :-(
Toby Speight

0

c ++ що завгодно ...

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 aраніше ifне ініціалізується, тому aможе мати будь-яке значення.
заморожений

1
Це не визначено, ви використовуєте неініціалізоване значення для a.
Конрад Рудольф

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.