ข้อนี้โจทย์ให้จับคู่ vector
แล้วให้เอาแต่ละจุดของ vector มาคูณกัน
โดยต้องได้ผลรวมที่น้อยที่สุด
อ่านต่อ
ที่นี่ วิธีคิดก็ง่ายมาก ก็ให้ vector นึงเรียงจากน้อยไปมาก
อีก vector ก็เรียงมากไปน้อยแล้วคูณกันก็จบ
let solve seq1 seq2 =
let seq1 = seq1 |> Seq.sort
let seq2 = seq2 |> Seq.sortBy (~-) // Unary minus
Seq.zip seq1 seq2 |> Seq.map (fun (a, b) -> int64 a * int64 b)
|> Seq.sum
|> string
ใน f# การประกาศทับตัวแปรเดิมเค้าเรียกว่า
shadowing เช่น let seq1 = seq1 |> Seq.sort
จริงๆ ก็เหมือน imparative แต่ shadowing จะพิเศษกว่าตรงที่ ตัวแปลแรกกับตัวแปรหลังไม่เกี่ยวข้องกันเลย
เช่น เราสามารถเปลี่ยน type ของตัวแปรก็ได้
และใน f# เราไม่มี sort descending เลยต้อง sortBy negative แทน
อีกอย่างคือ
operator ของ f# จะไม่ซ้ำกันเลย ดังนั้น minus กับ unary minus มี symbol ต่างกัน
ส่วน zip คือ จับคู่ item ใน list
แล้วเราก็เอามาคูณกัน แล้วก็หาผลรวม
จบ