สืบเนื่องจากกระทู้พันทิพเรื่องการบ้านเด็กป.4 https://pantip.com/topic/39141834 ที่ถามว่าถ้า A-H เป็นตัวเลขโดดๆไม่ซ้ำกันและ AFBF + CGHB + DAFG +AEAB = BCDC ให้หาค่าว่า A-H มีค่าอะไรบ้าง ถ้าเราไม่อยากคิดด้วยสมองเราเองเราก็อาจสั่งให้คอมพิวเตอร์ไปนั่งไล่ค่าที่เป็นไปได้ของ A,B,C,...,H ดูว่าค่าแบบไหนทำให้สมการเป็นจริงบ้าง วันนี้เด็กๆทดลองใช้ for loop แก้ปัญหาตระกูลนี้กัน และให้การบ้านไปตั้งโจทย์ตระกูลนี้มาถามคนอื่นๆดูกันครับ ไอเดียก็คือแทนค่าตัวอักษรแต่ละตัวด้วยตัวเลขที่เป็นไปได้แล้วตรวจดูว่าสมการเป็นจริงไหม ถ้าจริงก็แสดงผลออกมา
# AA + BB = 1B3
for A in range(0,10):
for B in range(0,10):
if 10*A+A + 10*B+B == 100 + 10*B + 3:
print(f"A={A}, B={B}, {10*A+A} + {10*B+B} = {100 + 10*B + 3}")
A=9, B=4, 99 + 44 = 143
# AB + BA = 1A7
for A in range(0,10):
for B in range(0,10):
if 10*A+B + 10*B+A == 100 + 10*A + 7:
print(f"A={A}, B={B}, {10*A+B} + {10*B+A} = {100 + 10*A + 7}")
A=8, B=9, 89 + 98 = 187
# AA + BB = 1B3
for A in range(0,10):
for B in range(0,10):
if 10*A+A + 10*B+B == 100 + 10*B + 3:
print(A,B)
print(f"A={A}, B={B}, {10*A+A} + {10*B+B} = {100 + 10*B + 3}")
9 4 A=9, B=4, 99 + 44 = 143
# 3AB + BAB = 12BA
# ไม่มีคำตอบ
for A in range(0,10):
for B in range(0,10):
if 300+10*A+B + 100*B+10*A + B == 1200 + 10*B + A:
print(A,B)
print(f"A={A}, B={B}, {300+10*A+B} + {100*B+10*A+B} = {1200 + 10*B + A}")
#36A * BC9 = CACB2
for A in range(0,10):
for B in range(0,10):
for C in range(0,10):
if (360+A) * (100*B+10*C+9) == 10_000*C+1_000*A+100*C+10*B+2:
print(A,B,C)
print(f"A={A}, B={B}, C={C}, {360+A} x {100*B+10*C+9} = {10_000*C+1_000*A+100*C+10*B+2}")
8 1 5 A=8, B=1, C=5, 368 x 159 = 58512
#abcb * d6cb = ccd2aa0c
for a in range(0,10):
for b in range(0,10):
for c in range(0,10):
for d in range(0,10):
if (1000*a+100*b+10*c+b) * (1000*d + 600 + 10*c + b) == 10_000_000*c \
+ 1_000_000*c + 100_000*d + 20_000 + 1_000*a + 100*a + c:
print(a,b,c,d)
print(f"a={a}, b={b}, c={c}, d={d},\n{1000*a+100*b+10*c+b:,} x {1000*d + 600 + 10*c + b:,} = {10_000_000*c + 1_000_000*c + 100_000*d + 20_000 + 1_000*a + 100*a + c:,}")
5 8 4 7 a=5, b=8, c=4, d=7, 5,848 x 7,648 = 44,725,504
#abcca * dcbab = c c37 19d 072
for a in range(0,10):
for b in range(0,10):
for c in range(0,10):
for d in range(0,10):
if (10_000*a+1_000*b+100*c+ + 10*c + a) * (10_000*d + 1_000*c + 100*b + 10*a + b)\
== (10**9+10**8) * c + 37*10**6 + 190_000 + 1000*d +72:
print(a,b,c,d)
print(f"a={a}, b={b}, c={c}, d={d},\n{10_000*a+1_000*b+100*c+ + 10*c + a:,} x {10_000*d + 1_000*c + 100*b + 10*a + b:,} = {(10**9+10**8) * c + 37*10**6 + 190_000 + 1000*d +72:,}")
8 4 5 6 a=8, b=4, c=5, d=6, 84,558 x 65,484 = 5,537,196,072
#1ab * ba1 = 1a540b
for a in range(0,10):
for b in range(0,10):
if (100+10*a+b) * (100*b+10*a+1) == 100_000 + 10_000*a + 5000 + 400 + b:
print(a,b)
print(f"a={a}, b={b},\n{100+10*a+b:,} x {100*b+10*a+1:,} = {100_000 + 10_000*a + 5000 + 400 + b:,}")
8 9 a=8, b=9, 189 x 981 = 185,409
# a**b = b**a
# a ต้องไม่เท่ากับ b
for a in range(0,10):
for b in range(0,10):
if a!=b and a**b == b**a:
print(a,b)
2 4 4 2
บางครั้งเราอาจต้องการว่าตัวอักษร A,B,C,D... แทนค่าตัวเลขที่ไม่ซ้ำกันเลย วิธีไล่ดูตัวเลขของเราจะให้คำตอบที่มีตัวเลขซ้ำกันด้วย วิธีหนึ่งที่เราใช้กรองเฉพาะคำตอบที่ตัวอักษรแต่ละตัวแทนค่าตัวเลขที่ไม่ซ้ำกันเลยคือใช้คุณสมบัติของ set อ่านเกี่ยวกับ set ได้ที่ Sets in Python หรือที่ ภาษา python เบื้องต้น บทที่ ๑๓: เซ็ต
ถ้าเรามีลิสต์ที่มีสมาชิกที่อาจซ้ำอยู่ เราเอามาตรวจสอบได้โดยเปลี่ยนลิสต์เป็นเซ็ท แล้วดูว่าจำนวนสมาชิกของเซ็ทเท่ากับจำนวนสมาชิกของลิสต์ตั้งต้นหรือไม่ ถ้าเท่ากันก็แสดงว่าสมาชิกในลิสต์ตั้งต้นไม่ซ้ำกันเพราะเซ็ทจะเก็บสมาชิกไว้แบบไม่ซ้ำกัน
# สมมุติว่ามีลิสต์ที่มีสมาชิกซ้ำกันอยู่ เมื่อนับจำนวนสมาชิกด้วย len() จะได้สมาชิก 5 ตัว
x = [3,5,6,5,8]
len(x)
5
# เอาลิสต์ x มาทำให้เป็นเซ็ท จะเห็นว่าจะเก็บสมาชิกไว้แบบไม่ให้ซ้ำกัน
set(x)
{3, 5, 6, 8}
# ตรวจสอบว่าสมาชิกของเซ็ทเท่ากับของลิสต์ไหม ในที่นี้ลิสต์มีสมาชิกซ้ำ จำนวนสมาชิกเซ็ทจึงไม่เท่ากับของลิสต์
len(set(x)) == len(x)
False
# กรณีนี้ไม่มีสมาชิกซ้ำ จำนวนสมาชิกเซ็ทจึงเท่ากับในลิสต์
x = [1,2,3,100,300,1000]
len(set(x)) == len(x)
True
# a**b = b**a
# a ต้องไม่เท่ากับ b
for a in range(0,10):
for b in range(0,10):
x = (a,b)
if len(set(x)) == len(x) and a**b == b**a:
print(a,b)
print(f"{a}**{b} = {b}**{a}")
2 4 2**4 = 4**2 4 2 4**2 = 2**4
# CCA + ACB = AABC
for A in range(0,10):
for B in range(0,10):
for C in range(0,10):
x = (A,B,C)
if len(set(x)) == len(x) and\
(100*C+10*C+A) + (100*A+10*C+B) == (1000*A + 100*A + 10*B + C):
print(x)
print(f"{100*C+10*C+A} + {100*A+10*C+B} = {1000*A + 100*A + 10*B + C:,}")
(1, 8, 9) 991 + 198 = 1,189