[Solution] cube-composer

วันก่อนโพสต์ไปในเพจว่ามีมินิเกมสำหรับฝึกการคิดแบบ Functional Programming (ก็คือฝึกการใช้งานพวก map filter reduce และคำสั่งอื่นๆ)

สามารถเข้าไปเล่นก่อนได้ที่ https://david-peter.de/cube-composer/

วิธีเล่นคือโจทย์จะกำหนดรูปแบบผลลัพธ์มาให้ (Goal) เป็นรูปด้านขวา
และ state เริ่มต้นมาให้ในด้านซ้าย
ด้านล่างจะมีชุดคำสั่งอยู่ให้เราเลือกเอามาเรียงๆ กันได้ (เลือกมาแล้วก็จะแสดงผลลัพธ์ในแต่ละสเต็ปเลยว่าเราแปลงบล็อกไปเป็นยังไงแล้ว)

ด้านล่างนี้จะเป็นเฉลย แนะนำให้ลองเล่นดูก่อนแล้วถ้าคิดไม่ออกค่อยมาดูเฉลยนะ

map()

ช่วงแรกจะเป็นการฝึกให้เราใช้คำสั่ง map ซึ่งเป็นคำสั่งที่ใช้แปลงบล็อกที่ตรงเงื่อนไขทั้งหมดไปเป็นอีกอย่างหนึ่ง

สำหรับข้อแรก จะมีคำสั่งให้มาคือ

  1. map(stack สีเหลือง) = ให้วางแถวสีเหลืองเพิ่มลงไปที่แถวบนสุด
  2. map(สีเหลือง -> สีแดงซ้อนข้างบนสีเหลือง) = ให้เปลี่ยนสีเหลืองทั้งหมดให้กลายเป็นสีเหลืองที่มีสีแดงซ้อนอยู่ข้างบนอีกที
  3. map(reject(สีเหลือง)) = ลบสีเหลืองทั้งหมดทิ้ง
  4. 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 และ แถวล่างสุด = หลักหน่วย

เช่นสำหรับข้อแรก ถ้าเราแปลงข้อมูลออกมาเราจะได้ว่ามันคือ

  1. 000 = 0
  2. 001 = 1
  3. 010 = 2
  4. 011 = 3
  5. 100 = 4
  6. 101 = 5
  7. 110 = 6
  8. 111 = 7

ส่วนคำตอบที่เขาอยากได้คือ 13571357 ดังนั้นเราเลยต้องเอาทุกตัวไป x2 และ +1 (ค่าที่เกินไปถือว่า overflow ให้ตัดทิ้งไป - แต่ต้องคิดในรูปแบบฐาน2นะ ไม่ใช่ฐาน10)

12 Total Views 12 Views Today

You may also like...