บทนำ
โจทย์: หาตัวเลข (digit) ที่ปรากฏในจำนวนหนึ่งแต่ไม่ปรากฏในอีกจำนวนหนึ่ง (symmetric difference) โดยแสดงผลเรียงจากมากไปน้อย
หลักการ: ใช้ Set Symmetric Difference
set1.symmetric_difference(set2) หรือ set1 ^ set2 คืนสมาชิกที่อยู่ในเซตใดเซตหนึ่งเพียงอย่างเดียว
ตัวอย่างโค้ด
def distinct_uncommon_digits(num1, num2):
"""คืนลิสต์ตัวเลขที่ไม่ซ้ำระหว่างสองจำนวน เรียงมากไปน้อย"""
# แปลงเป็นสตริง แล้วแยกตัวเลขแต่ละหลักเป็นเซต
set1 = set(str(num1))
set2 = set(str(num2))
# Symmetric difference: อยู่ในฝั่งเดียวเท่านั้น
uncommon = set1 ^ set2
# แปลงเป็น int, เรียงมากไปน้อย
result = sorted([int(d) for d in uncommon], reverse=True)
return result
# ทดสอบ
num_1 = 567234
num_2 = 87953573214
print(f"จำนวนที่ 1: {num_1}")
print(f"จำนวนที่ 2: {num_2}")
result = distinct_uncommon_digits(num_1, num_2)
print("ตัวเลขที่ไม่ซ้ำ (มาก → น้อย):", result)
ผลลัพธ์
จำนวนที่ 1: 567234
จำนวนที่ 2: 87953573214
ตัวเลขที่ไม่ซ้ำ (มาก → น้อย): [9, 8, 6, 1]
การทำงานทีละขั้นตอน
num_1 = 567234 → set('567234') → {'5','6','7','2','3','4'}
num_2 = 87953573214 → set('87953573214') → {'8','7','9','5','3','2','1','4'}
Intersection (ร่วมกัน): {'5','7','3','2','4'}
set1 ^ set2 = {'6', '1', '8', '9'} ← เฉพาะฝั่งเดียว
sorted(..., reverse=True) → [9, 8, 6, 1]
เวอร์ชันย่อ (One-liner)
uncommon = sorted({int(d) for d in set(str(num1)) ^ set(str(num2))}, reverse=True)
กรณีใช้งานจริง
- เปรียบเทียบรหัส PIN, เบอร์โทร, หมายเลขบัตร
- ตรวจสอบความแตกต่างของรหัสสินค้า
- เกมตัวเลข / ปริศนาคณิตศาสตร์
ข้อควรระวัง
- แปลงเป็น str ก่อน เพื่อแยก digit ได้ถูกต้อง (จำนวนเต็มไม่สามารถ iterate ตัวเลขได้โดยตรง)
- เลข 0 นำหน้าจะหายไปใน int (แต่ไม่มีผลกับ digit extraction)
- ตัวเลขลบ: ต้องลบเครื่องหมาย '-' ก่อน หรือจัดการแยก
สรุป
ใช้ set(str(num1)) ^ set(str(num2)) หา symmetric difference ของ digit ได้อย่างกระชับและมีประสิทธิภาพ แล้วแปลงเป็น int และ sort ตามต้องการ