เล่นแก้โจทย์ที่แทนเลขโดดด้วยตัวอักษร

สืบเนื่องจากกระทู้พันทิพเรื่องการบ้านเด็กป.4 https://pantip.com/topic/39141834 ที่ถามว่าถ้า A-H เป็นตัวเลขโดดๆไม่ซ้ำกันและ AFBF + CGHB + DAFG +AEAB = BCDC ให้หาค่าว่า A-H มีค่าอะไรบ้าง ถ้าเราไม่อยากคิดด้วยสมองเราเองเราก็อาจสั่งให้คอมพิวเตอร์ไปนั่งไล่ค่าที่เป็นไปได้ของ A,B,C,...,H ดูว่าค่าแบบไหนทำให้สมการเป็นจริงบ้าง วันนี้เด็กๆทดลองใช้ for loop แก้ปัญหาตระกูลนี้กัน และให้การบ้านไปตั้งโจทย์ตระกูลนี้มาถามคนอื่นๆดูกันครับ ไอเดียก็คือแทนค่าตัวอักษรแต่ละตัวด้วยตัวเลขที่เป็นไปได้แล้วตรวจดูว่าสมการเป็นจริงไหม ถ้าจริงก็แสดงผลออกมา

In [1]:
# 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
In [2]:
# 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
In [3]:
# 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
In [4]:
# 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}")
In [5]:
#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
In [6]:
#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
In [7]:
#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
In [8]:
#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
In [9]:
# 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 เบื้องต้น บทที่ ๑๓: เซ็ต

ถ้าเรามีลิสต์ที่มีสมาชิกที่อาจซ้ำอยู่ เราเอามาตรวจสอบได้โดยเปลี่ยนลิสต์เป็นเซ็ท แล้วดูว่าจำนวนสมาชิกของเซ็ทเท่ากับจำนวนสมาชิกของลิสต์ตั้งต้นหรือไม่ ถ้าเท่ากันก็แสดงว่าสมาชิกในลิสต์ตั้งต้นไม่ซ้ำกันเพราะเซ็ทจะเก็บสมาชิกไว้แบบไม่ซ้ำกัน

In [10]:
# สมมุติว่ามีลิสต์ที่มีสมาชิกซ้ำกันอยู่ เมื่อนับจำนวนสมาชิกด้วย len() จะได้สมาชิก 5 ตัว
x = [3,5,6,5,8]
len(x)
Out[10]:
5
In [11]:
# เอาลิสต์ x มาทำให้เป็นเซ็ท จะเห็นว่าจะเก็บสมาชิกไว้แบบไม่ให้ซ้ำกัน
set(x)
Out[11]:
{3, 5, 6, 8}
In [12]:
# ตรวจสอบว่าสมาชิกของเซ็ทเท่ากับของลิสต์ไหม ในที่นี้ลิสต์มีสมาชิกซ้ำ จำนวนสมาชิกเซ็ทจึงไม่เท่ากับของลิสต์
len(set(x)) == len(x)
Out[12]:
False
In [13]:
# กรณีนี้ไม่มีสมาชิกซ้ำ จำนวนสมาชิกเซ็ทจึงเท่ากับในลิสต์
x = [1,2,3,100,300,1000]
len(set(x)) == len(x)
Out[13]:
True
In [14]:
# 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
In [15]:
# 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