Last active
September 27, 2018 13:41
-
-
Save yojkim/aa39e39349a758b392b6b288a8c6ca90 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"io/ioutil" | |
"log" | |
"os" | |
"regexp" | |
"strings" | |
) | |
type Page struct { | |
index int | |
externalLinks []string | |
defaultScore int | |
linkScore float32 | |
} | |
func searchKeyword(word string, page string) int { | |
regexStr := fmt.Sprintf(`( |\\\w|[^a-z])%s( |\\\w|[^a-z]|$)`, word) | |
keyRegex := regexp.MustCompile(regexStr) | |
return len(keyRegex.FindAllString(page, -1)) | |
} | |
func solution(word string, pages []string) int { | |
if len(pages) == 0 { | |
return -1 | |
} | |
pageFinder := make(map[string]*Page) | |
for i, page := range pages { | |
currentURL := strings.Split( | |
strings.Split(page, "<meta property=\\\"og:url\\\" content=\\\"")[1], "\\\"/>\\n</head>")[0] | |
externalLinks := make([]string, 0) | |
splittedStr := strings.Split(page, "<a href=\\\"") | |
for _, str := range splittedStr { | |
if strings.Contains(str, "https://") && !strings.Contains(str, "<meta property=\\\"og:url\\\" content=\\\""){ | |
externalLinks = append(externalLinks, strings.Split(str, "\\\">")[0]) | |
} | |
} | |
pageFinder[currentURL] = &Page{ | |
index: i, | |
externalLinks:externalLinks, | |
defaultScore:searchKeyword(strings.ToLower(word), strings.ToLower(page)), | |
linkScore:0, | |
} | |
} | |
maxIndex := 0 | |
var maxValue float32 = -1 | |
fmt.Println(pageFinder) | |
for _, page := range pageFinder { | |
fmt.Println(page) | |
for _, link := range page.externalLinks { | |
if dstPage, ok := pageFinder[link]; ok { | |
dstPage.linkScore += float32(page.defaultScore) / float32(len(page.externalLinks)) | |
} | |
} | |
} | |
for _, page := range pageFinder { | |
score := float32(page.defaultScore) + page.linkScore | |
if score > maxValue { | |
maxIndex = page.index | |
maxValue = score | |
} | |
} | |
return maxIndex | |
} | |
func main() { | |
if len(os.Args) < 3 { | |
panic("Input error") | |
} | |
inputFileName := os.Args[1] | |
word := os.Args[2] | |
data, err := ioutil.ReadFile(inputFileName) | |
if err != nil { | |
log.Fatalln(err.Error()) | |
} | |
str := string(data) | |
str = strings.Replace(str, "[\"", "", 1) | |
str = strings.Replace(str, "\"]", "", 1) | |
pages := strings.Split(str, "\", \"") | |
fmt.Println(solution(word, pages)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment