Upside-down numbers: Difference between revisions

Content added Content deleted
m (Uups ...undo removing header Python)
(Added Go)
Line 29: Line 29:
;* [[oeis:A299539|OEIS:A299539 - Upside-down numbers]]
;* [[oeis:A299539|OEIS:A299539 - Upside-down numbers]]



=={{header|Go}}==
{{trans|Python}}
{{libheader|Go-rcu}}
<syntaxhighlight lang="go">package main

import (
"fmt"
"rcu"
)

func genUpsideDown(limit int) chan int {
ch := make(chan int)
wrappings := [][2]int{
{1, 9}, {2, 8}, {3, 7}, {4, 6}, {5, 5},
{6, 4}, {7, 3}, {8, 2}, {9, 1},
}
evens := []int{19, 28, 37, 46, 55, 64, 73, 82, 91}
odds := []int{5}
oddIndex := 0
evenIndex := 0
ndigits := 1
pow := 100
count := 0
go func() {
for count < limit {
if ndigits%2 == 1 {
if len(odds) > oddIndex {
ch <- odds[oddIndex]
count++
oddIndex++
} else {
// build next odds, but switch to evens
var nextOdds []int
for _, w := range wrappings {
for _, i := range odds {
nextOdds = append(nextOdds, w[0]*pow+i*10+w[1])
}
}
odds = nextOdds
ndigits++
pow *= 10
oddIndex = 0
}
} else {
if len(evens) > evenIndex {
ch <- evens[evenIndex]
count++
evenIndex++
} else {
// build next evens, but switch to odds
var nextEvens []int
for _, w := range wrappings {
for _, i := range evens {
nextEvens = append(nextEvens, w[0]*pow+i*10+w[1])
}
}
evens = nextEvens
ndigits++
pow *= 10
evenIndex = 0
}
}
}
close(ch)
}()
return ch
}

func main() {
const limit = 50_000_000
count := 0
var ud50s []int
pow := 50
for n := range genUpsideDown(limit) {
count++
if count < 50 {
ud50s = append(ud50s, n)
} else if count == 50 {
ud50s = append(ud50s, n)
fmt.Println("First 50 upside down numbers:")
rcu.PrintTable(ud50s, 10, 5, true)
fmt.Println()
pow = 500
} else if count == pow {
fmt.Printf("%sth : %s\n", rcu.Commatize(pow), rcu.Commatize(n))
pow *= 10
}
}
}</syntaxhighlight>

{{out}}
<pre>
First 50 upside down numbers:
5 19 28 37 46 55 64 73 82 91
159 258 357 456 555 654 753 852 951 1,199
1,289 1,379 1,469 1,559 1,649 1,739 1,829 1,919 2,198 2,288
2,378 2,468 2,558 2,648 2,738 2,828 2,918 3,197 3,287 3,377
3,467 3,557 3,647 3,737 3,827 3,917 4,196 4,286 4,376 4,466

500th : 494,616
5,000th : 56,546,545
50,000th : 6,441,469,664
500,000th : 729,664,644,183
5,000,000th : 82,485,246,852,682
50,000,000th : 9,285,587,463,255,281
</pre>


=={{header|Pascal}}==
=={{header|Pascal}}==
Line 139: Line 246:
User time: 0.310 s CPU share: 99.30 %
User time: 0.310 s CPU share: 99.30 %
</pre>
</pre>

=={{header|Python}}==
=={{header|Python}}==
<syntaxhighlight lang="python">""" rosettacode.org task Upside-down_numbers """
<syntaxhighlight lang="python">""" rosettacode.org task Upside-down_numbers """