Skip to content

Instantly share code, notes, and snippets.

@yojkim
Last active September 27, 2018 13:41
Show Gist options
  • Save yojkim/aa39e39349a758b392b6b288a8c6ca90 to your computer and use it in GitHub Desktop.
Save yojkim/aa39e39349a758b392b6b288a8c6ca90 to your computer and use it in GitHub Desktop.
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