Sturmian word: Difference between revisions

Content added Content deleted
(→‎{{header|Phix}}: added cfck())
(→‎{{header|Wren}}: Modified to deal with Sturmian words derived from quadratric as well as rational numbers.)
Line 133:
 
=={{header|Wren}}==
{{trans|Python}}
{{libheader|Wren-assert}}
The 'rational number' function is a translation of the Python entry.
For rational numbers m / n:
 
The 'quadratic number' function is a modified version of the one used in the [[Continued fraction convergents]] task.
<syntaxhighlight lang="wren">import "./assert" for Assert
 
var SturmianWordSturmianWordRat = Fn.new { |m, n|
if (m > n) return SturmianWordSturmianWordRat.call(n, m).reduce("") { |acc, c|
return acc + (c == "0" ? "1" : "0")
}
Line 151 ⟶ 152:
}
return sturmian
}
 
var SturmianWordQuad = Fn.new { |a, b, m, n, k|
var p = [0, 1]
var q = [1, 0]
var rem = (a.sqrt * b + m) / n
for (i in 1..k) {
var whole = rem.truncate
var frac = rem.fraction
var pn = whole * p[-1] + p[-2]
var qn = whole * q[-1] + q[-2]
p.add(pn)
q.add(qn)
rem = 1 / frac
}
return SturmianWordRat.call(p[-1], q[-1])
}
 
Line 165 ⟶ 182:
 
var fib = fibWord.call(10)
var sturmian = SturmianWordSturmianWordRat.call(13, 21)
Assert.equal(fib[0...sturmian.count], sturmian)
System.print("%(sturmian)< from rational number 13/syntaxhighlight>21")
var sturmian2 = SturmianWordQuad.call(5, 1, -1, 2, 8)
Assert.equal(sturmian, sturmian2)
System.print("%(sturmian2) from quadratic number (√5 - 1)/2 (k = 8)")</syntaxhighlight>
 
{{out}}
<pre>
01001010010010100101001001010010 from rational number 13/21
01001010010010100101001001010010 from quadratic number (√5 - 1)/2 (k = 8)
</pre>