EKG sequence convergence: Difference between revisions

m
syntax highlighting fixup automation
No edit summary
m (syntax highlighting fixup automation)
Line 38:
{{trans|Nim}}
 
<langsyntaxhighlight lang="11l">F ekg(n, limit)
Set[Int] values
assert(n >= 2)
Line 72:
convIndex = i
L.break
print(‘EKG(5) and EKG(7) converge at index ’convIndex‘.’)</langsyntaxhighlight>
 
{{out}}
Line 86:
=={{header|Action!}}==
{{libheader|Action! Tool Kit}}
<langsyntaxhighlight Actionlang="action!">INCLUDE "D2:SORT.ACT" ;from the Action! Tool Kit
 
BYTE FUNC Contains(BYTE ARRAY a BYTE len,b)
Line 200:
PrintF("converge at index %B",conv)
FI
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/EKG_sequence_convergence.png Screenshot from Atari 8-bit computer]
Line 215:
=={{header|Ada}}==
{{trans|Go}}
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
with Ada.Containers.Generic_Array_Sort;
 
Line 330:
end if;
end;
end EKG_Sequences;</langsyntaxhighlight>
{{out}}
<pre>
Line 344:
=={{header|C}}==
{{trans|Go}}
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 418:
printf("\nEKG5(5) and EKG(7) do not converge within %d terms\n", LIMIT);
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 434:
===The Function===
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_function Extensible Prime Generator (F#)]
<langsyntaxhighlight lang="fsharp">
// Generate EKG Sequences. Nigel Galloway: December 6th., 2018
let EKG n=seq{
Line 445:
yield! seq[1;n]; let g=fU n in yield! EKG g (fG g|>Seq.minBy snd)}
let EKGconv n g=Seq.zip(EKG n)(EKG g)|>Seq.skip 2|>Seq.scan(fun(n,i,g,e)(l,β)->(Set.add l n,Set.add β i,l,β))(set[1;n],set[1;g],0,0)|>Seq.takeWhile(fun(n,i,g,e)->g<>e||n<>i)
</syntaxhighlight>
</lang>
 
===The Task===
<langsyntaxhighlight lang="fsharp">
EKG 2 |> Seq.take 45 |> Seq.iter(printf "%2d, ")
EKG 3 |> Seq.take 45 |> Seq.iter(printf "%2d, ")
Line 456:
EKG 10 |> Seq.take 45 |> Seq.iter(printf "%2d, ")
printfn "%d" (let n,_,_,_=EKGconv 2 5|>Seq.last in ((Set.count n)+1)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 465:
</pre>
===Extra Credit===
<langsyntaxhighlight lang="fsharp">
prıntfn "%d" (EKG 2|>Seq.takeWhile(fun n->n<>104729) ((Seq.length n)+1)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 476:
=={{header|Factor}}==
{{works with|Factor|0.99 2019-10-06}}
<langsyntaxhighlight lang="factor">USING: combinators.short-circuit formatting fry io kernel lists
lists.lazy math math.statistics prettyprint sequences
sequences.generalizations ;
Line 498:
{ 2 5 7 9 10 } 20 show-ekgs nl
"EKG(5) and EKG(7) converge at term " write
5 7 100 converge-at .</langsyntaxhighlight>
{{out}}
<pre>
Line 511:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 582:
}
fmt.Println("\nEKG5(5) and EKG(7) do not converge within", limit, "terms")
}</langsyntaxhighlight>
 
{{out}}
Line 596:
 
=={{header|Haskell}}==
<langsyntaxhighlight Haskelllang="haskell">import Data.List (findIndex, isPrefixOf, tails)
import Data.Maybe (fromJust)
 
Line 644:
)
)
)</langsyntaxhighlight>
{{out}}
<pre>EKG (2) is [1,2,4,6,3,9,12,8,10,5,15,18,14,7,21,24,16,20,22,11]
Line 654:
 
=={{header|J}}==
<syntaxhighlight lang="j">
<lang j>
Until =: 2 :'u^:(0-:v)^:_' NB. unused but so fun
prime_factors_of_tail =: ~.@:q:@:{:
Line 691:
assert (,2) -: prime_factors_of_tail 6 8 NB. (nub of)
assert 3 4 5 -: numbers_not_in_list 1 2 6
</syntaxhighlight>
</lang>
Somewhat shorter is ekg2,
<syntaxhighlight lang="j">
<lang j>
index_of_lowest =: [: {. _ ,~ [: I. 1 e."1 prime_factors_of_tail e."1 q:@:numbers_not_in_list
 
Line 706:
 
assert (ekg^:9&> -: ekg2^:9&>) 2 5 7 9 10
</syntaxhighlight>
</lang>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">
import java.util.ArrayList;
import java.util.Collections;
Line 789:
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 812:
 
'''Preliminaries'''
<syntaxhighlight lang="jq">
<lang jq>
# jq optimizes the recursive call of _gcd in the following:
def gcd(a;b):
Line 821:
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .;
 
</syntaxhighlight>
</lang>
'''The Task'''
<syntaxhighlight lang="jq">
<lang jq>
def areSame($s; $t):
($s|length) == ($t|length) and ($s|sort) == ($t|sort);
Line 868:
;
 
task</langsyntaxhighlight>
{{out}}
<pre>
Line 882:
=={{header|Julia}}==
{{trans|Perl}}
<langsyntaxhighlight lang="julia">using Primes
 
function ekgsequence(n, limit)
Line 910:
[println(rpad("EKG($i): ", 9), join(ekgsequence(i, 30), " ")) for i in [2, 5, 7, 9, 10]]
println("EKGs of 5 & 7 converge at term ", convergeat(5, 7))
</syntaxhighlight>
</lang>
{{output}}<pre>
EKG(2): 1 2 4 6 3 9 12 8 10 5 15 18 14 7 21 24 16 20 22 11 33 27 30 25 35 28 26 13 39 36
Line 922:
=={{header|Kotlin}}==
{{trans|Go}}
<langsyntaxhighlight lang="scala">// Version 1.2.60
 
fun gcd(a: Int, b: Int): Int {
Line 970:
}
println("\nEKG5(5) and EKG(7) do not converge within $LIMIT terms")
}</langsyntaxhighlight>
 
{{output}}
Line 984:
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">ClearAll[NextInSequence, EKGSequence]
NextInSequence[seq_List] := Module[{last, new = 1, holes, max, sel, found, i},
last = Last[seq];
Line 1,011:
len = LengthWhile[s, Apply[Equal]];
s //= Reverse[Drop[#, len]] &;
Length[s] + 1</langsyntaxhighlight>
{{out}}
<pre>1 2 4 6 3 9 12 8 10 5
Line 1,022:
 
=={{header|Nim}}==
<langsyntaxhighlight Nimlang="nim">import algorithm, math, sets, strformat, strutils
 
#---------------------------------------------------------------------------------------------------
Line 1,064:
echo fmt"EKG(5) and EKG(7) converge at index {convIndex}."
else:
echo "No convergence found in the first {convIndex} terms."</langsyntaxhighlight>
 
{{out}}
Line 1,076:
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight lang="perl">use List::Util qw(none sum);
 
sub gcd { my ($u,$v) = @_; $v ? gcd($v, $u%$v) : abs($u) }
Line 1,103:
 
print "EKG($_): " . join(' ', EKG($_,10)) . "\n" for 2, 5, 7, 9, 10;
print "EKGs of 5 & 7 converge at term " . converge_at(5, 7) . "\n"</langsyntaxhighlight>
{{out}}
<pre>EKG(2): 1 2 4 6 3 9 12 8 10 5
Line 1,114:
=={{header|Phix}}==
{{trans|C}}
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">LIMIT</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">100</span>
Line 1,147:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<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;">"\nEKG5(5) and EKG(7) %s\n"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">msg</span><span style="color: #0000FF;">)</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,163:
If this alternate definition of function EKG_gen is used then the output would be the same as above.
Instead of keeping a cache of prime factors this calculates the gretest common divisor as needed.
<langsyntaxhighlight lang="python">from itertools import count, islice, takewhile
from math import gcd
 
Line 1,196:
for start in 2, 5, 7, 9, 10:
print(f"EKG({start}):", str([n[0] for n in islice(EKG_gen(start), 10)])[1: -1])
print(f"\nEKG(5) and EKG(7) converge at term {find_convergence(ekgs=(5,7))}!")</langsyntaxhighlight>
 
{{out}}
Line 1,211:
Despite EKG(5) and EKG(7) seeming to converge earlier, as seen above; their hidden states differ.<br>
Here is those series out to 21 terms where you can see them diverge again before finally converging. The state is also shown.
<langsyntaxhighlight lang="python"># After running the above, in the terminal:
from pprint import pprint as pp
 
for start in 5, 7:
print(f"EKG({start}):\n[(<next>, [<state>]), ...]")
pp(([n for n in islice(EKG_gen(start), 21)]))</langsyntaxhighlight>
 
'''Generates:'''
Line 1,269:
(formerly Perl 6)
{{works with|Rakudo Star|2018.04.1}}
<syntaxhighlight lang="raku" perl6line>sub infix:<shares-divisors-with> { ($^a gcd $^b) > 1 }
 
sub next-EKG ( *@s ) {
Line 1,292:
for [5, 7], [2, 5, 7, 9, 10] -> @ints {
say "EKGs of (@ints[]) converge at term {$_+1}" with converge-at(@ints);
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,305:
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program can generate and display several EKG sequences (with various starts).*/
parse arg nums start /*obtain optional arguments from the CL*/
if nums=='' | nums=="," then nums= 50 /*Not specified? Then use the default.*/
Line 1,343:
if done then iterate
if wordpos(j, $)==0 then return j /*return an EKG integer.*/
end /*j*/</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default inputs:}}
<!-- (output is shown &nbsp; '''<sup>5</sup>/<sub>6</sub>''' &nbsp; size.) !-->
Line 1,360:
=={{header|Sidef}}==
{{trans|Raku}}
<langsyntaxhighlight lang="ruby">class Seq(terms, callback) {
method next {
terms += callback(terms)
Line 1,406:
var c = converge_at(arr)
say "EKGs of #{arr} converge at term #{c}"
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,420:
=={{header|Vlang}==
{{trans|Go}}
<langsyntaxhighlight lang="vlang">fn gcd(aa int, bb int) int {
mut a,mut b:=aa,bb
for a != b {
Line 1,476:
}
println("\nEKG5(5) and EKG(7) do not converge within $limit terms")
}</langsyntaxhighlight>
 
{{out}}
Line 1,494:
{{libheader|Wren-math}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight lang="ecmascript">import "/sort" for Sort
import "/math" for Int
import "/fmt" for Fmt
Line 1,538:
}
}
System.print("\nEKG5(5) and EKG(7) do not converge within %(limit) terms.") </langsyntaxhighlight>
 
{{out}}
Line 1,553:
=={{header|XPL0}}==
As can be seen, EKG(5) and EKG(7) converge at N = 21.
<langsyntaxhighlight XPL0lang="xpl0">int N, A(1+30);
 
func Used; int M; \Return 'true' if M is in array A
Line 1,595:
[Tbl:= [2, 5, 7, 9, 10];
for I:= 0 to 4 do EKG(Tbl(I));
]</langsyntaxhighlight>
 
{{out}}
Line 1,608:
=={{header|zkl}}==
Using gcd hint from Go.
<langsyntaxhighlight lang="zkl">fcn ekgW(N){ // --> iterator
Walker.tweak(fcn(rp,buf,w){
foreach n in (w){
Line 1,616:
}
}.fp(Ref(N),List(),Walker.chain([2..N-1],[N+1..]))).push(1,N)
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">foreach n in (T(2,5,7,9,10)){ println("EKG(%2d): %s".fmt(n,ekgW(n).walk(10).concat(","))) }</langsyntaxhighlight>
{{out}}
<pre>
Line 1,626:
EKG(10): 1,10,2,4,6,3,9,12,8,14
</pre>
<langsyntaxhighlight lang="zkl">fcn convergeAt(n1,n2,etc){ ns:=vm.arglist;
ekgWs:=ns.apply(ekgW); ekgWs.apply2("next"); // pop initial 1
ekgNs:=List()*vm.numArgs; // ( (ekg(n1)), (ekg(n2)) ...)
Line 1,641:
}
convergeAt(5,7);
convergeAt(2,5,7,9,10);</langsyntaxhighlight>
{{out}}
<pre>
10,339

edits