นี่คือลำดับที่สามของซีรีส์ของฉันของปริศนา C / C ++; ในกรณีที่คุณพลาด 2 แรกอยู่ที่นี่: (1) ปริศนาการเขียนโปรแกรมของ m3ph1st0s 1 (C ++) (2) ปริศนาการเขียนโปรแกรมของ m3ph1st0s 2 (C ++): "Call hard!"
ฉันต้องบอกว่าปริศนาของฉันเป็นของแท้ 100% ถ้าไม่ฉันจะพูดในข้อความเสมอ ตัวต่อที่ 3 ของฉันมี 2 ส่วนดังนี้
ปริศนา 3.1
ส่วนนี้ (3.1) ไม่ใช่ตัวต่อดั้งเดิมของฉันมันถูกรวบรวมจากหน้าอินเทอร์เน็ตบางส่วนที่ฉันได้อ่านเมื่อไม่นานมานี้ ฉันใช้ที่นี่เป็นจุดเริ่มต้นและอบอุ่นร่างกายของคุณ แก้ปัญหานี้แล้วย้ายไปยังส่วนที่ 2
บางคนพยายามพิมพ์เครื่องหมาย "+" 20 ครั้งและเกิดขึ้นกับโปรแกรมต่อไปนี้:
#include <stdio.h>
int main() {
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("+");
return 0;
}
ความจริงที่ว่ามันไม่ได้ผลลัพธ์ที่คาดหวังชัดเจน - โปรแกรมไม่สิ้นสุด ซ่อมมัน! ง่าย? ตอนนี้แก้ไขโปรแกรมโดยการเปลี่ยนเพียงตัวละครเดียว - ตัวละครที่ไม่ใช่ช่องว่างของหลักสูตร! สำหรับความท้าทายนี้มี 3 โซลูชั่น ค้นหาทั้งหมด 3 รายการ เพียงเพื่อให้ชัดเจน: โปรแกรมจะต้องส่งสัญญาณ 20 "+" และต้องจบเร็ว ก่อนที่จะวิพากษ์วิจารณ์ฉันในสิ่งที่ "เร็ว" หมายถึงฉันจะบอกว่ามันหมายถึงมากที่สุดไม่กี่วินาที (ซึ่งเป็นวิธีที่มากเกินไป แต่เพียงเพื่อให้ชัดเจน)
ปริศนา 3.2
แก้ไข มันชี้ไปที่ฉันก่อนหน้านี้ว่าวิธีแก้ปัญหาสำหรับตัวปริศนา 3.2.2 อาจขึ้นอยู่กับผู้แปล เพื่อที่จะกำจัดการอภิปรายใด ๆ ที่เป็นไปได้ในเรื่องนี้ฉันจะแก้ไขความคิดและปรับปรุงมันในปริศนาตัวต่อไปเมื่อฉันจะใช้ความระมัดระวังเป็นพิเศษเพื่อไม่ให้เกิดการโต้เถียง อย่างไรก็ตามเพื่อให้ไขปริศนานี้ดำเนินต่อไปฉันจะทำการดัดแปลงเล็กน้อยสำหรับ 3.2.2 (การแก้ปัญหาจะง่ายขึ้น แต่สะอาดกว่า)
เมื่อฉันเห็นภาพปริศนาครั้งแรกฉันพบว่ามันยอดเยี่ยมมาก ฉันจัดการเพื่อแก้ปัญหา แต่ไม่ทันทีเพราะต้องมีการเอาใจใส่อย่างระมัดระวัง หากคุณอยู่ที่นี่ก็หมายความว่าคุณแก้ไขได้เช่นกัน หากคุณทำเช่นนั้นด้วยการเขียนโปรแกรมเพื่อแทนที่ตัวอักษรที่เป็นไปได้ทั้งหมดด้วยค่าที่เป็นไปได้ทั้งหมดและทดสอบทุกวิธีคุณจะสูญเสีย แม้ว่าผู้ชายที่ทำงานอย่างหนัก ขณะนี้มีการแก้ไขโปรแกรมที่เขียน 20 "+" สัญญาณ:
3.2.1: แทรกตัวอักษรเดี่ยวหนึ่งตัวและไม่มีอะไรเพิ่มเติมในรหัสเพื่อให้ผลลัพธ์นั้นถูกต้องและให้ผลลัพธ์ที่เหมือนกันในโปรแกรมที่ถูกแก้ไขทั้ง 3 ตัว จำเป็นต้องพูดจดหมายต้องอยู่ก่อนการปิดล้อม} ของ main (ฉันบอกว่าเพราะฉันไม่ต้องการที่จะได้ยินคนที่เพิ่งเขียนจดหมายหลังจากรายการ
แก้ไข (ดูตะโกน) - สำหรับคำถามสุดท้ายเหล่านี้ให้พิจารณาว่าตัวนับ i เริ่มต้นจาก -1 แทนที่จะเป็น 0
3.2.1.5: ทำซ้ำปัญหาก่อนหน้านี้ทั้งหมดโดยใช้เงื่อนไขว่าเอาต์พุตมีสัญญาณอย่างน้อย 19 "+" (แต่ยังคงเป็นเอาต์พุต จำกัด ) อนุญาตให้เปลี่ยนช่องว่างได้ ตอนนี้คุณอาจพบวิธีแก้ไขปัญหามากกว่าในกรณีแรก สิ่งเหล่านี้จะเหมาะกับคำถาม 3.2.2
3.2.2: เลือกค่าอื่นเพื่อเริ่มต้นตัวแปร n เพื่อให้ผลลัพธ์ที่ได้จะยังคงเหมือนเดิมสำหรับโปรแกรมที่ถูกแก้ไขอย่างน้อยหนึ่งโปรแกรมใน 3.2.1.5 (ไม่จำเป็นสำหรับพวกเขาทั้งหมด)
LAST EDIT1 : การเปลี่ยนโปรแกรมเพื่อให้สัญญาณ 21 "+" ยังคงเป็นทางออกที่ดีเนื่องจากข้อความต้นฉบับไม่ได้พูดว่า "แน่นอน" 20 สัญญาณ อย่างไรก็ตามการส่งออกไม่มีที่สิ้นสุดเป็นสิ่งต้องห้าม เห็นได้ชัดว่านี่ไม่ได้หมายความว่าเราทุกคนจะเริ่มส่งสัญญาณ "+" หลายร้อยรายการเนื่องจากไม่ได้รับอนุญาต แต่การกำจัดผลลัพธ์ที่สวยงาม 21 รายการนั้นไม่ได้อยู่ในจิตวิญญาณของการแข่งขันครั้งนี้
LAST EDIT2 : การพิจารณา LAST EDIT1 และการยอมรับการเปลี่ยนแปลงพื้นที่ดูเหมือนว่าตอนนี้เรามีวิธีแก้ปัญหาที่เป็นไปได้ 5 ข้อซึ่งสี่ข้อได้ตอบไปแล้ว ความท้าทายที่ผ่านมา แต่ยังไม่ได้รับการสัมผัสและฉันต้องทำให้มันชัดเจนอีกครั้ง: nจะต้องกำหนดค่าอื่น , การแก้ปัญหาที่กำหนด 20 ถึง n โดยเทคนิคบางอย่างจะไม่ทำมัน (เช่น n = 20L) ฉันชอบที่จะเห็นทางออกที่ 3 ที่ไม่เปลี่ยนช่องว่าง
LAST EDIT3 : ฉันได้แก้ไขคำถามสุดท้ายแล้วโปรดอ่าน!
ความท้าทายคือการไขปริศนาทั้งสองส่วน คนแรกที่ทำมันชนะ
ฉันหวังว่าทุกอย่างชัดเจนหากไม่ได้โปรดโพสต์คำถามใด ๆ และฉันจะแก้ไขโดยเร็วที่สุด ไชโย ข้อความที่เน้น