Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
110
Task/Esthetic-numbers/Go/esthetic-numbers.go
Normal file
110
Task/Esthetic-numbers/Go/esthetic-numbers.go
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func uabs(a, b uint64) uint64 {
|
||||
if a > b {
|
||||
return a - b
|
||||
}
|
||||
return b - a
|
||||
}
|
||||
|
||||
func isEsthetic(n, b uint64) bool {
|
||||
if n == 0 {
|
||||
return false
|
||||
}
|
||||
i := n % b
|
||||
n /= b
|
||||
for n > 0 {
|
||||
j := n % b
|
||||
if uabs(i, j) != 1 {
|
||||
return false
|
||||
}
|
||||
n /= b
|
||||
i = j
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
var esths []uint64
|
||||
|
||||
func dfs(n, m, i uint64) {
|
||||
if i >= n && i <= m {
|
||||
esths = append(esths, i)
|
||||
}
|
||||
if i == 0 || i > m {
|
||||
return
|
||||
}
|
||||
d := i % 10
|
||||
i1 := i*10 + d - 1
|
||||
i2 := i1 + 2
|
||||
if d == 0 {
|
||||
dfs(n, m, i2)
|
||||
} else if d == 9 {
|
||||
dfs(n, m, i1)
|
||||
} else {
|
||||
dfs(n, m, i1)
|
||||
dfs(n, m, i2)
|
||||
}
|
||||
}
|
||||
|
||||
func listEsths(n, n2, m, m2 uint64, perLine int, all bool) {
|
||||
esths = esths[:0]
|
||||
for i := uint64(0); i < 10; i++ {
|
||||
dfs(n2, m2, i)
|
||||
}
|
||||
le := len(esths)
|
||||
fmt.Printf("Base 10: %s esthetic numbers between %s and %s:\n",
|
||||
commatize(uint64(le)), commatize(n), commatize(m))
|
||||
if all {
|
||||
for c, esth := range esths {
|
||||
fmt.Printf("%d ", esth)
|
||||
if (c+1)%perLine == 0 {
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for i := 0; i < perLine; i++ {
|
||||
fmt.Printf("%d ", esths[i])
|
||||
}
|
||||
fmt.Println("\n............\n")
|
||||
for i := le - perLine; i < le; i++ {
|
||||
fmt.Printf("%d ", esths[i])
|
||||
}
|
||||
}
|
||||
fmt.Println("\n")
|
||||
}
|
||||
|
||||
func commatize(n uint64) string {
|
||||
s := fmt.Sprintf("%d", n)
|
||||
le := len(s)
|
||||
for i := le - 3; i >= 1; i -= 3 {
|
||||
s = s[0:i] + "," + s[i:]
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func main() {
|
||||
for b := uint64(2); b <= 16; b++ {
|
||||
fmt.Printf("Base %d: %dth to %dth esthetic numbers:\n", b, 4*b, 6*b)
|
||||
for n, c := uint64(1), uint64(0); c < 6*b; n++ {
|
||||
if isEsthetic(n, b) {
|
||||
c++
|
||||
if c >= 4*b {
|
||||
fmt.Printf("%s ", strconv.FormatUint(n, int(b)))
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println("\n")
|
||||
}
|
||||
|
||||
// the following all use the obvious range limitations for the numbers in question
|
||||
listEsths(1000, 1010, 9999, 9898, 16, true)
|
||||
listEsths(1e8, 101_010_101, 13*1e7, 123_456_789, 9, true)
|
||||
listEsths(1e11, 101_010_101_010, 13*1e10, 123_456_789_898, 7, false)
|
||||
listEsths(1e14, 101_010_101_010_101, 13*1e13, 123_456_789_898_989, 5, false)
|
||||
listEsths(1e17, 101_010_101_010_101_010, 13*1e16, 123_456_789_898_989_898, 4, false)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue