ท้าวความนิดส์นึงครับว่า งานปีใหม่ของ Osdev จะมีการจัดฉลากของขวัญกัน แต่ปัญหาหลักๆ ของการจับฉลากนั้นคือ ไม่รู้จะซื้ออะไร นั่นเอง
ดังนั้นเราจึงแก้ปัญหาโดยการ จับฉลากก่อนซะเลย แต่การจับฉลากก่อนนั้น จะเป็นไปโดยที่ไม่มีใครรู้ว่าใครจับได้ใคร
ดังนั้นเราต้องมา Coding กันซึ่งก็ต้องคิดก่อนว่าจะ Code ภาษาอะไรดี ซึ่งสรุปได้ว่าใช้ Golang เพราะอยากลองเขียนอยู่พอดี
โจทย์คือ
ประเด็นอยู่ที่ว่า ไอ้ function SendMail http://golang.org/pkg/net/smtp/#SendMail นั้นมันไม่มีที่ให้ใส่ Subject น่ะสิ ซึ่งค้นไปค้นมาไปเจอ Post นึงบอกว่าให้ใช้ "Subject: xxxx" ใน body message ได้เลย https://groups.google.com/d/msg/golang-nuts/b_zNHgr5cXU/2HLlGfwkTp4J ก็เลยจัดไป ได้ผลตามต้องการ
Continue Reading...
ดังนั้นเราจึงแก้ปัญหาโดยการ จับฉลากก่อนซะเลย แต่การจับฉลากก่อนนั้น จะเป็นไปโดยที่ไม่มีใครรู้ว่าใครจับได้ใคร
ดังนั้นเราต้องมา Coding กันซึ่งก็ต้องคิดก่อนว่าจะ Code ภาษาอะไรดี ซึ่งสรุปได้ว่าใช้ Golang เพราะอยากลองเขียนอยู่พอดี
โจทย์คือ
- ห้าม Random ได้ตัวเอง
- กรณีที่ผู้เล่นเป็นเลขคี่ ห้ามเหลือเศษ (กรณีที่ทุกคนมีคู่จนเหลือคนเดียว)
Solution ที่คิดออกมาคือเอาทุกคนเข้าไปอยู่ใน Array จากนั้น Shuffle Array ซะแล้วก็ไล่ส่งเมลแบบปกติเลย ได้ Code ออกมาแบบนี้
package main import "math/rand" import "time" import "net/smtp" import "net/mail" import "strings" func encodeRFC2047(String string) string{ // use mail's rfc2047 to encode any string addr := mail.Address{String, ""} return strings.Trim(addr.String(), " <>") } func main() { var members = shuffle([]string { "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", "example@osdev.co.th", }) auth := smtp.PlainAuth("", "example@osdev.co.th", "password", "smtp.gmail.com") subject := "Subject: Osdev Gift Random for New Year Cerebration\r\n\r\n" for i, _ := range members { if i != len(members) - 1 { message := "นี่คือเมลแจ้งการจับคุ่ขาของคุณ\r\nคู่ขาของคุณคือ " + members[i] + "\r\n\r\nกรุณาซื้อของขวัญราคาไม่ต่ำกว่า xxxx บาทมาให้คู่ขาของคุณด้วยนะจ๊ะ\r\nและอย่าลืมเก็บเรื่องนี้เป็นความลับล่ะ อย่าให้คู่ขาของคุณรู้เป็นอันขาด!!!" smtp.SendMail("smtp.gmail.com:587", auth, "example@osdev.co.th", []string{members[i+1]}, []byte(subject + message)) } } message := "นี่คือเมลแจ้งการจับคุ๋ขาของคุณ\r\nคู่ขาของคุณคือ " + members[len(members) - 1] + "\r\n\r\nกรุณาซื้อของขวัญราคาไม่ต่ำกว่า xxxx บาทมาให้คู่ขาของคุณด้วยนะจ๊ะ\r\nและอย่าลืมเก็บเรื่องนี้เป็นความลับล่ะ อย่าให้คู่ขาของคุณรู้เป็นอันขาด!!!" smtp.SendMail("smtp.gmail.com:587", auth, "example@osdev.co.th", []string{members[0]}, []byte(subject + message)) } func shuffle(members []string) []string { rand.Seed(time.Now().UTC().Unix()) var newMembers = make([]string, len(members)) var rands = rand.Perm(len(members)) for i, v := range rands { newMembers[i] = members[v] } return newMembers }
ประเด็นอยู่ที่ว่า ไอ้ function SendMail http://golang.org/pkg/net/smtp/#SendMail นั้นมันไม่มีที่ให้ใส่ Subject น่ะสิ ซึ่งค้นไปค้นมาไปเจอ Post นึงบอกว่าให้ใช้ "Subject: xxxx" ใน body message ได้เลย https://groups.google.com/d/msg/golang-nuts/b_zNHgr5cXU/2HLlGfwkTp4J ก็เลยจัดไป ได้ผลตามต้องการ