- ตัวดำเนินการ
-
เรียนรู้
เรียน Python ตัวอย่างที่รันได้, NumPy, pandas และอื่น ๆ เรียน AIโครงข่ายประสาท ML และ LLM ตั้งแต่ศูนย์ เรียน C และ C++ พอยน์เตอร์ หน่วยความจำ STL และ C++ สมัยใหม่ เรียน C#พื้นฐาน C#, OOP, LINQ, async และแบบฝึกหัด .NET อัลกอริทึม Python การค้นหา การเรียงลำดับ รีเคอร์ชัน และภาพจำลอง O(n) อัลกอริทึม C และ C++ เปรียบเทียบการเขียนด้วย C และ C++
- โจทย์ใหม่
อัลกอริทึมเชิงพันธุกรรม ปรับปรุงประชากรของคำตอบที่เป็นไปได้แบบเดียวกับวิวัฒนาการ: เลือกพ่อแม่ที่แข็งแรง รวมเข้าด้วยกัน และเพิ่มการกลายพันธุ์แบบสุ่ม ในที่นี้คำตอบคือสตริงบิต และความเหมาะสมคือจำนวนเลข 1 (ปัญหา OneMax)
เพื่อให้ทดสอบได้ จึงกำหนดทุกการสุ่มมาให้ เมื่อมีสตริง N ตัว (N เป็นเลขคู่) ให้สร้างลูก N ตัวเป็นคู่ สำหรับคู่ k = 0, 1, …, N/2 - 1:
- การคัดเลือก: parent1 คือผู้ชนะทัวร์นาเมนต์
tournaments[2k]และ parent2 คือผู้ชนะtournaments[2k + 1]ทัวร์นาเมนต์[i, j]ชนะโดยสตริงใดในpopulation[i]และpopulation[j]ที่มีเลข 1 มากกว่า ถ้าเท่ากันpopulation[i]ชนะ - การไขว้ ที่ c =
crossover_points[k]: ลูก 2k = parent1[0:c] + parent2[c:] และลูก 2k + 1 = parent2[0:c] + parent1[c:]
จากนั้นใช้ การกลายพันธุ์ [child, position] แต่ละรายการตามลำดับ โดยกลับบิตนั้นของลูกตัวนั้น
จง implement ga_generation(population, tournaments, crossover_points, mutations)
อินพุต
population: สตริงบิต N ตัวที่ยาว L เท่ากัน
tournaments: คู่ index ของประชากร N คู่
crossover_points: จุดตัด N/2 จุด แต่ละจุดอยู่ระหว่าง 1 ถึง L - 1
mutations: คู่ [child, position] (อาจว่างได้)
เอาต์พุต
คืนลูก N ตัวตามลำดับ
เงื่อนไข
2 ≤ N ≤ 200 (N เป็นเลขคู่), 2 ≤ L ≤ 64
0 ≤ จำนวนการกลายพันธุ์ ≤ 1,000
ตัวอย่าง
ตัวอย่างที่ 1
อินพุต:
mutations = [
[0, 0]
]
population = ["0000", "1111", "1100", "0011"]
tournaments = [
[0, 1],
[2, 3],
[1, 2],
[0, 3]
]
crossover_points = [2, 1]
ผลลัพธ์ที่คาดหวัง:
["0100", "1111", "1011", "0111"]
คำอธิบาย
คู่ 0: "1111" ชนะ "0000" ส่วน "1100" เสมอกับ "0011" ตัวแรกจึงชนะ ตัดหลัง 2 บิตได้ "1100" และ "1111" คู่ 1: พ่อแม่คือ "1111" และ "0011" ตัดหลัง 1 บิตได้ "1011" และ "0111" สุดท้ายลูก 0 ถูกกลับบิต 0 ได้ "0100"
ตัวอย่างที่ 2
อินพุต:
mutations = []
population = ["10", "01"]
tournaments = [
[0, 1],
[1, 0]
]
crossover_points = [1]
ผลลัพธ์ที่คาดหวัง:
["11", "00"]
คำอธิบาย
ทั้งสองสตริงมีเลข 1 ตัวเดียว แต่ละทัวร์นาเมนต์จึงชนะโดย index แรก: parent1 = "10" และ parent2 = "01" ตัดหลัง 1 บิตได้ "11" และ "00"
แหล่งอ้างอิง
-
ตัวอย่างที่ 1 ยังไม่ได้รันอินพุต:
mutations = [ [0, 0] ] population = ["0000", "1111", "1100", "0011"] tournaments = [ [0, 1], [2, 3], [1, 2], [0, 3] ] crossover_points = [2, 1]ผลลัพธ์ที่คาดหวัง:["0100", "1111", "1011", "0111"]เอาต์พุตของคุณ -
ตัวอย่างที่ 2 ยังไม่ได้รันอินพุต:
mutations = [] population = ["10", "01"] tournaments = [ [0, 1], [1, 0] ] crossover_points = [1]ผลลัพธ์ที่คาดหวัง:["11", "00"]เอาต์พุตของคุณ
มี 4 การทดสอบที่ซ่อนอยู่จะถูกรันเมื่อคุณส่งคำตอบ
คอมไพเลอร์และดีบักเกอร์ C++ ออนไลน์
ดีบัก C++ ด้วย breakpoint ตัวแปร และการทำงานทีละขั้นของ GDB ในโหมดเซิร์ฟเวอร์
🚀 2,393,935 การดำเนินการทั้งหมด (1,561 ในเดือนนี้)
ฝึก C++ ด้วยโจทย์เขียนโค้ด
แก้โจทย์จริงใน editor นี้: รันทดสอบตัวอย่าง ส่งคำตอบ และรับรีวิวโค้ดจาก AI
เรียนและฝึก C/C++
เรียนตามเส้นทางที่มีบทเรียนรันได้ แล้วทดสอบตัวเองด้วยโจทย์เขียนโค้ด
💻 เกี่ยวกับตัวรัน C++ ออนไลน์นี้
ตัวรัน C++ ของ CodeUtility ช่วยให้คุณเขียนและรันโค้ด C++ ได้โดยตรงในเบราว์เซอร์ของคุณ - ไม่ต้องติดตั้งหรือเซ็ตอัพคอมไพเลอร์ใดๆ ใช้งานบนแซนด์บ็อกซ์ที่ปลอดภัย รองรับมาตรฐาน C++ จริง ตั้งแต่ C++11, C++14, C++17 ไปจนถึงเวอร์ชัน ล่าสุด
เครื่องมือนี้ใช้คอมไพเลอร์ C++ จริงที่รันบนคลาวด์เพื่อคอมไพล์และรันโค้ดของคุณ ช่วยให้พฤติกรรมถูกต้องและสม่ำเสมอ ในแต่ละเวอร์ชัน คุณสามารถทดลองแนวคิดพื้นฐานของ C++ ได้อย่างอิสระ เช่น ตัวแปร ฟังก์ชัน ลูป เงื่อนไข และการเขียนโปรแกรมเชิงวัตถุ
ไม่ว่าคุณจะเตรียมตัวสัมภาษณ์ เรียนรู้ฟีเจอร์ C++ สมัยใหม่ หรือยืนยันตรรกะของอัลกอริทึม ตัวรัน C++ ของ CodeUtility มอบสภาพแวดล้อมที่เรียบง่ายแต่ทรงพลัง ให้คุณรันโค้ดได้ทันทีจากทุกอุปกรณ์
มากกว่าเครื่องมือรันโค้ด
ใช้ตัวแก้ไขหลายไฟล์ เทอร์มินัลประมวลผลแบบแยกส่วน ไลบรารีเฉพาะรันไทม์ พื้นที่ทำงานถาวร การแชร์ และการทำงานร่วมกันแบบเรียลไทม์ได้จากตัวประมวลผลเดียวกัน
วิธีใช้ตัวประมวลผลนี้
เลือกรันไทม์ เปิดหรือสร้างไฟล์ เขียนโค้ด แล้วเลือกเรียกใช้ ผลลัพธ์จะแสดงในเทอร์มินัล ส่วนผู้ใช้ที่ลงชื่อเข้าใช้สามารถเก็บไฟล์ในพื้นที่ทำงาน ติดตั้งไลบรารี และทำงานร่วมกันผ่านการแชร์ได้
- เลือกเวอร์ชันแล้วแก้ไขไฟล์ปัจจุบัน หรือเปิดไฟล์อื่นในพื้นที่ทำงาน
- เรียกใช้โค้ด ป้อนข้อมูลในเทอร์มินัลเมื่อระบบร้องขอ และตรวจสอบประวัติการเรียกใช้ที่บันทึกไว้
- ใช้ไลบรารี เครื่องมือพื้นที่ทำงาน การแชร์ และแชท เมื่องานของคุณต้องใช้โค้ดมากกว่าหนึ่งส่วน
💡 พื้นฐาน C++ และตัวอย่างที่ลองได้ด้านบน
1. ประกาศตัวแปรและค่าคงที่
C++ ต้องประกาศชนิดข้อมูลของตัวแปรทุกตัว ใช้ const เพื่อกำหนดค่าที่อ่านอย่างเดียว ซึ่งไม่สามารถเปลี่ยนได้หลังจากกำหนดค่าเริ่มต้นแล้ว
int age = 30;
double pi = 3.14159;
char grade = 'A';
std::string name = "Alice";
bool isActive = true;
// ค่าคงที่
const int MAX_USERS = 100;
const std::string COMPANY = "CodeUtility";
// การพยายามแก้ไขตัวแปร const จะทำให้เกิดข้อผิดพลาดขณะคอมไพล์
// MAX_USERS = 200; // ❌ ข้อผิดพลาด
2. เงื่อนไข (if / switch)
ใช้ if, else if, else เพื่อแตกแขนงเงื่อนไข ใช้ switch เมื่อมีหลายค่า
int x = 2;
if (x == 1) {
std::cout << "หนึ่ง\n";
} else if (x == 2) {
std::cout << "สอง\n";
} else {
std::cout << "อื่นๆ\n";
}
// สวิตช์-เคส
switch (x) {
case 1:
std::cout << "หนึ่ง\n";
break;
case 2:
std::cout << "สอง\n";
break;
default:
std::cout << "อื่นๆ\n";
}
3. ลูป
ใช้ for, while และ do-while เพื่อทำซ้ำบล็อกโค้ด
for (int i = 0; i < 3; i++) {
std::cout << i << "\n";
}
int n = 3;
while (n > 0) {
std::cout << n << "\n";
n--;
}
4. อาร์เรย์
อาร์เรย์เก็บหลายองค์ประกอบที่มีชนิดเดียวกัน
int numbers[3] = {10, 20, 30};
std::cout << numbers[1] << "\n";
5. การจัดการอาร์เรย์/เวกเตอร์
ใช้ std::vector สำหรับอาร์เรย์แบบขยายขนาดได้
#include <vector>
std::vector nums = {1, 2, 3};
nums.push_back(4);
nums.pop_back();
for (int n : nums) {
std::cout << n << " ";
}
6. การรับ/ส่งข้อมูลผ่านคอนโซล
ใช้ std::cin สำหรับรับข้อมูล และใช้ std::cout สำหรับแสดงผล
std::string name;
std::cout << "ป้อนชื่อของคุณ: ";
std::cin >> name;
std::cout << "สวัสดี, " << name << "\n";
7. ฟังก์ชัน
ฟังก์ชันช่วยจัดกลุ่มลอจิกที่นำกลับมาใช้ซ้ำได้ ระบุพารามิเตอร์และชนิดค่าที่ส่งกลับ
int add(int a, int b) {
return a + b;
}
std::cout << add(3, 4);
8. Map
std::map เก็บคู่คีย์-ค่า คล้ายพจนานุกรม
#include <map>
std::map ages;
ages["Alice"] = 30;
std::cout << ages["Alice"];
9. การจัดการข้อยกเว้น
ใช้ try และ catch เพื่อจัดการข้อผิดพลาดขณะรัน
try {
throw std::runtime_error("เกิดข้อผิดพลาด");
} catch (const std::exception& e) {
std::cout << e.what();
}
10. การทำงานกับไฟล์ (File I/O)
ใช้ fstream เพื่ออ่านและเขียนไฟล์
#include <fstream>
std::ofstream out("file.txt");
out << "สวัสดีไฟล์";
out.close();
std::ifstream in("file.txt");
std::string line;
getline(in, line);
std::cout << line;
in.close();
11. การจัดการสตริง
สตริงใน C++ รองรับเมธอดอย่าง length(), substr() และ find()
std::string text = "สวัสดีชาวโลก";
std::cout << text.length();
std::cout << text.substr(0, 5);
std::cout << text.find("ชาวโลก");
12. คลาสและอ็อบเจ็กต์
C++ รองรับการเขียนโปรแกรมเชิงวัตถุด้วยคลาส
class Person {
public:
std::string name;
Person(std::string n) : name(n) {}
void greet() { std::cout << "สวัสดี ฉันชื่อ " << name; }
};
Person p("Alice");
p.greet();
13. พอยน์เตอร์
พอยน์เตอร์เก็บที่อยู่หน่วยความจำของตัวแปรอีกตัว ใช้ & เพื่อรับที่อยู่
และใช้ * เพื่อ dereference (เข้าถึงค่าที่ตำแหน่งนั้น)
int x = 10;
int* ptr = &x;
std::cout << "ค่าของ x: " << x << "\n";
std::cout << "ที่อยู่ของ x: " << ptr << "\n";
std::cout << "ค่าจากพอยน์เตอร์: " << *ptr << "\n";
// แก้ไข x ผ่านพอยน์เตอร์
*ptr = 20;
std::cout << "อัปเดต x: " << x << "\n";
🐞 วิธีดีบักโค้ด %{language} ออนไลน์
ใช้ดีบักเกอร์ %{language} ออนไลน์เพื่อค้นหาข้อผิดพลาด runtime และ logic โดยไม่ต้องติดตั้งคอมไพเลอร์หรือ IDE โหมดเซิร์ฟเวอร์จะคอมไพล์พร้อม debug symbols และรันด้วย GDB
- ตั้ง breakpoint ข้างหมายเลขบรรทัด
- เลือก Debug เพื่อคอมไพล์และหยุดที่ breakpoint แรก
- ตรวจสอบบรรทัด call stack และตัวแปร
- ใช้ Continue, Step Over, Step Into หรือ Step Out
- เลือก Stop เพื่อจบการดีบัก
เริ่มจากตัวอย่างขนาดเล็กที่ทำให้เกิดปัญหาได้ และตั้ง breakpoint ก่อนพฤติกรรมที่ไม่คาดคิด