← Home
For problem statement at 0-999/200-299/200-209/207/problemD10.txt this is a correct solution, but verifier at 0-999/200-299/200-209/207/verifierD10.go ends with failed to build reference: exit status 1
package 0-999/200-299/200-209/207/207D10.go is not in std (/usr/local/go/src/0-999/200-299/200-209/207/207D10.go)

exit status 1 can you fix the verifier? package main

import (
	"fmt"
	"io"
	"os"
	"strings"
	"unicode"
)

var tradeW = map[string]int{
	"trade":          8,
	"tariff":         8,
	"tariffs":        8,
	"import":         5,
	"imports":        5,
	"export":         4,
	"exports":        4,
	"quota":          8,
	"quotas":         8,
	"gatt":           10,
	"dumping":        9,
	"embargo":        8,
	"sanctions":      7,
	"duty":           6,
	"duties":         6,
	"retaliation":    7,
	"protectionism":  8,
	"protectionist":  8,
	"customs":        5,
	"subsidy":        4,
	"subsidies":      4,
	"surplus":        3,
	"deficit":        3,
	"bilateral":      3,
	"multilateral":   3,
	"negotiations":   3,
	"agreement":      2,
	"agreements":     2,
	"talks":          2,
	"accord":         2,
}
var tradeP = map[string]int{
	"trade deficit":                         10,
	"trade surplus":                         10,
	"free trade":                            10,
	"trade talks":                           10,
	"import restrictions":                   9,
	"export subsidies":                      9,
	"trade pact":                            8,
	"trade bill":                            8,
	"market access":                         7,
	"countervailing duties":                 10,
	"trade barriers":                        9,
	"general agreement on tariffs and trade": 12,
}

var crudeW = map[string]int{
	"crude":       8,
	"opec":        10,
	"barrel":      6,
	"barrels":     6,
	"petroleum":   7,
	"refinery":    7,
	"refineries":  7,
	"gasoline":    5,
	"naphtha":     6,
	"distillate":  6,
	"kerosene":    5,
	"bpd":         7,
	"petrol":      5,
	"oil":         3,
	"offshore":    5,
	"drilling":    5,
	"wellhead":    5,
	"brent":       6,
	"saudi":       4,
	"kuwait":      4,
	"venezuela":   4,
	"iran":        4,
	"iraq":        4,
	"emirates":    4,
	"uae":         4,
	"texaco":      4,
	"exxon":       4,
	"chevron":     4,
	"amoco":       4,
	"petrocanada": 5,
	"petrobras":   5,
}
var crudeP = map[string]int{
	"crude oil":      9,
	"north sea":      6,
	"heating oil":    7,
	"fuel oil":       6,
	"spot crude":     8,
	"oil output":     6,
	"oil production": 6,
	"oil minister":   6,
	"oil prices":     5,
	"saudi arabia":   5,
	"barrels per day": 8,
}

var grainW = map[string]int{
	"grain":     8,
	"wheat":     8,
	"corn":      8,
	"maize":     7,
	"soybean":   8,
	"soybeans":  8,
	"soymeal":   8,
	"soyoil":    8,
	"soy":       4,
	"sorghum":   7,
	"bushel":    7,
	"bushels":   7,
	"harvest":   5,
	"crop":      5,
	"crops":     5,
	"acreage":   6,
	"planted":   5,
	"planting":  5,
	"farmers":   4,
	"usda":      9,
	"feedgrain": 8,
	"oats":      7,
	"barley":    7,
	"rye":       7,
	"rice":      6,
	"flour":     4,
}
var grainP = map[string]int{
	"soybean meal":  9,
	"soybean oil":   9,
	"winter wheat":  9,
	"spring wheat":  9,
	"corn crop":     8,
	"grain stocks":  8,
	"crop year":     7,
	"farm program":  6,
	"feed grains":   7,
	"hard red winter": 10,
}

var earnW = map[string]int{
	"earnings":  10,
	"earning":   10,
	"profit":    8,
	"profits":   8,
	"loss":      8,
	"losses":    8,
	"shr":       11,
	"qtr":       11,
	"quarter":   5,
	"revs":      10,
	"oper":      7,
	"cts":       8,
	"dividend":  8,
	"dividends": 8,
	"fiscal":    6,
}
var earnP = map[string]int{
	"per share":       10,
	"net income":      9,
	"net loss":        9,
	"operating profit": 9,
	"first quarter":   7,
	"second quarter":  7,
	"third quarter":   7,
	"fourth quarter":  7,
}

var acqW = map[string]int{
	"acquisition":  10,
	"acquisitions": 10,
	"acquire":      10,
	"acquires":     10,
	"acquired":     10,
	"takeover":     9,
	"takeovers":    9,
	"merger":       9,
	"mergers":      9,
	"merge":        9,
	"merged":       9,
	"buyout":       9,
	"tender":       8,
	"stake":        6,
}
var acqP = map[string]int{
	"tender offer":    11,
	"agreed to buy":   10,
	"agrees to buy":   10,
	"agreed to acquire": 11,
	"acquisition of":  9,
	"stake in":        8,
	"merger talks":    9,
	"buyout offer":    10,
}

var moneyW = map[string]int{
	"currency":     9,
	"currencies":   9,
	"yen":          9,
	"sterling":     9,
	"forex":        10,
	"intervention": 9,
	"parity":       8,
	"dealer":       8,
	"dealers":      8,
	"bundesbank":   10,
	"monetary":     7,
	"mark":         7,
	"marks":        7,
	"dollar":       3,
	"dollars":      3,
	"franc":        7,
	"francs":       7,
	"exchange":     6,
	"exchanges":    6,
}
var moneyP = map[string]int{
	"money market":         11,
	"foreign exchange":     11,
	"exchange rate":        10,
	"bank of japan":        10,
	"federal reserve":      10,
	"central bank":         9,
	"dollar yen":           9,
	"currency intervention": 11,
}

func extract(s string) (map[string]int, string) {
	var b strings.Builder
	b.Grow(len(s))
	lastSpace := true
	for _, r := range s {
		if unicode.IsLetter(r) || unicode.IsDigit(r) {
			b.WriteRune(unicode.ToLower(r))
			lastSpace = false
		} else if !lastSpace {
			b.WriteByte(' ')
			lastSpace = true
		}
	}
	words := strings.Fields(b.String())
	freq := make(map[string]int, len(words))
	for _, w := range words {
		freq[w]++
	}
	if len(words) == 0 {
		return freq, " "
	}
	return freq, " " + strings.Join(words, " ") + " "
}

func score(freq map[string]int, norm string, w map[string]int, p map[string]int) int {
	s := 0
	for k, v := range w {
		s += freq[k] * v
	}
	for k, v := range p {
		s += strings.Count(norm, " "+k+" ") * v
	}
	return s
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	parts := strings.SplitN(string(data), "\n", 3)
	title := ""
	body := ""
	if len(parts) >= 2 {
		title = parts[1]
	}
	if len(parts) == 3 {
		body = parts[2]
	}

	tf, tn := extract(title)
	bf, bn := extract(body)

	sc := func(w map[string]int, p map[string]int) int {
		return score(bf, bn, w, p) + 2*score(tf, tn, w, p)
	}

	t := sc(tradeW, tradeP)
	c := sc(crudeW, crudeP)
	g := sc(grainW, grainP)
	e := sc(earnW, earnP)
	a := sc(acqW, acqP)
	m := sc(moneyW, moneyP)

	mx := c
	if g > mx {
		mx = g
	}
	if e > mx {
		mx = e
	}
	if a > mx {
		mx = a
	}
	if m > mx {
		mx = m
	}

	ans := 1
	if t >= mx && t > 0 {
		ans = 3
	} else if c+g >= a+e+m {
		if g > c {
			ans = 2
		} else {
			ans = 1
		}
	} else {
		if a >= e && a >= m {
			ans = 1
		} else {
			ans = 2
		}
	}

	fmt.Print(ans)
}