Minimum Scalar Product


ข้อนี้โจทย์ให้จับคู่ 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

แล้วเราก็เอามาคูณกัน แล้วก็หาผลรวม



จบ




Create Date : 15 พฤศจิกายน 2557
Last Update : 15 พฤศจิกายน 2557 11:10:02 น.
Counter : 361 Pageviews.

0 comments
ชื่อ : * blog นี้ comment ได้เฉพาะสมาชิก
Comment :
 *ส่วน comment ไม่สามารถใช้ javascript และ style sheet
 

Chaowman.BlogGang.com

chaowman
Location :
กรุงเทพฯ  Thailand

[ดู Profile ทั้งหมด]
 ผู้ติดตามบล็อก : 8 คน [?]