Talk:Hofstadter Figure-Figure sequences: Difference between revisions

Content added Content deleted
m (→‎timings for the REXX solutions: removed STYLE from the PRE html tag.)
m (→‎timings for the REXX solutions: replaced the REXX program, updated the timings.)
Line 34: Line 34:


I normally don't including timings for the REXX solutions that I post, but when I saw the 2<sup>nd</sup> REXX example's timings,
I normally don't including timings for the REXX solutions that I post, but when I saw the 2<sup>nd</sup> REXX example's timings,

<br>I decided to go back and include the timings here as the 2<sup>nd</sup> example's timings seemed a bit high.
I decided to go back and include the timings here as the 2<sup>nd</sup> example's timings seemed a bit high.
<br><br>I didn't expect a difference of magnitude.

<lang rexx>/*REXX pgm to calculate & verify the Hofstadter Figure-Figure sequences.*/
<br>I didn't expect a difference of magnitude.
<lang rexx>/*REXX pgm calculates & verifies the Hofstadter Figure-Figure sequences.*/
call time 'Reset'
call time 'Reset'
parse arg x highV . /*obtain any C.L. specifications.*/
parse arg x high bot . /*obtain any C.L. specifications.*/
if x=='' then x=10; if highV=='' then highV=1000 /*use the defaults?*/
if x=='' then x=10; if high=='' then high=1000 /*use the defaults?*/
low=1 /*use unity as the starting point*/
if bot=='' then bot=40 /* " " " */
if x<0 then low=abs(x) /*only show a single │X│ value.*/
low=1; if x<0 then low=abs(x) /*only show a single │X│ value.*/
r.=0; r.1=1; rr.=r.; rr.1=1 /*initialize the R and RR arrays.*/
r.=0; r.1=1; rr.=r.; rr.1=1 /*initialize the R & RR arrays.*/
s.=0; s.1=2; ss.=s.; ss.2=1 /* " " S " SS " .*/
s.=0; s.1=2 /* " " S array. */
errs=0
errs=0; $.=0
do i=low to abs(x) /*show first X values of R & S */
do i=low to abs(x) /*show first X values of R & S */
say right('R('i") =",20) right(ffr(i),7), /*show nice*/
say right('R('i") =",20) right(ffr(i),7), /*show nice*/
right('S('i") =",20) right(ffs(i),7) /* R & S */
right('S('i") =",20) right(ffs(i),7) /* R & S */
end /*i*/
end /*i*/
if x<1 then exit /*if x 0, then we're all done.*/

do m=1 for bot; r=ffr(m); $.r=1; end /*calculate 1st 40 R values.*/

@='duplicate number in R and S lists:' /* [↓] calc. 1st 960 S values.*/
do n=1 for high-bot; s=ffs(n); if $.s then call sErr @ s; $.s=1; end

/* [↓] verify all 1≤#≤1k present*/
do v=1 for high; if \$.v then call sErr 'missing R │ S:' v; end
say 'took' format(time('Elapsed'),,2) "seconds."
say 'took' format(time('Elapsed'),,2) "seconds."
if x<1 then exit /*stick a fork in it, we're done.*/
/*═══════════════════════════════════════verify 1st 1k: unique & present*/
both.=0 /*initialize the BOTH array. */
/*build list of 1st 40 R values.*/
do m=1 for 40; r=ffr(m) /*calculate 1st 40 R values.*/
both.r=1 /*build the BOTH array. */
end /*m*/
/*build list of 1st 960 S values.*/
do n=1 for 960; s=ffs(n) /*calculate 1st 960 S values.*/
if both.s then call sayErr 'duplicate number in R and S lists:' s
both.s=1 /*add to the BOTH array. */
end /*n*/
/*verify presence and uniqueness.*/
do v=1 for highV /*verify all 1 ≤ # ≤ 1k present.*/
if \both.v then call sayErr 'missing R │ S:' v
end /*v*/
say
say
@v='verification'; @i=" [inclusive]." /*shortcuts to shorten prog width*/
if errs==0 then say 'verification completed for all numbers from 1 ──►' high " [inclusive]."
else say 'verification failed with' errs "errors."
if errs==0 then say @v 'completed for all numbers from 1 ──►' highV @i
else say @v 'failed with' errs "errors."
say 'took' format(time('E'),,2) "seconds."
exit /*stick a fork in it, we're done.*/
exit /*stick a fork in it, we're done.*/
/*──────────────────────────────────FFR subroutine──────────────────────*/
/*──────────────────────────────────FFR subroutine──────────────────────*/
ffr: procedure expose r. s. rr. ss.; parse arg n
ffr: procedure expose r. s. rr.; parse arg n
if r.n\==0 then return r.n /*Defined? Then return the value.*/
if r.n\==0 then return r.n /*Defined? Then return the value.*/
_=ffr(n-1) + ffs(n-1) /*calculate the FFR value. */
_=ffr(n-1) + ffs(n-1) /*calculate the FFR value. */
r.n=_; rr._=1 /*assign the value to R and RR.*/
r.n=_; rr._=1; return _ /*assign value to R & RR; return.*/
return _ /*return the value to the invoker*/
/*──────────────────────────────────FFS subroutine──────────────────────*/
/*──────────────────────────────────FFS subroutine──────────────────────*/
ffs: procedure expose r. s. rr. ss.; parse arg n
ffs: procedure expose r. s. rr.; parse arg n /*search for ¬null R│S #.*/
do k=1 for n while s.n==0 /*search for not null R S num.*/
if s.n==0 then do k=1 for n /* [↓] 1st IF is a short circuit*/
if s.k\==0 then if ffr(k)\==0 then iterate /*short circuit*/
if s.k\==0 then if ffr(k)\==0 then iterate
km=k-1; _=s.km+1 /*the next SS number, possibly.*/
km=k-1; _=s.km+1 /*the next SS number, possibly.*/
_=_+rr._ /*maybe adjust for the FRR num.*/
_=_+rr._; s.k=_ /*define an element of S array.*/
s.k=_; ss._=1 /*define couple of FFS numbers.*/
end /*k*/
end /*k*/
return s.n /*return the value to the invoker*/
/*──────────────────────────────────SERR subroutine─────────────────────*/
return s.n /*return the value to the invoker*/
sErr: errs=errs+1; say '***error***!' arg(1); return</lang>
/*──────────────────────────────────SAYERR subroutine───────────────────*/
sayErr: errs=errs+1; say; say '***error***!'; say; say arg(1); say; return</lang>
'''output''' when using the defaults:
'''output''' when using the defaults:
<pre>
<pre>
Line 104: Line 95:


verification completed for all numbers from 1 ──► 1000 [inclusive].
verification completed for all numbers from 1 ──► 1000 [inclusive].
took 1.58 seconds.
took 1.52 seconds.
</pre>
</pre>
The (above) example was run under Windows 7 on a HP box (3.2GHz) using Regina.
The (above) example was run under Windows 7 on a HP box (3.2GHz) using Regina.