วันก่อนโพสต์ไปในเพจว่ามีมินิเกมสำหรับฝึกการคิดแบบ Functional Programming (ก็คือฝึกการใช้งานพวก map filter reduce และคำสั่งอื่นๆ)
สามารถเข้าไปเล่นก่อนได้ที่ https://david-peter.de/cube-composer/
วิธีเล่นคือโจทย์จะกำหนดรูปแบบผลลัพธ์มาให้ (Goal) เป็นรูปด้านขวา
และ state เริ่มต้นมาให้ในด้านซ้าย
ด้านล่างจะมีชุดคำสั่งอยู่ให้เราเลือกเอามาเรียงๆ กันได้ (เลือกมาแล้วก็จะแสดงผลลัพธ์ในแต่ละสเต็ปเลยว่าเราแปลงบล็อกไปเป็นยังไงแล้ว)
ด้านล่างนี้จะเป็นเฉลย แนะนำให้ลองเล่นดูก่อนแล้วถ้าคิดไม่ออกค่อยมาดูเฉลยนะ
map()
ช่วงแรกจะเป็นการฝึกให้เราใช้คำสั่ง map ซึ่งเป็นคำสั่งที่ใช้แปลงบล็อกที่ตรงเงื่อนไขทั้งหมดไปเป็นอีกอย่างหนึ่ง
สำหรับข้อแรก จะมีคำสั่งให้มาคือ
map(stack สีเหลือง)
= ให้วางแถวสีเหลืองเพิ่มลงไปที่แถวบนสุดmap(สีเหลือง -> สีแดงซ้อนข้างบนสีเหลือง)
= ให้เปลี่ยนสีเหลืองทั้งหมดให้กลายเป็นสีเหลืองที่มีสีแดงซ้อนอยู่ข้างบนอีกทีmap(reject(สีเหลือง))
= ลบสีเหลืองทั้งหมดทิ้งmap(สีเหลือง -> สีแดง)
= ให้เปลี่ยนสีเหลืองทั้งหมดให้หลายเป็นสีแดง
ซึ่งข้อนี้ แค่เปลี่ยนสีเหลืองเป็นสีแดงทั้งหมดก็จบแล้ว
filter()
สำหรับคำสั่ง filter ของเกมนี้ จะใช้ในการเลือก column (แถวแนวตั้ง) ที่ตรงกับเงื่อนไข
ตัวอย่างเช่น ข้อนี้จะมีคำสั่ง filter(contains สีแดง)
นั่นคือให้เลือกแถวแนวตั้งเฉพาะแถวที่มีสีแดงอยู่ (นั่นคือแถวทางซ้ายสุด 2 แถว - แถวทางขวาที่เป็นสีฟ้ากับสีเหลืองจะโดนลบออกไป)
stackEqualColumns
อันนี้เป็นคำสั่งที่ไม่น่าจะมีในการเขียนโปรแกรม แต่เป็นคำสั่งพิเศษสำหรับเกมนี้
นั่นคือเมื่อเราสั่ง stackEqualColumns
จะเป็นการรวมบล็อกแนวนอนสีที่เหมือนกันเข้าด้วยกัน
เช่นในข้อนี้ เมื่อเราสั่ง stackEqualColumns
จะมีการรวม
- สีน้ำตาล 1 บล็อก -> สีน้ำตาล 1 บล็อก
- สีชมพูแนวนอน 2 บล็อกที่ติดกัน -> รวมให้กลายเป็นสีชมพู 1 column (ซ้อนกัน 2 บล็อก)
- สีน้ำตาลแนวนอน 3 บล็อกที่ติดกันตรงกลาง -> รวมให้กลายเป็นสีน้ำตาล 1 column (ซ้อนกัน 3 บล็อก)
อันนี้อาจจะซับซ้อนนิดหน่อย เพราะมันจะเป็นการ stackEqualColumns
2 ชั้น
- ใน column แรกจะมีสีน้ำตาล ซ้อนกัน 2 บล็อก
- ต่อมาใน column ที่ 2-3 จะมีบล็อกน้ำตาลซ้อนอยู่บนชมพูต่อกัน 2 column ซึ่งพอรวมกันได้จะกลายเป็น น้ำตาล-ชมพู ซ้อนกัน 2 ชั้น (สูง 4 บล็อก) นั่นเอง
ข้อนี้จะมีเพิ่มเติมขึ้นมาคือการ map แบบมี variable
สังเกตคำสั่งที่ 3 จะเห็นว่ามันคือคำสั่ง map(x ที่ซ้อนบนฟ้า -> x)
นั่นคือให้เปลี่ยนอะไรก็ตามที่เป็นบล็อกซ้อนอยู่บนสีฟ้า ให้กลายเป็นสีนั้นๆ อย่างเดียว (สีฟ้าจะหายไป)
และอีกคำสั่งหนึ่ง คือ map(x -> x ซ้อนบนชมพู)
นั่นคือให้เปลี่ยนบล็อกทุกตัว ให้กลายเป็นบล็อกสีนั้นแหละ แต่มีสีชมพูอยู่ด้านล่าง
partition
คำสั่ง partition
ให้คิดง่ายๆ ว่ามันคือคำสั่ง reorder หรือ sort
นั่นเอง
เช่นคำสั่งแรก partition(contains สีแดง)
คือให้เรียง (เรียงตาม column) โดนดันให้ column ที่มีสีแดงเลื่อนไปทางขวา
(สำหรับเกมนี้ ด้านขวาสุดน่าจะเป็น ASC ส่วนด้านซ้ายจะเป็น DESC = เรียงน้อยไปมากโดยอิงจากขวามาซ้าย)
Binary Number Procressing
สำหรับช่วงนี้ จริงๆ เราว่ามันไม่ใช่การฝึกเรื่อง functional แล้วล่ะ
มันคือการเช็กว่าคุณเข้าใจ binary number แค่ไหน (ฮา)
โดยที่ สีชมพู = 0, สีน้ำตาล = 1 และ แถวล่างสุด = หลักหน่วย
เช่นสำหรับข้อแรก ถ้าเราแปลงข้อมูลออกมาเราจะได้ว่ามันคือ
000
= 0001
= 1010
= 2011
= 3100
= 4101
= 5110
= 6111
= 7
ส่วนคำตอบที่เขาอยากได้คือ 13571357
ดังนั้นเราเลยต้องเอาทุกตัวไป x2 และ +1 (ค่าที่เกินไปถือว่า overflow ให้ตัดทิ้งไป - แต่ต้องคิดในรูปแบบฐาน2นะ ไม่ใช่ฐาน10)