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)
}