ปริศนาการเขียนโปรแกรมของ 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 บรรทัดใหม่จะมีอักขระ AT MOST 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 จะกลายเป็นหงุดหงิดหลังจากผ่านไประยะหนึ่ง
Mr Lister

3
ผลลัพธ์จะต้องถูกต้อง C ++ ที่กำหนดไว้อย่างดีหรือสามารถใช้ UB ได้หรือไม่ (แต่เหมือนที่นายลิสเตอร์ตั้งข้อสังเกตรหัสต้นฉบับไม่ถูกต้องแม้แต่ C ++)
Konrad Rudolph

4
มันไม่ถูกต้อง main ต้องคืนค่า int (อ่านมาตรฐาน c ++)
BЈовић

2
เราพลาดจุดที่นี่ ใส่ int และผลตอบแทน 0 ถ้าคุณคิดว่าฉันไม่ได้
Bogdan Alexandru

11
@Bogdan: Dafuq? สำหรับหนึ่ง DevC ++ นั้นโบราณมากจนแทบไม่น่าเชื่อเลยมันเป็นสิ่งที่ไม่เกี่ยวข้อง และประการที่สองไม่ว่าจะมีคอมไพเลอร์ที่กำหนดในการกำหนดค่าใด ๆ ในเวลาใดก็ตามที่กำหนดเป้าหมายระบบปฏิบัติการใด ๆ ก็ยอมรับว่ามันไม่ได้ทำให้มันถูกต้อง C ++
DeadMG

คำตอบ:


14
#define int float

ควรทำงานได้ดีและมีความยาวเท่ากัน


นี่คือสิ่งที่ฉันมีอยู่ในใจเมื่อฉันมาพร้อมกับความคิดครั้งแรก
Bogdan Alexandru

5
#define int floatเป็นพฤติกรรมที่ไม่ได้กำหนดจริง คุณไม่ได้รับอนุญาตให้ใช้คำหลักที่มีความหมายใหม่
fredoverflow

เฟร็ดคุณสามารถอ้างอิงแหล่งที่มาของคุณ? GCC cpp docs พูดว่า "คุณอาจกำหนดตัวระบุที่ถูกต้องเป็นมาโครแม้ว่าจะเป็นคำหลัก 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
อย่างแน่นอน แต่นี่เป็นการแข่งขันประเภท "shortest win" หรือไม่?
Mr Lister

ฉันคิดอย่างนั้น แต่มันไม่ใช่ กลอุบายที่ดีโดยวิธี
คัดลอก

2
ใช่ทางออกที่สั้นที่สุดจะชนะ codegolf SE ดูคำถามที่
BЈовић

2
@BЈовићคำถามที่พบบ่อยกล่าวว่าทางออกที่สั้นที่สุดชนะสำหรับคำถามกอล์ฟรหัสจริง คำถามนี้ไม่ชัดเจนคำถามกอล์ฟรหัส
kojiro

11

18 รวมถึงการขึ้นบรรทัดใหม่

#define float int

ฉันไม่แน่ใจจริงๆว่ามันใช้งานได้หรือไม่ ... คุณได้ประกาศว่าเป็นแบบลอยตัวและกำหนดค่าเริ่มต้นด้วย 0.5
Bogdan Alexandru

5
ซึ่งจะตัดให้เหลือศูนย์
DeadMG

คุณพูดถูกสิ่งตลก ๆ ที่ฉันไม่เคยเจอมาก่อนด้วยการตั้งค่าเป็นทศนิยมฉันคิดว่ามันจะเป็นข้อผิดพลาดของคอมไพเลอร์ แต่มันก็แค่ออกคำเตือน
Bogdan Alexandru

2
@BogdanAlexandru มองหามาตรฐาน C ++ มันมีรายละเอียดเฉพาะการแปลงโดยนัยที่เล่นที่นี่
oldrinb

2
โปรดทราบว่าถึงแม้ว่าคอมไพเลอร์ทั้งหมดจะอนุญาตสิ่งนี้ แต่มาตรฐานก็ห้ามการกำหนดคำหลักใหม่ (และfloatเป็นคำหลัก)
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 ตัวอักษร


จะส่งออกมากกว่า "0"
Bogdan Alexandru

2
เหตุใดผู้ประกอบการที่ไม่ทำงานจึงไม่ทำงาน
Andrey Regentov


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

@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 ฉันคิดว่ามันชัดเจนไม่งั้นจะไม่มีปริศนาใช่มั้ย
Bogdan Alexandru

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



-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อาจมีค่าใด ๆ
Frozenkoi

1
นี้จะไม่ได้กำหนดว่าคุณกำลังใช้ค่า uninitialised aสำหรับ
Konrad Rudolph

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.