Category Archives: programming

วิทย์ม.ต้น: รู้จัก Markdown ใน Jupyter Notebook, วิธีแก้ปัญหาแบบ Brute Force

วันนี้เด็กๆม.ต้นรู้ว่าใน Jupyter Notebook เราสามารถพิมพ์ข้อความ ใส่รูปภาพ ใส่วิดีโอ เพื่ออธิบายว่า notebook ของเราทำอะไรบ้างครับ วิธีทำก็คือไปที่เมนู Cell/Cell Type/Markdown ก็จะทำให้สิ่งที่เราจะพิมพ์เป็นข้อความแบบมีฟอร์แมทต่างๆเช่นตัวหนา ตัวเอียงได้ ไม่จำเป็นต้องเป็นคำสั่งเพื่อการคำนวณในภาษา Python อย่างเดียว

ตัวอย่างการใช้ Markdown ใน Jupyter Notebook ดูได้ในคลิปนี้ครับ ตัวอย่างให้เรามาลองเองอยู่ที่ลิงก์นี้ครับ:

สรุปคำสั่ง Markdown ดูได้ที่ Learn X in Y Minutes (Where X=markdown)  ครับ

สำหรับคนที่หัดใช้ Jupyter Notebook เรียนรู้จาก Jupyter Notebook for Beginners: A Tutorial หรือดูคลิปข้างล่างนี้ได้ครับ:

พอเราใส่คำอธิบายต่างๆด้วย Markdown ได้แล้ว เราสามารถสร้างเอกสารที่รวบรวมเนื้อหาและผลการคำนวณต่างๆไว้ด้วยกัน สามารถส่งให้กันได้ หรือให้คนอื่นเอาไปใช้ได้ง่ายๆครับ ตัวอย่างก็เช่น notebook ที่อาจารย์ Peter Norvig ทำไว้ที่ List of IPython (Jupyter) Notebooks by Peter Norvig สำหรับเด็กๆที่เรียนรู้เรื่องความน่าจะเป็นก็อาจเข้าไปดู A Concrete Introduction to Probability (using Python) เป็นตัวอย่างครับ

 ผมไปเจอวิดีโอสอน Python ที่ใช้ได้อีกอันหนึ่ง ยาว 4 ชั่วโมงกว่าๆ เลยเอามาแนะนำให้เด็กๆรู้จักด้วยครับ เผื่อใครชอบดูคลิปมากกว่าอ่าน:

เนื่องจากเด็กๆเล่นแก้ปัญหาที่ Brilliant.org จึงมีโจทย์ที่คิดไม่ค่อยออก ผมเลยทดลองเขียนโปรแกรมแก้ปัญหาเหล่านั้นแบบ Brute Force ซื่งแปลว่าแก้แบบลองใส่ค่าที่เป็นไปได้ทั้งหมดแล้วเช็คว่าค่าที่ใส่เข้าไปค่าไหนเป็นคำตอบผมบอกเด็กๆว่าถ้าค่าที่เป็นไปได้มีไม่เกินสักพันล้านแบบ เราอาจเขียนโปรแกรมลองมันหมดทุกตัวเลยเพราะคอมพิวเตอร์ตอนนี้เร็วมากแล้ว (และจะเร็วขึ้นอีกในอนาคต)

เช่นข้อแรกมีข้อความที่ถูกเข้ารหัสด้วย  Caesar cipher คือตัวอักษรภาษาอังกฤษถูกแทนที่ด้วยตัวอักษรอีกตัวที่ห่างออกไประยะคงที่ เช่นถ้าระยะเท่ากับ 2 ก็จะมีการแทนที่แบบ A => C, B => D, C => E, …, X => Z, Y => A, Z => B เป็นต้น ดังนั้นถ้ามีข้อความเข้ารหัสอ่านไม่ออกแบบนี้ เราก็สามารถทดลองการแทนที่ตัวอักษรกลับ 26 แบบแล้วลองอ่านข้อความที่ได้มาเลยก็ได้ครับ

ตัวอย่างฟังก์ชั่นเข้ารหัสและถอดรหัสแบบ Caesar Cipher
ตัวอย่างฟังก์ชั่นเข้ารหัสและถอดรหัสแบบ Caesar Cipher
เข้ารหัสและถอดรหัสจะได้ข้อความตั้งต้น
เข้ารหัสและถอดรหัสจะได้ข้อความตั้งต้น
เราได้ข้อความที่เข้ารหัสมาอ่านไม่ออก แต่ทดลองถอดรหัสทุกแบบที่เป็นไปได้ แล้วจะพบข้อความที่อ่านออก
เราได้ข้อความที่เข้ารหัสมาอ่านไม่ออก แต่ทดลองถอดรหัสทุกแบบที่เป็นไปได้ แล้วจะพบข้อความที่อ่านออก

อีกข้อคือได้โจทย์ XX + YY + ZZ = XYZ โดยที่ X, Y, และ Z เป็นเลขโดด 0-9 ให้หาค่าของ X, Y, และ Z เราก็สามารถแก้ปัญหาแบบ brute force ได้เพราะแบบที่เป็นไปได้ของ  X, Y, และ Z มีเพียง 1,000 แบบเท่านั้น (X เป็นได้ 10 แบบ คูณกับ Y เป็นได้ 10 แบบ คูณกับ Z เป็นได้ 10 แบบ เท่ากับ 1,000 แบบ) เราเขียนโค้ด Python ง่ายๆแบบนี้ คือให้ค่า X, Y, และ Z  เปลี่ยนไปเรื่อยๆแล้วดูว่าค่าไหนทำให้ XX + YY + ZZ = XYZ ก็พิมพ์ผลออกมา จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบที่ไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198:

จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z  = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198
จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198

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

วิทย์ม.ต้น: แนะนำเว็บ PyMOTW-3, Skillshare.com, และ Brilliant.org

สำหรับวิทย์ม.ต้นวันนี้ ผมแนะนำเว็บที่น่าจะมีประโยชน์สำหรับเด็กๆ 3 เว็บ แล้วให้เขาทำแบบฝึกหัดที่  Repl.it ต่อไป

เว็บแรกคือ Python 3 Module of the Week เป็นเว็บที่มีตัวอย่างการใช้งานโมดูลไพธอนสำหรับงานต่างๆ ให้เด็กๆเข้าไปดูว่าจะใช้งานอะไรได้บ้าง และให้เขาพิมพ์/ก็อปปี้ตัวอย่างมาทดลองและดัดแปลงใน Jupyter Notebook ของเขาเอง

เว็บที่สองคือ Skillshare.com ที่มีคอร์สออนไลน์สอนทักษะต่างๆให้เลือกมากมาย เช่นหัดวาดรูป หัดถ่ายภาพ หัดเขียนหนังสือ ฯลฯ จะต่างจากคอร์สออนไลน์อื่นๆที่เน้นด้านวิชาการเป็นส่วนใหญ่

เว็บที่สามคือ Brilliant.org ที่มีปัญหาย่อยๆให้เราค่อยๆตอบแล้วเราก็จะเรียนรู้เรื่องต่างๆที่เราสนใจ อันนี้จะเน้นพวกวิทย์ คณิต ตรรกะ รวมถึงเทคโนโลยีทางคอมพิวเตอร์เช่น Neural Network และ Machine Learning

จากนั้นเด็กๆก็ลองดูเว็บที่แนะนำและทำแบบฝึกหัดที่ Repl.it ต่อครับ

วิทย์ม.ต้น: ติดตั้ง Anaconda, รู้จัก Jupyter Notebook และ Automate The Boring Stuff With Python

วันนี้ผมแนะนำให้เด็กๆรู้จักติดตั้ง Python ลงบนเครื่องคอมพิวเตอร์ของตนเองจะได้ทำงานกับข้อมูลและไฟล์ที่มีอยู่บนคอมพิวเตอร์ของตัวเองได้ นอกเหนือไปจากแบบฝึกหัดที่เด็กๆหัดทำออนไลน์ที่ Repl.it ครับ ผมแนะนำให้เด็กๆติดตั้ง Python โดยใช้แพ็คเกจที่เรียกว่า Anaconda ซึ่งรวมตัวภาษา Python และเครื่องมือที่น่าใช้ร่วมกันด้วยกันหลายตัวครับ  หน้าดาวน์โหลดจะอยู่ที่ https://www.anaconda.com/download/ ครับ ในหน้านั้นมีลิงก์แนะนำวิธีใช้ด้วย

หน้าตาเว็บดาวน์โหลด Anaconda ครับ

หลังจากติดตั้ง Anaconda เสร็จ ผมให้เด็กๆเปิด Jupyter Notebook ที่สามารถสร้างเอกสารที่เรียกว่า Notebook โดยในเอกสารสามารถเก็บคำสั่งภาษา Python (และภาษาอื่นๆเช่น Julia และ R) เก็บคำอธิบายรวมไปถีงสมการต่างๆได้ครับ ข้อมูลเพิ่มเติมเกี่ยวกับ Jupyter ดูได้ที่ https://jupyter.org ครับ ถ้ามี Anaconda อยู่แล้วก็ใช้ Jupyter Notebook ได้เลย ไม่ต้องติดตั้งอะไรเพิ่ม

หน้าตาเว็บ Jupyter ครับ
หน้าตาเว็บ Jupyter ครับ

ต่อจากนั้นผมก็แนะนำหนังสือ Automate the Boring Stuff with Python ครับ เป็นหนังสือที่สามารถอ่านฟรีได้บนเว็บ ครึ่งแรกสอนการเขียนภาษา Python ครึ่งหลังเป็นตัวอย่างการประยุกต์ใช้ครับ ในอนาคตเราจะทำโปรเจ็กคล้ายๆกับในหนังสือครับ

หนังสือ Automate the Boring Stuff with Python ครับ
หนังสือ Automate the Boring Stuff with Python ครับ

สำหรับเด็กม. 3 ผมให้ไปหัดพิมพ์ตัวอย่าง Python Tricsk 101 ที่ https://hackernoon.com/python-tricks-101-2836251922e0 เข้าไปใน Jupyter Notebook แล้วพยายามทำความเข้าใจว่าโค้ดมันทำอะไรอย่างไรครับ