Vampire number: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: changed some comments and whitespace.)
m (→‎{{header|REXX}}: used a template for ou tput, optimized the VAMPIRE function.)
Line 2,688: Line 2,688:
_=right(j,1); if j<!._ then iterate /*is number tenable based on last dig? */
_=right(j,1); if j<!._ then iterate /*is number tenable based on last dig? */
f=vampire(j); if f=='' then iterate /*Are fangs null? Yes, not vampire. */
f=vampire(j); if f=='' then iterate /*Are fangs null? Yes, not vampire. */
#=#+1 /*bump the vampire count, Vlad. */
#=# + 1 /*bump the vampire count, Vlad. */
say 'vampire number' right(#,length(N)) "is: " j', fangs=' f
say 'vampire number' right(#,length(N)) "is: " j', fangs=' f
end /*j*/ /* [↑] process a range of numbers. */
end /*j*/ /* [↑] process a range of numbers. */
Line 2,694: Line 2,694:
if f=='' then say N " isn't a vampire number."
if f=='' then say N " isn't a vampire number."
else say N " is a vampire number, fangs=" f
else say N " is a vampire number, fangs=" f
end
end
exit /*stick a fork in it, we're all done. */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
vampire: procedure; parse arg ?,, $. !! bot; L=length(?)
vampire: procedure; parse arg ?,, $. a bot; L=length(?); w=L % 2
if L//2 then return !! /*Is L an odd length? Then ¬vampire.*/
if L//2 then return '' /*Is L an odd length? Then ¬vampire.*/
do k=1 for L; _=substr(?,k,1); $._=$._ || _; end /*k*/
do k=1 for L; _=substr(?,k,1); $._=$._ || _; end /*k*/
do m=0 for 10; bot=bot || $.m; end /*m*/
do m=0 for 10; bot=bot || $.m; end /*m*/
w=L % 2
top=left( reverse(bot), w); bot=left(bot, w) /*determine limits of search*/
top=left( reverse(bot), w); bot=left(bot, w) /*determine limits of search*/
inc=?//2 + 1 /*? is odd? INC=2. No? INC=1*/
inc=?//2 + 1 /*? is odd? INC=2. No? INC=1*/
beg=max(bot, 10**(w-1)); if inc=2 then if beg//2==0 then beg=beg + 1
beg=max(bot, 10**(w-1)); if inc=2 then if beg//2==0 then beg=beg + 1
/* [↑] odd BEG if odd INC*/
/* [↑] odd BEG if odd INC*/
do d=beg to min(top, 10**w - 1) by inc
do d=beg to min(top, 10**w - 1) by inc
if ? // d \==0 then iterate
if ? // d \==0 then iterate /*? not ÷ by D? Then skip,*/
if verify(d, ?) \==0 then iterate
q=? % d; if d>q then iterate /*is D > Q Then skip.*/
q=? % d; if d>q then iterate
if q*d//9 \== (q+d)//9 then iterate /*modulo 9 congruence test. */
if q*d//9 \== (q+d)//9 then iterate /*modulo 9 congruence test. */
if length(q) \==w then iterate /*Len of Q ^= W? Then skip.*/
if verify(q, ?) \==0 then iterate
if right(q, 1) ==0 then if right(d, 1) ==0 then iterate
if right(q, 1) ==0 then if right(d, 1)==0 then iterate
dq=d || q
if length(q) \== w then iterate
t=?; do i=1 for L; p=pos( substr(dq, i, 1), t)
dq=d || q; t=?
if p==0 then iterate d; t=delstr(t, p, 1)
do i=1 for L; p=pos( substr(dq, i, 1), t)
end /*i*/
if p==0 then iterate d; t=delstr(t, p, 1)
a=a '['d"∙"q']'
end /*i*/
end /*d*/
!!=!! '['d"∙"q']'
return a</lang>
{{out|output|text=&nbsp; when using the default input:}}
end /*d*/
return !!</lang>
'''output''' when using the default input:
<pre>
<pre>
vampire number 1 is: 1260, fangs= [21∙60]
vampire number 1 is: 1260, fangs= [21∙60]