Rare numbers: Difference between revisions

(→‎Version 2: Removed a redundant declaration.)
Line 29:
 
=={{header|F_Sharp|F#}}==
;===The Function:===
This solution demonstrates the concept described in [[Talk:Rare_numbers#30_mins_not_30_years]]. It usesdoesn't use [[Cartesian_product_of_two_or_more_lists#Extra_Credit]]
<lang fsharp>
// Find all Rare numbers with a digits. Nigel Galloway: September 18th., 2019.
let rareNums a=
let rN a=let izPS=let n=int64(ceil(sqrt(float(2L*(pown 10L a))))) in let rec fN n g=if n*n>g then fN ((n+(g/n))/2L) g else n
let tN=set[1L;4L;5L;6L;9L]
(fun g->let n=fN n g in n*n=g)
let izPS g=let n=(float>>sqrt>>int64)g in n*n=g
let n=cP [yield [0L..9L]; for n in [a-3..(-2)..1] do yield [-9L..9L]]
let in=[yield (pown 10L (a-1))-1L; for n in [a-2..(-1)0..a/2-1] do yield ((pown 10L (a-n-1))-(pown 10L (a-n-1)))] //[99L; 0L]|>List.rev
let rec fN i g e=seq{match e letwith 0->yield g=Seq.mapi(fun i n|e->[for gn in maxi 0Ldo yield! (0LfN [-n)9L..min 9L] (9L-n::g) do yield (g*(pown 10L (a-ie-1))+}|>Seq.filter(n+fun g)*->let g=Seq.map2(pown 10L i*),( n+ g)*(pown|>Seq.sum 10Lin (a-i-1))+g*(pown>0L 10L&& i))]izPS g)
let rec fG n i g e l=seq{
let e n=if a%2=0 then g n else Seq.append (g n) [[for n in [0L..9L] do yield (n*(pown 10L (a/2)),n*(pown 10L (a/2)))]]
match l with
let l=n|>Seq.filter(fun n->let g=Seq.map2(*)n i|>Seq.sum in g>0L && izPS(g))|>Seq.map(e>>cP)|>Seq.concat
h::t->for l in max 0L (0L-h)..min 9L (9L-h) do if e>1L||l=0L||tN.Contains((2L*l+h)%10L) then yield! fG (n+l*e+(l+h)*g) (i+l*g+(l+h)*e) (g/10L) (e*10L) t
l|>Seq.map(fun n->Seq.fold(fun(n,g) (n',g')->(n+n',g+g'))(0L,0L) n)|>Seq.filter(fun(n,g)->g>(pown 10L (a-1)) && izPS(n+g))
|_->if n>(pown 10L (a-1)) then for l in (if a%2=0 then [0L] else [0L..9L]) do let g=l*(pown 10L (a/2)) in if izPS (n+i+2L*g) then yield (i+g,n+g)}
fN [0L..9L] [] (a/2) |> Seq.collect(List.rev >> fG 0L 0L (pown 10L (a-1)) 1L)
</lang>
 
===43 down===
;The Task
<lang fsharp>
let test n=
[2..12]|>Seq.collect rN |> Seq.iter(printfn "%A")
let t = System.Diagnostics.Stopwatch.StartNew()
for n in (rareNums n) do printfn "%A" n
t.Stop()
printfn "Elapsed Time: %Ad ms for length %d" t.ElapsedMilliseconds n
 
[2..17] |> Seq.iter test
</lang>
{{out}}
<pre>
(56L, 65L)
Elapsed Time: 31 ms for length 2
Elapsed Time: 0 ms for length 3
Elapsed Time: 0 ms for length 4
Elapsed Time: 0 ms for length 5
(77126L, 621770L)
Elapsed Time: 6 ms for length 6
Elapsed Time: 6 ms for length 7
Elapsed Time: 113 ms for length 8
(280980182L, 281089082L)
Elapsed Time: 72 ms for length 9
(2022562202L, 2022652202L)
(2002382402L, 2042832002L)
Elapsed Time: 1525 ms for length 10
Elapsed Time: 1351 ms for length 11
(871479645278L, 872546974178L)
(871457865278L, 872568754178L)
(757480195868L, 868591084757L)
Elapsed Time: 27990 ms for length 12
Real: 00:00:58.835, CPU: 00:01:00.421, GC gen0: 3220, gen1: 441, gen2: 16
</pre>
===Stretch Goal===
<lang fsharp>
let t = System.Diagnostics.Stopwatch.StartNew()
rN 13 |> Seq.iter (printfn "%A")
t.Stop()
printfn "Elapsed Time: %A" t.ElapsedMilliseconds
</lang>
{{out}}
fsi --exec rc.fsx produces:
<pre>
(5881592039796L, 6979302951885L)
Elapsed Time: 32233L26051 ms for length 13
(20240939631302L, 20313693904202L)
(20240793831302L, 20313839704202L)
(20222975613302L, 20331657922202L)
(20222757813302L, 20331875722202L)
(20220757833302L, 20333875702202L)
(240739831304L, 40313893704200L)
(202739815304L, 40351893720200L)
Elapsed Time: 552922 ms for length 14
(200137583241002L, 200142385731002L)
(221457543264122L, 221462345754122L)
(816921665489618L, 816984566129618L)
(244670699815542L, 245518996076442L)
(200660494832402L, 204238494066002L)
(244781494953842L, 248359494187442L)
(240422198260442L, 244062891224042L)
(5434293850304L, 403058392434500L)
(43430495450144L, 441054594034340L)
Elapsed Time: 512282 ms for length 15
(2126675496873312L, 2133786945766212L)
(2124893498655312L, 2135568943984212L)
(8180266864511918L, 8191154686620818L)
(8180264686511918L, 8191156864620818L)
(2124697854675312L, 2135764587964212L)
(2124675676875312L, 2135786765764212L)
(8180044686731918L, 8191376864400818L)
(2021612621138702L, 2078311262161202L)
(7152956206592508L, 8052956026592517L)
(7152956026592508L, 8052956206592517L)
(7541459867230568L, 8650327689541457L)
(7541437689430568L, 8650349867341457L)
(5046466897757516L, 6157577986646405L)
(124675496875314L, 4135786945764210L)
(143818075679886L, 6889765708183410L)
Elapsed Time: 11568713 ms for length 16
(86965749405756968L, 86965750494756968L)
(22541929604024522L, 22542040692914522L)
(4656716501952776L, 67725910561765640L)
Elapsed Time: 11275839 ms for length 17
</pre>
 
2,172

edits