Câu đố lập trình của m3ph1st0s 1 (C ++) [đã đóng]


26

Đây là phần đầu tiên của một loạt các câu đố C ++ dành cho bạn. Hy vọng bạn sẽ thích.

Vì vậy, câu đố số 1:

Đưa ra chương trình sau:

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

Chèn một số mã trên một dòng mới ở bất kỳ đâu trong chương trình để đầu ra sẽ là 0. Dòng mới sẽ chứa AT MOST 18 ký tự (bao gồm khoảng trắng) và các dòng còn lại sẽ không được sửa đổi. Để rõ ràng, đây là một ví dụ về một mã mới hợp lệ:

#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;
}

Một dòng mới với 15 ký tự đã được chèn vào nên không sao. Tuy nhiên nó không giải quyết được vấn đề.

Nếu điều này quá đơn giản với bạn, đừng lo lắng, nhiều hơn nữa sẽ đến !!


2
Thỉnh thoảng tôi rất vui khi có người đăng câu hỏi C ++! Ý tôi là, với tất cả các câu đố trong đó một giải pháp C ++ sẽ là 20 hoặc 30 dòng, sau đó mọi người đăng các giải pháp trong J hoặc K hoặc Golfscript trở nên bực bội sau một thời gian.
Ông Lister

3
Liệu kết quả phải hợp lệ, được xác định rõ C ++ hoặc có thể sử dụng UB không? (Nhưng như Mr Lister đã lưu ý, mã gốc thậm chí không hợp lệ C ++.)
Konrad Rudolph

4
nó không hợp lệ main phải trả về int (đọc tiêu chuẩn c ++)
BЈовић

2
chúng tôi đang thiếu điểm ở đây đặt một số nguyên và trả về 0 nếu bạn thấy phiền, tôi đã không làm thế.
Bogdan Alexandru

11
@Bogdan: Dafuq? Đối với một, DevC ++ là rất cổ xưa, đầu ra của nó là không liên quan. Và thứ hai, cho dù có hay không bất kỳ trình biên dịch cụ thể nào trong bất kỳ cấu hình cụ thể nào vào bất kỳ lúc nào mà bất kỳ hệ điều hành nào chấp nhận đều không làm cho nó trở thành C ++ hợp lệ.
DeadMG

Câu trả lời:


14
#define int float

nên làm việc tốt và có cùng chiều dài.


đây là những gì tôi có trong đầu khi tôi nảy ra ý tưởng này
Bogdan Alexandru

5
#define int floatthực sự là hành vi không xác định. Bạn không được phép cung cấp cho từ khóa ý nghĩa mới.
dòng chảy

Fred, bạn có thể trích dẫn nguồn của bạn? Các tài liệu cpp của GCC cho biết "Bạn có thể xác định bất kỳ số nhận dạng hợp lệ nào là macro, ngay cả khi đó là từ khóa C."
Dan

@Dan: Tiêu chuẩn C ++ cấm nó.
DeadMG

3
Nó có thể là UB, nhưng một số trình biên dịch phổ biến vẫn hỗ trợ nó. Tôi đã thực hiện #define int ERRORđể buộc bản thân sử dụng tương đương int32_tthay vì các loại tích hợp. Vào thời điểm tôi đến int main(), tôi đã quên về macro và tự hỏi tại sao mã của tôi không được biên dịch.
dan04

33

Chúng ta có thể thoát khỏi a = 1 bằng cách chuyển nó sang phạm vi khác:

#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;
}

Đây là tôi nghĩ 13 ký tự. Hoặc tốt hơn là nhận một cái mới acũng cho kết quả bằng 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;
}

Đó là 11 ký tự


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 dòng mới, 12 ký tự mới


Đó là những gì tôi muốn gửi ... +1 cho bạn.
H2CO3

Ý tưởng đầu tiên của tôi khi đọc câu hỏi)))
Qwertiy

23

Vì thế, #define a 0 xong. Tôi thấy rằng đã được đăng - không ngạc nhiên.

Đáng ngạc nhiên, điều này đã không được đăng:

#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 ký tự

Điều đó nên làm, phải không?


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 ký tự.

Nhân tiện, chương trình gốc không biên dịch theo MSVC, điều này phàn nàn rằng mainkhông có kiểu trả về.


2
int a = 0; // \ cũng sẽ thực hiện thủ thuật
sao chép

2
Chắc chắn rồi. Nhưng đây có phải là một loại cuộc thi "chiến thắng ngắn nhất" không?
Ông Lister

Tôi nghĩ vậy, nhưng không phải. Nhân tiện, mẹo hay
sao chép

2
Có, giải pháp ngắn nhất chiến thắng trên codegolf SE. xem faq
BЈовић

2
@ BЈовић Câu hỏi thường gặp cho biết giải pháp ngắn nhất giành chiến thắng cho các câu hỏi golf-code thực tế. Câu hỏi này không rõ ràng là một câu hỏi golf-code.
kojiro

11

18, bao gồm cả dòng mới

#define float int

Tôi không thực sự chắc chắn rằng nó hoạt động ... bạn tuyên bố c là một float và khởi tạo nó với 0,5
Bogdan Alexandru

5
Mà sẽ cắt ngắn về không.
DeadMG

bạn nói đúng, điều buồn cười là tôi chưa bao giờ bắt đầu khởi tạo một int có giá trị thập phân, tôi nghĩ đó sẽ là lỗi trình biên dịch, nhưng nó chỉ đưa ra cảnh báo
Bogdan Alexandru

2
@BogdanAlexandru có một sự thích thú với tiêu chuẩn C ++, nó đặc biệt chi tiết về chuyển đổi ngầm khi chơi ở đây.
oldrinb

2
Lưu ý rằng mặc dù tất cả các trình biên dịch cho phép điều này, tiêu chuẩn cấm xác định lại từ khóa (và floatlà một từ khóa).
avakar

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 ký tự.


sẽ tạo ra nhiều hơn "0"
Bogdan Alexandru

2
Tại sao toán tử ternary không hoạt động?
Andrey Regentov

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 ký tự.


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 ký tự.


1
Giải pháp tốt nhất, bởi vì nó bay vào mặt của bất cứ điều gì liên quan đến C ++.
fabspro

3
`đặt tên lửa không được tuyên bố trong phạm vi này
shiona

@shiona bạn đang sử dụng trình biên dịch nào?
Ashrr

@Ashrr gcc (g ++) 4.5.4
shiona

1
Đừng nghĩ rằng, mã này trả về 0. Nhưng bạn có thể thay thế khoảng trắng thông qua dấu chấm than. Dù sao, tôi không chắc chắn khi trả về không.
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;
}

Đó là 17 ký tự nên nó vừa vặn.


7

Tôi không biết C ++, tuy nhiên dựa trên câu hỏi, bạn không thể chỉ cần nhập một dòng để đơn giản là đầu ra 0? câu hỏi chỉ định đầu ra phải là 0, nó không chỉ định bạn phải THAY ĐỔI đầu ra thành 0.

std::cout << 0

(Tôi có 0 đầu mối trên C ++, có lẽ ai đó có thể sử dụng khái niệm này)


Oh tốt, đầu ra chỉ là 0, tôi nghĩ đó là hiển nhiên, nếu không sẽ không có câu đố, phải không?
Bogdan Alexandru

7
@BogdanAlexandru Bạn sẽ thấy rằng khai thác một câu hỏi kém bằng văn bản là một kỹ thuật phổ biến để giải những câu đố này. Nếu bạn muốn ngăn người dùng sử dụng các phím tắt này, hãy dành thêm vài phút để phân tích câu hỏi của riêng bạn và cố gắng loại bỏ bất kỳ sự mơ hồ tiềm năng nào.
ardew

3

12 ký tự, tương tự như giải pháp của mob

#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;
}

các kết hợp khác cũng hoạt động, như #define a choặc#define c 0


2

Tôi biết đó không phải , nhưng dường như hôm nay tôi đang đội chiếc mũ đó!

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

--a;

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

năm ký tự, bao gồm cả dòng mới;


2
Điều này không biên dịch, vì aconst.
Csq

Rất tiếc, tôi nên đã đưa nó cho một trình biên dịch! :-(
Toby Speight

0

c ++ bất cứ điều gì ...

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;
}

chạy qua:

sh mp.cpp

Đẹp thử nhưng vi phạm yêu cầu: C ++ hợp lệ.
Konrad Rudolph


-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 ký tự này thì sao ...


1
Vấn đề ở đây là int atrước khi ifkhông được khởi tạo, do đó acó thể có bất kỳ giá trị nào.
Frozenkoi

1
Điều này là không xác định, bạn đang sử dụng một giá trị chưa được xác nhận cho a.
Konrad Rudolph

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.