-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproblem38.go
More file actions
71 lines (66 loc) · 1.83 KB
/
Copy pathproblem38.go
File metadata and controls
71 lines (66 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package projecteuler
// given a slice of digits, holding a decimal number,
// this function checks whether number is pandigital
// from digit `frm` through digit `to`
// so number of digits need to ( to-frm+1 )
func isPandigital(num []int, frm int, to int) bool {
if len(num) != to-frm+1 {
return false
}
check := true
buffer := make(map[int]int)
for _, v := range num {
if _, ok := buffer[v]; ok || !(v >= frm && v <= to) {
check = false
break
}
buffer[v] = 1
}
return check
}
// given a slice of numbers, we'll simply split each number
// into its digits, and concatenate them, while maintaining their order
//
// so , {1, 12, 123, 1234} will become {1, 1, 2, 1, 2, 3, 1, 2, 3, 4}
func concatenateNum(num ...int) []int {
buffer := make([]int, 0)
for _, v := range num {
buffer = append(buffer, splitDigits(v)...)
}
return buffer
}
// given a multiplicand & a range of multipliers
// it'll return a slice holding products in order ( ascending in multiplier )
func generateMultiples(multiplicand int, multF int, multT int) []int {
buffer := make([]int, multT-multF+1)
c := 0
for i := multF; i <= multT; i++ {
buffer[c] = multiplicand * i
c++
}
return buffer
}
// PandigitalMultiples - Finds maximum 1 through 9 pandigital
// number that can be obtained by multiplying `X`, with {1, 2, .. , n}, where n > 1
// and concatenating them
func PandigitalMultiples() int {
max := 0
for i := 2; i <= 9876; i++ {
for j := 2; ; j++ {
num := concatenateNum(generateMultiples(i, 1, j)...) // generated concatenated number
if ln := len(num); ln > 9 {
break
} else if ln < 9 {
continue
}
if !isPandigital(num, 1, 9) { // checking whether pandigital or not
break
}
if tmp := numFromDigits(num, 10); max < tmp { // checking whether it has exceeded `max` or not
max = tmp
break
}
}
}
return max
}