Undulating numbers: Difference between revisions

From Rosetta Code
Content added Content deleted
(Created a new draft task and added a Wren example.)
 
Line 33: Line 33:
* OEIS sequence [[oeis:A046075|A046075: Non-trivial undulants]]
* OEIS sequence [[oeis:A046075|A046075: Non-trivial undulants]]
<br>
<br>
=={{header|Phix}}==
{{trans|Wren}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">base</span> <span style="color: #008080;">in</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">}</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">600</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">mpow</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">53</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">bsquare</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">base</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">base</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">limit</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">53</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">u3</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> <span style="color: #000000;">u4</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">a</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">u</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">base</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">u</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">base</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">w</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">v</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">base</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">b</span>
<span style="color: #000000;">u3</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">v</span>
<span style="color: #000000;">u4</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">w</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">,</span><span style="color: #000000;">u</span> <span style="color: #008080;">in</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">u3</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%3d"</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">u4</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%4d"</span><span style="color: #0000FF;">}}</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"All %d digit undulating numbers in base %d:\n%s\n"</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">d</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join_by</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fmt</span><span style="color: #0000FF;">:=</span><span style="color: #000000;">u</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">])})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"All 3 digit undulating numbers which are primes in base %d:\n%s\n"</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join_by</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u3</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">is_prime</span><span style="color: #0000FF;">),</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fmt</span><span style="color: #0000FF;">:=</span><span style="color: #008000;">"%3d"</span><span style="color: #0000FF;">)})</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">un</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">u3</span> <span style="color: #0000FF;">&</span> <span style="color: #000000;">u4</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">unc</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">un</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">j</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">while</span> <span style="color: #008080;">not</span> <span style="color: #000000;">done</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">unc</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">u</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">un</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">unc</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">bsquare</span> <span style="color: #0000FF;">+</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">un</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">unc</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">bsquare</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">></span><span style="color: #000000;">limit</span> <span style="color: #008080;">then</span> <span style="color: #000000;">done</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span><span style="color: #0000FF;">;</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">un</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">u</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">j</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The %,d%s undulating number in base %d is: %,d\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">ord</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">un</span><span style="color: #0000FF;">[</span><span style="color: #000000;">n</span><span style="color: #0000FF;">]})</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">10</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"or expressed in base %d : %,a\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">un</span><span style="color: #0000FF;">[</span><span style="color: #000000;">n</span><span style="color: #0000FF;">]}})</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\nTotal number of undulating numbers in base %d &lt; 2^%d = %,d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mpow</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">un</span><span style="color: #0000FF;">)})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"of which the largest is: %,d\n"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">un</span><span style="color: #0000FF;">[$])</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">10</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"or expressed in base %d : %,a\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">un</span><span style="color: #0000FF;">[$]}})</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
Output same as Wren. Note that comma-fill on %a under p2js needs a trivial fix/1.0.3 or later.

=={{header|Wren}}==
=={{header|Wren}}==
{{libheader|Wren-fmt}}
{{libheader|Wren-fmt}}

Revision as of 21:07, 1 June 2023

Undulating numbers is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

An Undulating number in some base is a number which has the digit form ABABAB... where A and B are digits in that base.

For the purposes of this task, we shall only consider a number to be undulating if it has at least 3 digits in a given base and A != B.

Examples

The numbers: 101 and 9898 are undulating numbers in base 10.

The numbers: 50 and 2350 are undulating numbers in base 7 because their base 7 representations are: 101 and 6565 respectively.

Task

For base 10, find and show on this page:

1. All three digit undulating numbers.

2. All four digit undulating numbers.

3. All three digit undulating numbers which are primes.

4. The 600th undulating number.

5. How many undulating numbers are less than 2^53 and the largest such number.

Bonus

Do the same for base 7 expressing the results in base 10 apart from 4. and 5. which should be expressed in base 7 also.

Note that undulating numbers with a given number of digits in base 7 may, of course, have less digits when expressed in base 10 and are unlikely to be still undulating. However, 121 (or 232 in base 7) is an exception to this.

References


Phix

Translation of: Wren
with javascript_semantics
for base in {10,7} do
    integer n = 600, mpow = 53, bsquare = base * base
    atom limit = power(2,53)-1
    sequence u3 = {}, u4 = {}
    for a=1 to base-1 do
        for b=0 to base-1 do
            if b!=a then
                integer u = a * base + b,
                        v = u * base + a,
                        w = v * base + b
                u3 &= v
                u4 &= w
            end if
        end for
    end for
    for d,u in {{u3,"%3d"},{u4,"%4d"}} do
        printf(1,"All %d digit undulating numbers in base %d:\n%s\n",
                  {d+2,base,join_by(u[1],1,9,"  ",fmt:=u[2])})
    end for
    printf(1,"All 3 digit undulating numbers which are primes in base %d:\n%s\n",
             {base,join_by(filter(u3,is_prime),1,10,"  ",fmt:="%3d")})
    sequence un = u3 & u4
    integer unc = length(un), j = 0, done = false
    while not done do
       for i=1 to unc do
           atom u = un[j * unc + i] * bsquare + remainder(un[j * unc + i],bsquare)
           if u>limit then done = true; exit end if
           un &= u
       end for
       j += 1
    end while
    printf(1,"The %,d%s undulating number in base %d is: %,d\n", {n,ord(n),base,un[n]})
    if base!=10 then printf(1,"or expressed in base %d : %,a\n", {base,{base,un[n]}}) end if
    printf(1,"\nTotal number of undulating numbers in base %d < 2^%d = %,d\n",{base,mpow,length(un)})
    printf(1,"of which the largest is: %,d\n", un[$])
    if base!=10 then printf(1,"or expressed in base %d : %,a\n", {base,{base,un[$]}}) end if
    printf(1,"\n")
end for

Output same as Wren. Note that comma-fill on %a under p2js needs a trivial fix/1.0.3 or later.

Wren

Library: Wren-fmt
Library: Wren-math
import "./fmt" for Fmt, Conv
import "./math" for Int

var undulating = Fn.new { |base, n|
    var mpow = 53
    var limit = 2.pow(mpow) - 1
    var u3 = []
    var u4 = []
    var bsquare = base * base
    for (a in 1...base) {
        for (b in 0...base) {
            if (b == a) continue
            var u = a * bsquare + b * base + a
            u3.add(u)
            var v = a * base + b
            u4.add(v * bsquare + v)
        }
    }
    System.print("All 3 digit undulating numbers in base %(base):")
    Fmt.tprint("$3d ", u3, 9)
    System.print("\nAll 4 digit undulating numbers in base %(base):")
    Fmt.tprint("$4d ", u4, 9)
    System.print("\nAll 3 digit undulating numbers which are primes in base %(base):")
    var primes = []
    for (u in u3) {
        if (u % 2 == 1 && u % 5 != 0 && Int.isPrime(u)) primes.add(u)
    }
    Fmt.tprint("$3d ", primes, 10)
    var un = u3 + u4
    var unc = un.count
    var j = 0
    var done = false
    while (true) {
       for (i in 0...unc) {
           var u = un[j * unc + i] * bsquare + un[j * unc + i] % bsquare
           if (u > limit) {
                done = true
                break
           }
           un.add(u)
       }
       if (done) break
       j = j + 1
    }
    Fmt.print("\nThe $,r undulating number in base $d is: $,d", n, base, un[n-1])
    if (base != 10) Fmt.print("or expressed in base $d : $,s", base, Conv.itoa(un[n-1], base))
    Fmt.print("\nTotal number of undulating numbers in base $d < 2$S = $,d", base, mpow, un.count)
    Fmt.print("of which the largest is: $,d", un[-1])
    if (base != 10) Fmt.print("or expressed in base $d : $,s", base, Conv.itoa(un[-1], base))
    System.print()
}

for (base in [10, 7]) undulating.call(base, 600)
Output:
All 3 digit undulating numbers in base 10:
101  121  131  141  151  161  171  181  191 
202  212  232  242  252  262  272  282  292 
303  313  323  343  353  363  373  383  393 
404  414  424  434  454  464  474  484  494 
505  515  525  535  545  565  575  585  595 
606  616  626  636  646  656  676  686  696 
707  717  727  737  747  757  767  787  797 
808  818  828  838  848  858  868  878  898 
909  919  929  939  949  959  969  979  989 

All 4 digit undulating numbers in base 10:
1010  1212  1313  1414  1515  1616  1717  1818  1919 
2020  2121  2323  2424  2525  2626  2727  2828  2929 
3030  3131  3232  3434  3535  3636  3737  3838  3939 
4040  4141  4242  4343  4545  4646  4747  4848  4949 
5050  5151  5252  5353  5454  5656  5757  5858  5959 
6060  6161  6262  6363  6464  6565  6767  6868  6969 
7070  7171  7272  7373  7474  7575  7676  7878  7979 
8080  8181  8282  8383  8484  8585  8686  8787  8989 
9090  9191  9292  9393  9494  9595  9696  9797  9898 

All 3 digit undulating numbers which are primes in base 10:
101  131  151  181  191  313  353  373  383  727 
757  787  797  919  929 

The 600th undulating number in base 10 is: 4,646,464,646

Total number of undulating numbers in base 10 < 2⁵³ = 1,125
of which the largest is: 8,989,898,989,898,989

All 3 digit undulating numbers in base 7:
 50   64   71   78   85   92  100  107  121 
128  135  142  150  157  164  178  185  192 
200  207  214  221  235  242  250  257  264 
271  278  292  300  307  314  321  328  335 

All 4 digit undulating numbers in base 7:
 350   450   500   550   600   650   700   750   850 
 900   950  1000  1050  1100  1150  1250  1300  1350 
1400  1450  1500  1550  1650  1700  1750  1800  1850 
1900  1950  2050  2100  2150  2200  2250  2300  2350 

All 3 digit undulating numbers which are primes in base 7:
 71  107  157  257  271  307 

The 600th undulating number in base 7 is: 8,074,217,422,972,642
or expressed in base 7 : 4,646,464,646,464,646,464

Total number of undulating numbers in base 7 < 2⁵³ = 603
of which the largest is: 8,786,648,372,058,464
or expressed in base 7 : 5,252,525,252,525,252,525