View difference between Paste ID: V3Y04Uha and QSyy5uBG
SHOW: | | - or go back to the newest paste.
1
// map.go
2
package main
3
4
import (
5
	"bytes"
6
	"fmt"
7
	"strconv"
8
9
	"github.com/alphadose/haxmap"
10-
type MSD map[string]float64
10+
11
12
const MAX_DATA = 12000000
13
14
var i2ch []byte
15
16
func init() {
17
	i2ch = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'B', 'c', 'D', 'e', 'F'}
18
}
19
func get_first_digit(d float64) int {
20
	for d > 10 {
21
		d /= 10
22
	}
23
	return int(d)
24
}
25
func to_rhex(v int) string {
26
	hex := bytes.Buffer{}
27
	for v > 0 {
28
		hex.WriteByte(i2ch[v%16])
29
		v /= 16
30
	}
31
	return hex.String()
32
}
33-
func set_or_inc(m map[string]float64, key string, set, inc int, ctr *int) {
33+
func set_or_inc(m *haxmap.Map[string, float64], key string, set, inc int, ctr *int) {
34-
	if _, ok := m[key]; !ok {
34+
	if old, ok := m.Get(key); !ok {
35-
		m[key] = float64(set)
35+
		m.Set(key, float64(set))
36
	} else {
37-
		m[key] += float64(inc)
37+
		m.Set(key, old+float64(inc))
38
		*ctr += 1
39
	}
40
}
41
func main() {
42-
	m := MSD{}
42+
	m := haxmap.New[string, float64]()
43
	m.Grow(MAX_DATA)
44
	dup1, dup2, dup3 := 0, 0, 0
45
	for z := MAX_DATA; z > 0; z-- {
46
		val2 := MAX_DATA - z
47
		val3 := MAX_DATA*2 - z
48
		key1 := strconv.Itoa(z)
49
		key2 := strconv.Itoa(val2)
50
		key3 := to_rhex(val3)
51
		set_or_inc(m, key1, z, val2, &dup1)
52
		set_or_inc(m, key2, val2, val3, &dup2)
53
		set_or_inc(m, key3, val3, z, &dup3)
54
	}
55
	fmt.Println(dup1, dup2, dup3)
56-
	for k, v := range m {
56+
57
	m.ForEach(func(k string, v float64) bool {
58
		total += get_first_digit(v)
59
		verify += len(k)
60
		count += 1
61
		return true
62
	})
63
	fmt.Println(total, verify, count)
64
}
65