From b3e1b6ba99e5ff0ac1e7c6cac548b0833acedb6d Mon Sep 17 00:00:00 2001 From: pankona Date: Sat, 15 Aug 2015 12:17:22 +0900 Subject: [PATCH 1/4] use const value rather than hardcoded integer for number of result to show. --- main.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index c81b6a9..c4807c2 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,10 @@ import ( "time" ) +const ( + DefaultNumOfResultToShow = 3 +) + func departureTime(departure string) (int, int) { ret, _ := regexp.MatchString("^[0-9]{1,2}:[0-9]{1,2}$", departure) var hour int @@ -81,21 +85,22 @@ func main() { flag.Parse() hour, minute := departureTime(departure) timetable := createTimetable(getSelector()) + numOfResult := DefaultNumOfResultToShow arrivals := timetable[hour] - result := make([]int, 0, 3) + result := make([]int, 0, numOfResult) for _, v := range arrivals { if v > minute { result = append(result, v) - if len(result) >= 3 { + if len(result) >= numOfResult { break } } } printTimes(hour, result) - if hour != 23 && len(result) < 3 { - max := 3 - len(result) + if hour != 23 && len(result) < numOfResult { + max := numOfResult - len(result) arrivals = timetable[hour+1] result2 := make([]int, 0, max) for _, v := range arrivals { From 04600ddd4ad1a3827ada3dab77139b0f92ce5c35 Mon Sep 17 00:00:00 2001 From: pankona Date: Sat, 15 Aug 2015 13:04:38 +0900 Subject: [PATCH 2/4] use slice of Time struct for timetable instead of [][]int. it is easy to get these things if it is fomred single dimentioned array. - first bus of the day - last bus of the day - get time of next bus by specified time please note that the array is needed to be sorted by time in ascending order. --- main.go | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/main.go b/main.go index c4807c2..baa58cb 100644 --- a/main.go +++ b/main.go @@ -13,6 +13,10 @@ const ( DefaultNumOfResultToShow = 3 ) +type Time struct { + hour, minute int +} + func departureTime(departure string) (int, int) { ret, _ := regexp.MatchString("^[0-9]{1,2}:[0-9]{1,2}$", departure) var hour int @@ -50,8 +54,8 @@ func getSelector() string { } } -func createTimetable(selector string) [][]int { - var timetable = make([][]int, 24) +func createTimetable(selector string) []Time { + var timetable = make([]Time, 0) doc, _ := goquery.NewDocument("http://www.keiseibus.co.jp/jikoku/bs_tt.php?key=04159_01a") doc.Find(selector).Each(func(_ int, s *goquery.Selection) { s.Find("tbody tr").Each(func(_ int, s *goquery.Selection) { @@ -61,7 +65,7 @@ func createTimetable(selector string) [][]int { s.Find("br").Remove() if s.Text() != "" { value, _ := strconv.Atoi(s.Text()) - timetable[key] = append(timetable[key], value) + timetable = append(timetable, Time{key, value}) } }) }) @@ -69,12 +73,12 @@ func createTimetable(selector string) [][]int { return timetable } -func printTimes(hour int, minuteses []int) { - for _, v := range minuteses { - if v < 10 { - fmt.Println(fmt.Sprintf("%d:0%d ", hour, v)) +func printTimes(times []Time) { + for _, v := range times { + if v.minute < 10 { + fmt.Println(fmt.Sprintf("%d:0%d ", v.hour, v.minute)) } else { - fmt.Println(fmt.Sprintf("%d:%d ", hour, v)) + fmt.Println(fmt.Sprintf("%d:%d ", v.hour, v.minute)) } } } @@ -87,28 +91,14 @@ func main() { timetable := createTimetable(getSelector()) numOfResult := DefaultNumOfResultToShow - arrivals := timetable[hour] - result := make([]int, 0, numOfResult) - for _, v := range arrivals { - if v > minute { + result := make([]Time, 0, numOfResult) + for _, v := range timetable { + if v.minute > minute && v.hour >= hour { result = append(result, v) if len(result) >= numOfResult { break } } } - printTimes(hour, result) - - if hour != 23 && len(result) < numOfResult { - max := numOfResult - len(result) - arrivals = timetable[hour+1] - result2 := make([]int, 0, max) - for _, v := range arrivals { - result2 = append(result2, v) - if len(result2) >= max { - break - } - } - printTimes(hour+1, result2) - } + printTimes(result) } From 7036af5cdc12e801f8099414335f99d29e9b19eb Mon Sep 17 00:00:00 2001 From: pankona Date: Sat, 15 Aug 2015 13:33:56 +0900 Subject: [PATCH 3/4] define -n option to get num of result to show. --- main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index baa58cb..1a0fb2b 100644 --- a/main.go +++ b/main.go @@ -85,11 +85,13 @@ func printTimes(times []Time) { func main() { var departure string + var numOfResult int flag.StringVar(&departure, "t", "", "specify departure time.") + flag.IntVar(&numOfResult, "n", DefaultNumOfResultToShow, "specify amount of result.") flag.Parse() + hour, minute := departureTime(departure) timetable := createTimetable(getSelector()) - numOfResult := DefaultNumOfResultToShow result := make([]Time, 0, numOfResult) for _, v := range timetable { From a52a5ca77164429444eb24afd622120d9eba1a4d Mon Sep 17 00:00:00 2001 From: pankona Date: Sat, 15 Aug 2015 13:46:57 +0900 Subject: [PATCH 4/4] call os.Exit(2) in case the parameter for -n is negative. --- main.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main.go b/main.go index 1a0fb2b..34f9a09 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "github.com/PuerkitoBio/goquery" + "os" "regexp" "strconv" "time" @@ -90,6 +91,11 @@ func main() { flag.IntVar(&numOfResult, "n", DefaultNumOfResultToShow, "specify amount of result.") flag.Parse() + if numOfResult < 0 { + fmt.Fprintf(os.Stderr, "parameter for -n must be greater than 0.\n") + os.Exit(2) + } + hour, minute := departureTime(departure) timetable := createTimetable(getSelector())