Numbers with prime digits whose sum is 13/Phix: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Phix}}: added syntax colouring the hard way)
m (→‎{{header|Phix}}: use pygments)
 
Line 2: Line 2:


I decided to keep the main entry simple, and archived this OTT version here:
I decided to keep the main entry simple, and archived this OTT version here:
<!--<lang Phix>(phixonline)-->
<!--(phixonline)-->
<syntaxhighlight lang="Phix">
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
with javascript_semantics
<span style="color: #008080;">function</span> <span style="color: #000000;">unlucky</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">set</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">needed</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">mult</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">={})</span>
function unlucky(sequence set, integer needed, atom mult=1, v=0, sequence res={})
<span style="color: #008080;">if</span> <span style="color: #000000;">needed</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
if needed=0 then
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
res = append(res,v)
<span style="color: #008080;">elsif</span> <span style="color: #000000;">needed</span><span style="color: #0000FF;">></span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
elsif needed>0 then
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">set</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
for i=length(set) to 1 by -1 do
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">unlucky</span><span style="color: #0000FF;">(</span><span style="color: #000000;">set</span><span style="color: #0000FF;">,</span><span style="color: #000000;">needed</span><span style="color: #0000FF;">-</span><span style="color: #000000;">set</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">mult</span><span style="color: #0000FF;">*</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">+</span><span style="color: #000000;">set</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">mult</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span>
res = unlucky(set,needed-set[i],mult*10,v+set[i]*mult,res)
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
return res
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
end function
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">6</span> <span style="color: #008080;">to</span> <span style="color: #000000;">6</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (see below)</span>
for i=6 to 6 do -- (see below)
<span style="color: #004080;">integer</span> <span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
integer p = get_prime(i)
<span style="color: #004080;">sequence</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">unlucky</span><span style="color: #0000FF;">({</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">},</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)),</span>
sequence r = sort(unlucky({2,3,5,7},p)),
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"numbers"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">))</span>
s = deep_copy(shorten(r,"numbers",3))
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">),</span>
integer l = length(s),
<span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">l</span><span style="color: #0000FF;"><</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (ie shortened?)</span>
m = l<length(r) -- (ie shortened?)
<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;">to</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">-</span><span style="color: #000000;">m</span> <span style="color: #008080;">do</span>
for j=1 to l-m do
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]!=</span><span style="color: #008000;">"..."</span> <span style="color: #008080;">then</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if s[j]!="..." then s[j] = sprintf("%d",s[j]) end if
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<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;">"Prime_digit-only numbers summing to %d: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)})</span>
printf(1,"Prime_digit-only numbers summing to %d: %s\n",{p,join(s)})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<!--</lang>-->
</syntaxhighlight>
Originally I thought I wouldn't need to sort the output of unlucky(), but it generates all numbers ending in 7 first, and alas (eg) 355 < 2227, not that it hurts any.
Originally I thought I wouldn't need to sort the output of unlucky(), but it generates all numbers ending in 7 first, and alas (eg) 355 < 2227, not that it hurts any.
{{out}}
{{out}}
Line 51: Line 52:
Based on the algorthim suggested by Nigel Galloway on the [[Talk:Numbers_with_prime_digits_whose_sum_is_13|Talk page]]<br>
Based on the algorthim suggested by Nigel Galloway on the [[Talk:Numbers_with_prime_digits_whose_sum_is_13|Talk page]]<br>
I am tempted to replace my original, as this is a bit cleaner and does not require a sort, but it is longer...
I am tempted to replace my original, as this is a bit cleaner and does not require a sort, but it is longer...
<syntaxhighlight lang="Phix">
<!--<lang Phix>(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
with javascript_semantics
constant digits = {2,3,5,7}
<span style="color: #008080;">constant</span> <span style="color: #000000;">digits</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">}</span>
function unlucky(sequence part)
<span style="color: #008080;">function</span> <span style="color: #000000;">unlucky</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">part</span><span style="color: #0000FF;">)</span>
sequence res={}, next={}
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">={},</span> <span style="color: #000000;">next</span><span style="color: #0000FF;">={}</span>
for p=1 to length(part) do
<span style="color: #008080;">for</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">part</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
integer {v,s} = part[p]
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">v</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">part</span><span style="color: #0000FF;">[</span><span style="color: #000000;">p</span><span style="color: #0000FF;">]</span>
for i=1 to length(digits) do
<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: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">digits</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
integer d = digits[i],
<span style="color: #004080;">integer</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">digits</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span>
sn = d+s,
<span style="color: #000000;">sn</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">+</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span>
nv = v*10+d
<span style="color: #000000;">nv</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">*</span><span style="color: #000000;">10</span><span style="color: #0000FF;">+</span><span style="color: #000000;">d</span>
if sn=13 then
<span style="color: #008080;">if</span> <span style="color: #000000;">sn</span><span style="color: #0000FF;">=</span><span style="color: #000000;">13</span> <span style="color: #008080;">then</span>
res &= nv
<span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">nv</span>
elsif sn<=11 then
<span style="color: #008080;">elsif</span> <span style="color: #000000;">sn</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">11</span> <span style="color: #008080;">then</span>
next &= {{nv,sn}}
<span style="color: #000000;">next</span> <span style="color: #0000FF;">&=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">nv</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sn</span><span style="color: #0000FF;">}}</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
if length(next) then res &= unlucky(next) end if
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">next</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">unlucky</span><span style="color: #0000FF;">(</span><span style="color: #000000;">next</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return res
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
pp(unlucky({{0,0}}),{pp_IntFmt,"%7d"})
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">unlucky</span><span style="color: #0000FF;">({{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}}),{</span><span style="color: #004600;">pp_IntFmt</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%7d"</span><span style="color: #0000FF;">})</span>
</syntaxhighlight>
<!--</lang>-->
<pre>
<pre>
{ 337, 355, 373, 535, 553, 733, 2227, 2272, 2335,
{ 337, 355, 373, 535, 553, 733, 2227, 2272, 2335,

Latest revision as of 18:19, 5 February 2024

Extended Phix version of Numbers_with_prime_digits_whose_sum_is_13#Phix.

I decided to keep the main entry simple, and archived this OTT version here:

with javascript_semantics
function unlucky(sequence set, integer needed, atom mult=1, v=0, sequence res={})
    if needed=0 then
        res = append(res,v)
    elsif needed>0 then
        for i=length(set) to 1 by -1 do
            res = unlucky(set,needed-set[i],mult*10,v+set[i]*mult,res)
        end for
    end if
    return res
end function            
 
for i=6 to 6 do -- (see below)
    integer p = get_prime(i)
    sequence r = sort(unlucky({2,3,5,7},p)),
             s = deep_copy(shorten(r,"numbers",3))
    integer l = length(s),
            m = l<length(r) -- (ie shortened?)
    for j=1 to l-m do
        if s[j]!="..." then s[j] = sprintf("%d",s[j]) end if
    end for
    printf(1,"Prime_digit-only numbers summing to %d: %s\n",{p,join(s)})
end for

Originally I thought I wouldn't need to sort the output of unlucky(), but it generates all numbers ending in 7 first, and alas (eg) 355 < 2227, not that it hurts any.

Output:
Prime_digit-only numbers summing to 13: 337 355 373 ... 223222 232222 322222  (43 numbers)

With "for i=1 to 11" you get:

Prime_digit-only numbers summing to 2: 2
Prime_digit-only numbers summing to 3: 3
Prime_digit-only numbers summing to 5: 5 23 32
Prime_digit-only numbers summing to 7: 7 25 52 223 232 322
Prime_digit-only numbers summing to 11: 227 272 335 ... 22322 23222 32222  (19 numbers)
Prime_digit-only numbers summing to 13: 337 355 373 ... 223222 232222 322222  (43 numbers)
Prime_digit-only numbers summing to 17: 377 557 575 ... 22322222 23222222 32222222  (221 numbers)
Prime_digit-only numbers summing to 19: 577 757 775 ... 223222222 232222222 322222222  (468 numbers)
Prime_digit-only numbers summing to 23: 2777 7277 7727 ... 22322222222 23222222222 32222222222  (2,098 numbers)
Prime_digit-only numbers summing to 29: 35777 37577 37757 ... 22322222222222 23222222222222 32222222222222  (21,049 numbers)
Prime_digit-only numbers summing to 31: 37777 55777 57577 ... 223222222222222 232222222222222 322222222222222  (45,148 numbers)

Note that the largest sum-to-37, 322222222222222222, being as it is 18 digits long, exceeds the capacity of a 64-bit float.

Alternative

Based on the algorthim suggested by Nigel Galloway on the Talk page
I am tempted to replace my original, as this is a bit cleaner and does not require a sort, but it is longer...

with javascript_semantics
constant digits = {2,3,5,7}
function unlucky(sequence part)
    sequence res={}, next={}
    for p=1 to length(part) do
        integer {v,s} = part[p]
        for i=1 to length(digits) do
            integer d = digits[i],
                    sn = d+s,
                    nv = v*10+d
            if sn=13 then
                res &= nv
            elsif sn<=11 then
                next &= {{nv,sn}}
            end if
        end for
    end for
    if length(next) then res &= unlucky(next) end if
    return res
end function
 
pp(unlucky({{0,0}}),{pp_IntFmt,"%7d"})
{    337,    355,    373,    535,    553,    733,   2227,   2272,   2335,
    2353,   2533,   2722,   3235,   3253,   3325,   3352,   3523,   3532,
    5233,   5323,   5332,   7222,  22225,  22252,  22333,  22522,  23233,
   23323,  23332,  25222,  32233,  32323,  32332,  33223,  33232,  33322,
   52222, 222223, 222232, 222322, 223222, 232222, 322222}