Tag Archives: python

วิทย์ม.ต้น: ใครจะอยากหาห.ร.ม.ด้วยมือ (เขียนโปรแกรมหา ห.ร.ม. และ ค.ร.น.)

ผมให้แบบฝึกหัดเด็กม.ต้นที่หัดเขียนโปรแกรมไพธอนโดยให้กลับไปคิดและเขียนโปรแกรมแก้ปัญหาที่ต้องทำด้วยมือในวิชาคณิตศาสตร์กันครับ ถ้าสั่งให้คอมพิวเตอร์ทำงานให้ได้ก็แสดงว่าเข้าใจหลักการต่างๆแล้ว นอกจากนี้คอมพิวเตอร์สามารถแก้ปัญหาใหญ่ๆที่เราทำด้วยมือไม่ไหวด้วย

คราวนี้ให้เด็กๆไปหัดสั่งให้คอมพิวเตอร์หาห.ร.ม. และค.ร.น.กัน

ในระดับมัธยม เด็กๆมักจะได้เรียนวิธีหาห.ร.ม. และค.ร.น.ด้วยตัวประกอบเฉพาะ แต่เราคุยกันเรื่องวิธีที่เหมาะกว่าเร็วกว่าที่ถูกบันทึกมากกว่าสองพันปีมาแล้วโดยยูคลิดด้วยครับ

ผมบันทึกโปรแกรมทั้งแบบแยกตัวประกอบและแบบยูคลิดให้เด็กๆและผู้สนใจเข้ามาดูทบทวนโดยสามารถโหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่นะครับ

วิทย์ม.ต้น: สั่งให้คอมพิวเตอร์แยกตัวประกอบให้จะได้ไม่เหนื่อย (Factors และ Prime Factorization)

ผมให้แบบฝึกหัดเด็กม.ต้นที่หัดเขียนโปรแกรมไพธอนโดยให้กลับไปคิดและเขียนโปรแกรมแก้ปัญหาที่ต้องทำด้วยมือในวิชาคณิตศาสตร์กันครับ ถ้าสั่งให้คอมพิวเตอร์ทำงานให้ได้ก็แสดงว่าเข้าใจหลักการต่างๆแล้ว นอกจากนี้คอมพิวเตอร์สามารถแก้ปัญหาใหญ่ๆที่เราทำด้วยมือไม่ไหวด้วย

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

สัปดาห์ต่อมาผมก็เฉลยในห้อง และแนะนำเด็กๆว่าเวลาเราไล่หารไปเรื่อยๆเราหยุดแถวๆสแควรูทของตัวเลขก็ได้ จะประหยัดเวลาไปได้หลายเท่าถ้าตัวเลขใหญ่

มีอย่างหนึ่งที่ผมไม่ได้พูดในห้องแต่ใส่ไว้โค้ดสำหรับคำนวณคือเลขจำนวนนับตั้งแต่สองขึ้นไปจะเป็นจำนวนเฉพาะหรือไม่ก็เป็นผลคูณของจำนวนเฉพาะได้แบบเดียวเท่านั้น (ถ้าไม่นับการสลับที่ต่างๆ) ความจริงอันนี้เรียกว่า Fundamental theorem of arithmetic ครับ

ผมบันทึกตัวอย่างเหล่านี้ไว้ให้เด็กๆและผู้สนใจเข้ามาดูทบทวนโดยสามารถโหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่นะครับ

วิทย์ม.ต้น: พยายามโปรแกรมสร้างคำด้วยสัญญลักษณ์ในตารางธาตุ, วาดรูปด้วย Turtle

สัปดาห์นี้เด็กๆม.2-3 พยายามหาวิธีเขียนคำภาษาอังกฤษด้วยสัญญลักษณ์จากตารางธาตุ ส่วนม.1 วาดรูปด้วย Turtle กันต่อจากสัปดาห์ที่แล้วครับ

สืบเนื่องมาจากโพสต์ให้เข้าไปชิงรางวัลใน Facebook นี้ครับ:

ปัญหาอย่างนี้เหมาะกับให้เครื่องจักรหาคำตอบให้มากครับ ผมถามเด็กๆว่าถ้าเราจะแก้ปัญหานี้อย่างไร พอช่วยกันคิดก็ได้คำตอบคร่าวๆว่าควรไปหาสัญญลักษณ์ตารางธาตุมาเก็บไว้ก่อน จากนั้นก็ลองสร้างฟังก์ชั่นที่รับคำภาษาอังกฤษเข้าไปแล้วพยายามแทนตัวอักษรทั้งหมดด้วยสัญญลักษณ์ในตารางธาตุโดยไม่ซ้ำกัน จากนั้นก็ป้อนคำภาษาอังกฤษทั้งหลายใส่ฟังก์ชั่นของเราไปเรื่อยๆดูว่าผลลัพธ์เป็นอย่างไร

เด็กๆหาสัญญลักษณ์มาใช้ได้จากหลายๆเว็บ เช่นอาจจะก๊อปปี้จากหน้า https://www.thoughtco.com/element-list-names-atomic-numbers-606529 แล้วเอามาใส่ในสตริง element_data อย่างนี้:

จากนั้นก็หัดใช้ splitlines() เพื่อจัดการแต่ละบรรทัดในสตริง:

หัดใช้ split เพื่อแบ่งข้อมูลที่ถูกคั่นด้วยตัวแบ่ง ในที่นี้คือ เว้นวรรคขีดเว้นวรรค จึงใช้ …split(” – “):

เก็บสัญญลักษณ์ที่แยกออกมาได้ไว้สักที่ เช่นในที่นี้เก็บไว้ในลิสต์ symbols แล้วใช้ตรวจว่าสัญญลักษณ์อะไรอยู่ในตารางธาตุบ้าง:

จากนั้นก็เริ่มดูได้ว่าคำแต่ละคำมีสัญญลักษณ์ธาตุอะไรบ้าง เช่นคำว่า “bacon” ตรวจได้อย่างนี้:

พอรู้ว่ามีธาตุอะไรบ้าง เราก็ต้องพยายามเรียงธาตุเหล่านั้นเป็นคำที่ต้องการ แต่เราควรตรวจสอบเสียก่อนว่าธาตุต่างๆมีตัวอักษรพอเพียงที่จะเขียนคำได้หรือไม่ ถ้ามีตัวอักษรเพียงพอ ก็ควรดูว่าธาตุแต่ละอันสามารถอยู่ในตำแหน่งไหนได้บ้าง จากนั้นก็เรียงแบบที่เป็นไปได้ดูว่าแบบไหนสะกดเป็นคำที่เราต้องการ ส่วนนี้เป็นส่วนให้เด็กๆกลับไปคิดที่บ้านกันครับ

สำหรับม. 1 เราเล่น Turtle กันต่อ วาดนู่นวาดนี่ตามความสนใจ ตัวอย่างเช่นเต่าหกตัวเดินแบบเมาๆ:

import turtle
import random

turtles = [turtle.Turtle() for i in range(6)]
colors = ["red", "blue", "black", "brown", "orange", "green"]
for t in turtles:
    t.speed("fastest")
    t.shape('classic')

for i in range(10000):
    for t,c  in zip(turtles,colors):
        #step = random.randint(0,30)
        #angle = random.randint(-90,90)
        step = 10
        angle = random.choice([0,180,90,-90])
        t.color(c)
        t.forward(step)
        t.left(angle)

หรือลากเส้นไปมาดูว่าแบบไหนสวย เช่นอันนี้:

import turtle

t = turtle.Turtle()
t.speed("normal")
span = 400
step = 20
t.shape('circle')

for i in range(0,span+step,step):
    t.penup()
    t.goto(0,i)
    t.pendown()
    t.goto(span-i, 0)

    t.penup()
    t.goto(0,i)
    t.pendown()
    t.goto(-span+i, 0)

    t.penup()
    t.goto(0,-i)
    t.pendown()
    t.goto(span-i, 0)

    t.penup()
    t.goto(0,-i)
    t.pendown()
    t.goto(-span+i, 0)

t.hideturtle()