Hofstadter Figure-Figure sequences: Difference between revisions
Content added Content deleted
(Added EchoLisp) |
m (→version 1: added/changed whitespace and comments and the link, changed a variable's name.) |
||
Line 1,672: | Line 1,672: | ||
Over a third of the program was for verification of the first thousand numbers in the Hofstadter Figure-Figure sequences. |
Over a third of the program was for verification of the first thousand numbers in the Hofstadter Figure-Figure sequences. |
||
<lang rexx>/*REXX |
<lang rexx>/*REXX program calculates and verifies the Hofstadter Figure─Figure sequences.*/ |
||
parse arg x |
parse arg x top bot . /*obtain optional arguments from the CL*/ |
||
if x=='' |
if x=='' | x==',' then x= 10 /*Not specified? Then use the default.*/ |
||
if |
if top=='' | top==',' then top=1000 /* " " " " " " */ |
||
if bot=='' | bot==',' then bot= 40 /* " " " " " " */ |
|||
low=1; if x<0 then low=abs(x) /*only display a single │X│ value? */ |
|||
r.=0; r.1=1; rr.=r.; rr.1=1; s.=r.; s.1=2 /*initialize the R RR S arrays.*/ |
|||
errs=0; $.=0 |
errs=0; $.=0 |
||
do i=low to abs(x) /* |
do i=low to abs(x) /*display the 1st X values of R & S.*/ |
||
say right('R('i") =",20) right(ffr(i),7), |
say right('R('i") =", 20) right(ffr(i), 7), |
||
right('S('i") =",20) right(ffs(i),7) |
right('S('i") =", 20) right(ffs(i), 7) |
||
end /*i*/ |
end /*i*/ |
||
if x<1 then exit |
if x<1 then exit |
||
do m=1 for bot; r=ffr(m); $.r=1 |
|||
⚫ | |||
do |
do n=1 for top-bot; s=ffs(n) |
||
if $.s then call ser 'duplicate number in R and S lists:' s; $.s=1 |
|||
end /*n*/ /* [↑] calculate the 1st 960 S values.*/ |
|||
do v=1 for top |
|||
@='duplicate number in R and S lists:' /* [↓] calc. 1st 960 S values.*/ |
|||
if \$.v then call ser 'missing R │ S:' v |
|||
end /*v*/ /* [↑] are all 1≤ numbers ≤1k present?*/ |
|||
⚫ | |||
do v=1 for high; if \$.v then call sErr 'missing R │ S:' v; end |
|||
say |
say |
||
if errs==0 then say 'verification completed for all numbers from 1 ──►' |
if errs==0 then say 'verification completed for all numbers from 1 ──►' top " [inclusive]." |
||
else say 'verification failed with' errs "errors." |
else say 'verification failed with' errs "errors." |
||
exit /*stick a fork in it, we're done.*/ |
exit /*stick a fork in it, we're done.*/ |
||
/*────────────────────────────────────────────────────────────────────────────*/ |
|||
/*──────────────────────────────────FFR subroutine──────────────────────*/ |
|||
ffr: procedure expose r. s. rr.; |
ffr: procedure expose r. s. rr.; parse arg n /*obtain the number from the arg.*/ |
||
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 & FFS values.*/ |
_=ffr(n-1) + ffs(n-1) /*calculate the FFR & FFS values.*/ |
||
r.n=_; rr._=1; return _ /*assign value to R & RR; return.*/ |
r.n=_; rr._=1; return _ /*assign value to R & RR; return.*/ |
||
/*────────────────────────────────────────────────────────────────────────────*/ |
|||
/*──────────────────────────────────FFS subroutine──────────────────────*/ |
|||
ffs: procedure expose r. s. rr.; parse arg n |
ffs: procedure expose r. s. rr.; parse arg n /*search for ¬null R or S number.*/ |
||
if s.n==0 then |
if s.n==0 then do k=1 for n /* [↓] 1st IF is a SHORT CIRCUIT*/ |
||
if s.k\==0 then if r.k\==0 then iterate |
if s.k\==0 then if r.k\==0 then iterate |
||
call ffr k /*define R.k via FFR subroutine*/ |
call ffr k /*define R.k via FFR subroutine*/ |
||
km=k-1; _=s.km+1 /*the next S number, possibly. |
km=k-1; _=s.km+1 /*the next S number, possibly.*/ |
||
_=_+rr._; s.k=_ /*define an element of S array.*/ |
_=_+rr._; s.k=_ /*define an element of S array.*/ |
||
end /*k*/ |
|||
return s.n /*return |
return s.n /*return S.n value to the invoker*/ |
||
/*────────────────────────────────────────────────────────────────────────────*/ |
|||
/*──────────────────────────────────SERR subroutine─────────────────────*/ |
|||
ser: errs=errs+1; say '***error***!' arg(1); return</lang> |
|||
To see the talk section about this REXX program's timings, click here: [http://rosettacode.org/wiki/Talk:Hofstadter_Figure-Figure_sequences#timings_for_the_REXX_solutions]. <br> |
To see the talk section about this REXX program's timings, click here: [http://rosettacode.org/wiki/Talk:Hofstadter_Figure-Figure_sequences#timings_for_the_REXX_solutions timings for the REXX solutions]. <br> |
||
'''output''' when using the |
'''output''' when using the default inputs: |
||
<pre> |
<pre> |
||
R(1) = 1 S(1) = 2 |
R(1) = 1 S(1) = 2 |