Euclidean rhythm: Difference between revisions

Added C++.
imported>CosmiaNebula
(creating page)
 
(Added C++.)
 
(36 intermediate revisions by 11 users not shown)
Line 16:
** 10010 10010 100 |
* At this point, we can continue the algorithm until only one form remains, but notice that one of the groups has only one element [100], so the algorithm can actually terminate right here and output the concatenation 1001010010100.
 
 
=={{header|ALGOL 68}}==
<syntaxhighlight lang="algol68">
BEGIN # Euclidean Rhythm #
 
# returns the Euclidean rhythm string generated by m and n #
# 0 < m < n must be true #
PROC e rhythm = ( INT m, n )STRING:
BEGIN
[ 1 : n ]STRING r;
# the rhythm string is n elements, initially the first m are #
# set to "1" and the remainder set to "0" #
# the first part is defined by a start and a end and the #
# second part by b start and b end #
FOR i TO m DO r[ i ] := "1" OD;
FOR i FROM m + 1 TO n DO r[ i ] := "0" OD;
INT a start := 1, a end := m;
INT b start := m + 1, b end := n;
# the b elements are appended to the a elements and removed #
# until either a or b or both have less than two elements left #
WHILE a end > a start # at least two elements in a #
AND b end > b start # at least two elements in b #
DO
INT a pos := a start, b pos := b start;
WHILE a pos <= a end AND b pos <= b end DO
r[ a pos ] +:= r[ b pos ];
a pos +:= 1;
b pos +:= 1
OD;
IF b pos < b end THEN
# 2 or more unused elements left in b #
b start := b pos
ELSE
# nothing left in b - use the remains of a #
b start := a pos;
b end := a end;
a end := a pos - 1
FI
OD;
STRING result := "";
FOR i FROM a start TO a end DO result +:= r[ i ] OD;
FOR i FROM b start TO b end DO result +:= r[ i ] OD;
result
END # e rhythm # ;
 
print( ( e rhythm( 5, 13 ), newline ) ); # task test case #
print( ( e rhythm( 3, 8 ), newline ) ) # JaveScriipt test case #
 
END
</syntaxhighlight>
{{out}}
<pre>
1001010010100
10010010
</pre>
 
=={{header|Asymptote}}==
<syntaxhighlight lang="Asymptote">int m = 5;
int n = 13;
 
string r[] = new string[n];
int a_pio = 1, a_fin = m;
int b_pio = m + 1, b_fin = n;
int a_pos, b_pos;
 
for (int i = 1; i <= m; ++i)
r[i] = "1";
for (int i = m + 1; i <= n; ++i)
r[i] = "0";
 
while (a_fin > a_pio && b_fin > b_pio) {
a_pos = a_pio;
b_pos = b_pio;
while (a_pos <= a_fin && b_pos <= b_fin) {
r[a_pos] += r[b_pos];
++a_pos;
++b_pos;
}
if (b_pos < b_fin)
b_pio = b_pos;
else {
b_pio = a_pos;
b_fin = a_fin;
a_fin = a_pos - 1;
}
}
 
string result = "";
for (int i = a_pio; i <= a_fin; ++i)
result += r[i];
for (int i = b_pio; i <= b_fin; ++i)
result += r[i];
 
write(result);</syntaxhighlight>
{{out}}
<pre>10010010</pre>
 
=={{header|BASIC}}==
==={{header|BASIC256}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vbnet">arraybase 1
call euclideanrhythm(5, 13)
call euclideanrhythm(3, 8)
end
 
subroutine euclideanrhythm (m,n)
dim r$(n)
a_pio = 1
a_fin = m
b_pio = m+1
b_fin = n
for i = 1 to m
r$[i] = "1"
next i
for i = m+1 to n
r$[i] = "0"
next i
while a_fin > a_pio and b_fin > b_pio
a_pos = a_pio
b_pos = b_pio
while a_pos <= a_fin and b_pos <= b_fin
r$[a_pos] = r$[a_pos] & r$[b_pos]
a_pos = a_pos+1
b_pos = b_pos+1
end while
if b_pos < b_fin then
b_pio = b_pos
else
b_pio = a_pos
b_fin = a_fin
a_fin = a_pos-1
end if
end while
result$ = ""
for i = a_pio to a_fin
result$ = result$ & r$[i]
next i
for i = b_pio to b_fin
result$ = result$ & r$[i]
next i
print result$
end subroutine</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|Chipmunk Basic}}===
{{trans|FreeBASIC}}
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="vbnet">100 sub euclideanrhythm(m,n)
110 dim r$(n)
120 apio = 1
130 afin = m
140 bpio = m+1
150 bfin = n
160 for i = 1 to m
170 r$(i) = "1"
180 next i
190 for i = m+1 to n
200 r$(i) = "0"
210 next i
220 while afin > apio and bfin > bpio
230 apos = apio
240 bpos = bpio
250 while apos <= afin and bpos <= bfin
260 r$(apos) = r$(apos)+r$(bpos)
270 apos = apos+1
280 bpos = bpos+1
290 wend
300 if bpos < bfin then
310 bpio = bpos
320 else
330 bpio = apos
340 bfin = afin
350 afin = apos-1
360 endif
370 wend
380 result$ = ""
390 for i = apio to afin
400 result$ = result$+r$(i)
410 next i
420 for i = bpio to bfin
430 result$ = result$+r$(i)
440 next i
450 print result$
460 end sub
470 euclideanrhythm(5,13)
480 euclideanrhythm(3,8)
490 end</syntaxhighlight>
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|FreeBASIC}}===
{{trans|ALGOL 68}}
<syntaxhighlight lang="vbnet">Sub EuclideanRhythm (m As Integer, n As Integer)
'Devuelve la cadena de ritmo euclidiano generada por m y n
'0 < m < n debe ser verdadero
Dim As String r(n)
Dim As Integer a_pio = 1, a_fin = m
Dim As Integer b_pio = m + 1, b_fin = n
Dim As Integer a_pos, b_pos
Dim As Integer i
'La cadena rítmica r() tiene n elementos, inicialmente los primeros m
'se establecen en "1" y el resto en "0". La primera parte se define por
'a_inicio y a_final y la segunda parte por b_inicio y b_final
For i = 1 To m
r(i) = "1"
Next i
For i = m + 1 To n
r(i) = "0"
Next i
'Los elementos b se añaden a los elementos a y se eliminan
'hasta que a o b o ambos tienen menos de dos elementos
While a_fin > a_pio And _ 'al menos dos elementos en a
b_fin > b_pio 'al menos dos elementos en b
a_pos = a_pio
b_pos = b_pio
While a_pos <= a_fin And b_pos <= b_fin
r(a_pos) += r(b_pos)
a_pos += 1
b_pos += 1
Wend
If b_pos < b_fin Then '2 o más elementos no utilizados quedan en b
b_pio = b_pos
Else 'no queda nada en b - usa los restos de a
b_pio = a_pos
b_fin = a_fin
a_fin = a_pos - 1
End If
Wend
Dim As String result = ""
For i = a_pio To a_fin
result += r(i)
Next i
For i = b_pio To b_fin
result += r(i)
Next i
Print result
End Sub
 
EuclideanRhythm(5, 13) 'caso de prueba de la tarea
EuclideanRhythm(3, 8) 'caso de prueba de JavaScript
 
Sleep</syntaxhighlight>
{{out}}
<pre>Same as ALGOL 68 entry.</pre>
 
==={{header|Gambas}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vbnet">Sub EuclideanRhythm(m As Integer, n As Integer)
 
Dim r As New String[]
Dim a_pio As Integer = 1, a_fin As Integer = m
Dim b_pio As Integer = m + 1, b_fin As Integer = n
Dim a_pos As Integer, b_pos As Integer, i As Integer
For i = 0 To m
r.Add("1")
Next
For i = m + 1 To n
r.Add("0")
Next
While a_fin > a_pio And b_fin > b_pio
a_pos = a_pio
b_pos = b_pio
While a_pos <= a_fin And b_pos <= b_fin
r[a_pos] &= r[b_pos]
a_pos += 1
b_pos += 1
Wend
If b_pos < b_fin Then
b_pio = b_pos
Else
b_pio = a_pos
b_fin = a_fin
a_fin = a_pos - 1
End If
Wend
Dim result As String = ""
For i = a_pio To a_fin
result &= r[i]
Next
For i = b_pio To b_fin
result &= r[i]
Next
Print result
 
End Sub
 
Public Sub Main()
EuclideanRhythm(5, 13) 'caso de prueba de la tarea
EuclideanRhythm(3, 8) 'caso de prueba de JavaScript
End</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|PureBasic}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="purebasic">Procedure EuclideanRhythm(m, n)
Dim r.s(n)
Protected.i a_pio = 1, a_fin = m
Protected.i b_pio = m + 1, b_fin = n
Protected.i a_pos, b_pos, i
For i = 1 To m
r(i) = "1"
Next
For i = m + 1 To n
r(i) = "0"
Next
While a_fin > a_pio And b_fin > b_pio
a_pos = a_pio
b_pos = b_pio
While a_pos <= a_fin And b_pos <= b_fin
r(a_pos) + r(b_pos)
a_pos + 1
b_pos + 1
Wend
If b_pos < b_fin
b_pio = b_pos
Else
b_pio = a_pos
b_fin = a_fin
a_fin = a_pos - 1
EndIf
Wend
Protected.s result = ""
For i = a_pio To a_fin
result + r(i)
Next
For i = b_pio To b_fin
result + r(i)
Next
PrintN(result)
EndProcedure
 
OpenConsole()
EuclideanRhythm(5, 13)
EuclideanRhythm(3, 8)
Input()
CloseConsole()</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|QBasic}}===
{{trans|FreeBASIC}}
{{works with|QBasic|1.1}}
{{works with|QuickBasic|4.5}}
<syntaxhighlight lang="qbasic">SUB EuclideanRhythm (m, n)
DIM r$(n)
apio = 1
afin = m
bpio = m + 1
bfin = n
FOR i = 1 TO m
r$(i) = "1"
NEXT i
FOR i = m + 1 TO n
r$(i) = "0"
NEXT i
WHILE afin > apio AND bfin > bpio
apos = apio
bpos = bpio
WHILE apos <= afin AND bpos <= bfin
r$(apos) = r$(apos) + r$(bpos)
apos = apos + 1
bpos = bpos + 1
WEND
IF bpos < bfin THEN
bpio = bpos
ELSE
bpio = apos
bfin = afin
afin = apos - 1
END IF
WEND
result$ = ""
FOR i = apio TO afin
result$ = result$ + r$(i)
NEXT i
FOR i = bpio TO bfin
result$ = result$ + r$(i)
NEXT i
PRINT result$
END SUB
 
CALL EuclideanRhythm(5, 13)
CALL EuclideanRhythm(3, 8)</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|True BASIC}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="qbasic">SUB euclideanrhythm (m,n)
DIM r$(0)
MAT redim r$(n)
LET a_pio = 1
LET a_fin = m
LET b_pio = m+1
LET b_fin = n
FOR i = 1 to m
LET r$(i) = "1"
NEXT i
FOR i = m+1 to n
LET r$(i) = "0"
NEXT i
DO while a_fin > a_pio and b_fin > b_pio
LET a_pos = a_pio
LET b_pos = b_pio
DO while a_pos <= a_fin and b_pos <= b_fin
LET r$(a_pos) = r$(a_pos) & r$(b_pos)
LET a_pos = a_pos+1
LET b_pos = b_pos+1
LOOP
IF b_pos < b_fin then
LET b_pio = b_pos
ELSE
LET b_pio = a_pos
LET b_fin = a_fin
LET a_fin = a_pos-1
END IF
LOOP
LET result$ = ""
FOR i = a_pio to a_fin
LET result$ = result$ & r$(i)
NEXT i
FOR i = b_pio to b_fin
LET result$ = result$ & r$(i)
NEXT i
PRINT result$
END SUB
 
CALL euclideanrhythm(5, 13)
CALL euclideanrhythm(3, 8)
END</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|Yabasic}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vbnet">euclideanrhythm(5, 13)
euclideanrhythm(3, 8)
end
 
sub euclideanrhythm (m,n)
dim r$(n)
apio = 1
afin = m
bpio = m+1
bfin = n
for i = 1 to m
r$(i) = "1"
next i
for i = m+1 to n
r$(i) = "0"
next i
while afin > apio and bfin > bpio
apos = apio
bpos = bpio
while apos <= afin and bpos <= bfin
r$(apos) = r$(apos) + r$(bpos)
apos = apos+1
bpos = bpos+1
wend
if bpos < bfin then
bpio = bpos
else
bpio = apos
bfin = afin
afin = apos-1
fi
wend
result$ = ""
for i = apio to afin
result$ = result$ + r$(i)
next i
for i = bpio to bfin
result$ = result$ + r$(i)
next i
print result$
end sub</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
=={{header|C++}}==
{{trans|ALGOL 68}} But the vector <code>r</code> is subscripted from <code>0</code> to <code>n - 1</code>.
<syntaxhighlight lang="cpp">
// Euclidean rhythm
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
string euclidean_rhythm(const unsigned int m, const unsigned int n)
{
vector<string> r(n);
unsigned int a_start = 0, a_end = m - 1, b_start = m, b_end = n - 1;
for (unsigned int i = 0; i < m; i++)
r[i] = "1";
for (unsigned int i = m; i < n; i++)
r[i] = "0";
while (a_end > a_start && b_end > b_start)
{
unsigned int a_pos = a_start, b_pos = b_start;
while (a_pos <= a_end && b_pos <= b_end)
{
r[a_pos] += r[b_pos];
a_pos++;
b_pos++;
}
if (b_pos <= b_end)
b_start = b_pos;
else
{
b_start = a_pos;
b_end = a_end;
a_end = a_pos - 1;
}
}
string result = "";
for (unsigned int i = a_start; i <= a_end; i++)
result += r[i];
for (unsigned int i = b_start; i <= b_end; i++)
result += r[i];
return result;
}
 
int main()
{
cout << euclidean_rhythm(5, 13) << "\n";
cout << euclidean_rhythm(3, 8) << "\n";
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
10010010
</pre>
 
=={{header|C#}}==
{{trans|Java}}
<syntaxhighlight lang="C#">
using System;
using System.Collections.Generic;
using System.Text;
 
public class SequenceGenerator
{
public static void Main(string[] args)
{
string result = GenerateSequence(5, 13);
Console.WriteLine(result); // Should print 1001010010100
}
 
public static string GenerateSequence(int k, int n)
{
List<List<int>> s = new List<List<int>>();
 
for (int i = 0; i < n; i++)
{
List<int> innerList = new List<int>();
if (i < k)
{
innerList.Add(1);
}
else
{
innerList.Add(0);
}
s.Add(innerList);
}
 
int d = n - k;
n = Math.Max(k, d);
k = Math.Min(k, d);
int z = d;
 
while (z > 0 || k > 1)
{
for (int i = 0; i < k; i++)
{
s[i].AddRange(s[s.Count - 1 - i]);
}
s = s.GetRange(0, s.Count - k);
z -= k;
d = n - k;
n = Math.Max(k, d);
k = Math.Min(k, d);
}
 
StringBuilder result = new StringBuilder();
foreach (List<int> sublist in s)
{
foreach (int item in sublist)
{
result.Append(item);
}
}
return result.ToString();
}
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
=={{header|Dart}}==
{{trans|Python}}
<syntaxhighlight lang="Dart">
List<int> E(int k, int n) {
List<List<int>> s = List.generate(n, (i) => i < k ? [1] : [0]);
 
int d = n - k;
n = k > d ? k : d;
k = k < d ? k : d;
int z = d;
 
while (z > 0 || k > 1) {
for (int i = 0; i < k; i++) {
s[i].addAll(s[s.length - 1 - i]);
}
s = s.sublist(0, s.length - k);
z -= k;
d = n - k;
n = k > d ? k : d;
k = k < d ? k : d;
}
 
return s.expand((sublist) => sublist).toList();
}
 
void main() {
print(E(5, 13).join());
// Expected output: 1001010010100
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
=={{header|EasyLang}}==
{{trans|JavaScript}}
<syntaxhighlight>
func$ euclrhythm k n .
for i to n
h = if i <= k
s[][] &= [ h ]
.
d = n - k
n = higher k d
k = lower k d
z = d
while z > 0 or k > 1
for i to k
for c in s[len s[][] + 1 - i][]
s[i][] &= c
.
.
len s[][] -k
z = z - k
d = n - k
n = higher k d
k = lower k d
.
for i to len s[][]
for v in s[i][]
r$ &= v
.
.
return r$
.
print euclrhythm 3 8
</syntaxhighlight>
 
{{out}}
<pre>
10010010
</pre>
 
=={{header|Go}}==
{{trans|Java}}
<syntaxhighlight lang="Go">
package main
 
import (
"fmt"
"math"
)
 
func main() {
result := generateSequence(5, 13)
fmt.Println(result) // Should print 1001010010100
}
 
func generateSequence(k int, n int) string {
var s [][]int
 
for i := 0; i < n; i++ {
var innerList []int
if i < k {
innerList = append(innerList, 1)
} else {
innerList = append(innerList, 0)
}
s = append(s, innerList)
}
 
d := n - k
n = int(math.Max(float64(k), float64(d)))
k = int(math.Min(float64(k), float64(d)))
z := d
 
for z > 0 || k > 1 {
for i := 0; i < k; i++ {
s[i] = append(s[i], s[len(s)-1-i]...)
}
s = s[:len(s)-k]
z -= k
d = n - k
n = int(math.Max(float64(k), float64(d)))
k = int(math.Min(float64(k), float64(d)))
}
 
var result string
for _, sublist := range s {
for _, item := range sublist {
result += fmt.Sprintf("%d", item)
}
}
return result
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
=={{header|Java}}==
{{trans|Python}}
<syntaxhighlight lang="Java">
import java.util.ArrayList;
import java.util.List;
 
public class SequenceGenerator {
public static void main(String[] args) {
String result = generateSequence(5, 13);
System.out.println(result); // Should print 1001010010100
}
 
public static String generateSequence(int k, int n) {
List<List<Integer>> s = new ArrayList<>();
 
for (int i = 0; i < n; i++) {
List<Integer> innerList = new ArrayList<>();
if (i < k) {
innerList.add(1);
} else {
innerList.add(0);
}
s.add(innerList);
}
 
int d = n - k;
n = Math.max(k, d);
k = Math.min(k, d);
int z = d;
 
while (z > 0 || k > 1) {
for (int i = 0; i < k; i++) {
s.get(i).addAll(s.get(s.size() - 1 - i));
}
s = s.subList(0, s.size() - k);
z -= k;
d = n - k;
n = Math.max(k, d);
k = Math.min(k, d);
}
 
StringBuilder result = new StringBuilder();
for (List<Integer> sublist : s) {
for (int item : sublist) {
result.append(item);
}
}
return result.toString();
}
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
</pre>
 
=={{header|jq}}==
'''Adapted from [[#Wren|Wren]]'''
{{Works with|jq}}
 
'''Works with gojq, the Go implementation of jq'''
 
<syntaxhighlight lang="jq">
 
def E(k; n):
def list($value): [range(0,.) | $value];
{s: ((k|list([1])) + ((n-k)|list([0]))),
d: (n - k) }
| .n = ([k, .d]|max)
| .k = ([k, .d]|min)
| .z = .d
| until (.z <= 0 and .k <= 1;
reduce range(0; .k) as $i (.; .s[$i] += .s[-1 - $i])
| .s = .s[0: -.k]
| .z -= .k
| .d = .n - .k
| .n = ([.k, .d] | max)
| .k = ([.k, .d] | min) )
| .s
| [.[][]]
| join("");
 
E(5; 13)
</syntaxhighlight>
{{output}}
<pre>
1001010010100
</pre>
 
=={{header|JavaScript}}==
Copied from [https://mrmr.io/mj/euclid here] and [https://github.com/mnvr/gm1k?tab=readme-ov-file here], under MIT license.<syntaxhighlight lang="javascript">
const E = (k, n) => {
let s = Array(n).fill(0)
.map((_, i) => (i < k ? [1] : [0]))
 
let d = n - k
n = Math.max(k, d)
k = Math.min(k, d)
let z = d
 
while (z > 0 || k > 1) {
for (let i = 0; i < k; i++)
s[i].push(...s[s.length - 1 - i])
s.splice(-k)
z = z - k
d = n - k
n = Math.max(k, d)
k = Math.min(k, d)
}
 
return s.flat()
}
 
</syntaxhighlight>Output:<syntaxhighlight lang="text">
> E(3,8)
[1, 0, 0, 1, 0, 0, 1, 0]
 
</syntaxhighlight>
 
=={{header|Julia}}==
{{trans|R}}
<syntaxhighlight lang="Julia">
function E(k, n)
s = [[i <= k ? 1 : 0] for i in 1:n]
 
d = n - k
n, k = max(k, d), min(k, d)
z = d
 
while z > 0 || k > 1
for i in 1:k
append!(s[i], s[end - i + 1])
end
s = s[1:end-k]
z -= k
d = n - k
n, k = max(k, d), min(k, d)
end
 
return vcat(s...)
end
 
# Test the function
print(join(E(5, 13), ""))
# Output should be 1001010010100
</syntaxhighlight>
{{out}}
<pre>
1001010010100
</pre>
 
=={{header|Kotlin}}==
{{trans|Swift}}
<syntaxhighlight lang="Kotlin">
class SequenceGenerator {
 
companion object {
fun generateSequence(k: Int, n: Int): String {
var s = Array(n) { mutableListOf<Int>() }
 
for (i in 0 until n) {
if (i < k) {
s[i].add(1)
} else {
s[i].add(0)
}
}
 
var d = n - k
var nVar = maxOf(k, d)
var kVar = minOf(k, d)
var z = d
 
while (z > 0 || kVar > 1) {
for (i in 0 until kVar) {
s[i].addAll(s[s.size - 1 - i])
}
s = s.copyOfRange(0, s.size - kVar)
z -= kVar
d = nVar - kVar
nVar = maxOf(kVar, d)
kVar = minOf(kVar, d)
}
 
val result = s.flatMap { it }.joinToString(separator = "") { it.toString() }
return result
}
}
}
 
// Example usage
fun main() {
val result = SequenceGenerator.generateSequence(k = 5, n = 13)
println(result) // Should print 1001010010100
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
=={{header|Lua}}==
{{trans|Python}}
<syntaxhighlight lang="Lua">
function E(k, n)
local s = {}
for i = 1, n do
if i <= k then
table.insert(s, {1})
else
table.insert(s, {0})
end
end
 
local d = n - k
n = math.max(k, d)
k = math.min(k, d)
local z = d
 
while z > 0 or k > 1 do
for i = 1, k do
for _, v in ipairs(s[#s - i + 1]) do
table.insert(s[i], v)
end
end
for i = 1, k do
table.remove(s)
end
z = z - k
d = n - k
n = math.max(k, d)
k = math.min(k, d)
end
 
local result = {}
for _, sublist in ipairs(s) do
for _, item in ipairs(sublist) do
table.insert(result, item)
end
end
return result
end
 
local result = E(5, 13)
for _, v in ipairs(result) do
io.write(v)
end
io.write('\n')
-- Output should be 1001010010100
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
{{trans|Julia}}
<syntaxhighlight lang="Mathematica">
funcE[inputk_, inputn_] := Module[{s, d, z, i},
k=inputk; n=inputn;
s = Table[If[i <= k, {1}, {0}], {i, 1, n}];
 
d = n - k;
{n, k} = {Max[k, d], Min[k, d]};
z = d;
 
While[z > 0 || k > 1,
For[i = 1, i <= k, i++,
s[[i]]=Join[s[[i]], s[[Length[s] - i + 1]]]
];
s = Take[s, Length[s] - k];
z -= k;
d = n - k;
{n, k} = {Max[k, d], Min[k, d]};
];
 
Flatten[s]
]
 
(* Test the function *)
StringJoin[ToString /@ funcE[5, 13]] //Print
(* The output should be "1001010010100" *)
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
=={{header|MATLAB}}==
{{trans|Julia}}
<syntaxhighlight lang="MATLAB">
clear all;close all;clc;
disp(num2str(funcE(5, 13)))
 
function result = funcE(k, n)
s = cell(1, n);
for i = 1:n
s{i} = (i <= k);
end
 
d = n - k;
[n, k] = deal(max(k, d), min(k, d));
z = d;
 
while z > 0 || k > 1
for i = 1:k
s{i} = [s{i}, s{end - i + 1}];
end
s = s(1:end-k);
z = z - k;
d = n - k;
[n, k] = deal(max(k, d), min(k, d));
end
 
result = [s{:}];
end
</syntaxhighlight>
{{out}}
<pre>
1 0 0 1 0 1 0 0 1 0 1 0 0
</pre>
 
=={{header|Perl}}==
{{trans|Python}}
<syntaxhighlight lang="Perl">
use strict;
use warnings;
 
sub E {
my ($k, $n) = @_;
my @s = map { $_ < $k ? [1] : [0] } (0..$n-1);
 
my $d = $n - $k;
$n = $k > $d ? $k : $d;
$k = $k < $d ? $k : $d;
my $z = $d;
 
while ($z > 0 || $k > 1) {
foreach my $i (0..$k-1) {
push(@{$s[$i]}, @{$s[-1 - $i]});
}
splice(@s, -$k);
$z -= $k;
$d = $n - $k;
$n = $k > $d ? $k : $d;
$k = $k < $d ? $k : $d;
}
 
return map { @$_ } @s;
}
 
my $sequence = join('', E(5, 13));
print "$sequence\n";
# Expected output: 1001010010100
</syntaxhighlight>
{{out}}
<pre>
1001010010100
</pre>
 
=={{header|Phix}}==
<syntaxhighlight lang="phix">
function Euclidean_rhythm(integer k, n)
integer d = n - k, z = d
sequence s = repeat("1",k) & repeat("0",d)
n = max(k, d)
k = min(k, d)
while z > 0 or k > 1 do
string last = s[$]
assert(s[-k]==last)
for i=1 to k do
s[i] &= last
end for
s = s[1..-k-1]
z -= k
d = n - k
n = max(k, d)
k = min(k, d)
end while
 
return join(s,"")
end function
 
?Euclidean_rhythm(5,13)
</syntaxhighlight>
{{out}}
<pre>
"1001010010100"
</pre>
 
=={{header|PHP}}==
{{trans|Python}}
<syntaxhighlight lang="PHP">
<?php
 
function E($k, $n) {
$s = array();
for ($i = 0; $i < $n; $i++) {
$s[] = $i < $k ? array(1) : array(0);
}
 
$d = $n - $k;
$n = max($k, $d);
$k = min($k, $d);
$z = $d;
 
while ($z > 0 || $k > 1) {
for ($i = 0; $i < $k; $i++) {
$s[$i] = array_merge($s[$i], $s[count($s) - 1 - $i]);
}
$s = array_slice($s, 0, -$k);
$z = $z - $k;
$d = $n - $k;
$n = max($k, $d);
$k = min($k, $d);
}
 
$result = array();
foreach ($s as $sublist) {
$result = array_merge($result, $sublist);
}
return $result;
}
 
// Example usage
echo implode('', E(5, 13)); // 1001010010100
</syntaxhighlight>
{{out}}
<pre>
1001010010100
</pre>
 
=={{header|Python}}==
{{trans|JavaScript}}<syntaxhighlight lang="python3">
def E(k, n):
s = [[1] if i < k else [0] for i in range(n)]
 
d = n - k
n = max(k, d)
k = min(k, d)
z = d
 
while z > 0 or k > 1:
for i in range(k):
s[i].extend(s[len(s) - 1 - i])
s = s[:-k]
z = z - k
d = n - k
n = max(k, d)
k = min(k, d)
 
return [item for sublist in s for item in sublist]
 
print(''.join(map(str, E(5, 13))))
# 1001010010100
 
</syntaxhighlight>
 
=={{header|R}}==
{{trans|Python}}
<syntaxhighlight lang="R">
E <- function(k, n) {
s <- lapply(1:n, function(i) if (i <= k) 1 else 0)
 
d <- n - k
n <- max(k, d)
k <- min(k, d)
z <- d
 
while (z > 0 || k > 1) {
for (i in 1:k) {
s[[i]] <- c(s[[i]], s[[length(s) - i + 1]])
}
s <- s[1:(length(s) - k)]
z <- z - k
d <- n - k
n <- max(k, d)
k <- min(k, d)
}
 
unlist(s)
}
 
# Test the function
cat(E(5, 13), sep = "")
# Output should be 1001010010100
</syntaxhighlight>
{{out}}
<pre>
1001010010100
</pre>
 
=={{header|Raku}}==
{{trans|Perl}}
<syntaxhighlight lang="raku" line># 20240208 Raku programming solution
 
say sub ($k is copy, $n is copy) {
my @s = [ [1] xx $k ].append: [0] xx ($n - $k);
my $z = my $d = $n - $k;
($k, $n) = ($d, $k).minmax.bounds;
 
while $z > 0 || $k > 1 {
^$k .map: { @s[$_].append: @s.splice(*-1) }
($z, $d) = ($z, $n) X- $k;
($k, $n) = ($d, $k).minmax.bounds;
}
return [~] @s>>.List.flat;
}(5, 13);</syntaxhighlight>
You may [https://ato.pxeger.com/run?1=jVBBboMwEFSvvGIOPpgKrKCqUhVUlAf0AZUsGjmBqCjgWBhUIKEf6SWH9lN9TdeFpNf64F3vznhG8_FZq317Pn-1zS58-L5ZW9XDthtwtkdhsT2YPgDTl97H0QNQ9VhZPEJCRim6DoROhTIm19kScvE740QLaePHmDlsII6rGdV5G7sdqTkVn8acZYEjiarQlerE5tDqzMaeg729FmXufkmwwOnkVBNEkyU6L_QWlTJLHMmeZOs_SysrrCmLbc5vw8jHiJnC2UBq2SQ8TB6er7b-54xQo7vqvGlrDfmeklySiKfCNmJXqib2Rn4fILrz4ynnOe5L7D8 Attempt This Online!]
 
=={{header|RPL}}==
{{trans|Julia}}
« DUP2 SWAP - DUP
« j » 'j' 1 6 ROLL 1 SEQ 4 PICK ≤ 1 « →STR » DOLIST
→ z s
« 1 CF
'''DO''' MAX LASTARG MIN
'''IF''' z 0 > OVER 1 > OR '''THEN'''
1 OVER '''FOR''' j
s j GET
s DUP SIZE j - 1 + GET
+ 's' j ROT PUT
'''NEXT'''
s 1 OVER SIZE 4 PICK SUB 's' STO
'z' OVER STO-
SWAP OVER -
'''ELSE''' 1 SF '''END'''
'''UNTIL''' 1 FS? '''END'''
DROP2 s ∑LIST
» '<span style="color:blue">EUCLRYTHM</span>' STO
 
5 13 <span style="color:blue">EUCLRYTHM</span>
 
{{out}}
<pre>
1: "1001001010100"
</pre>
 
=={{header|Ruby}}==
{{trans|Python}}
<syntaxhighlight lang="Ruby">
def e(k, n)
s = (0...n).map { |i| i < k ? [1] : [0] }
 
d = n - k
n = [k, d].max
k = [k, d].min
z = d
 
while z > 0 or k > 1
k.times do |i|
s[i].concat(s[-1 - i])
end
s = s[0...-k]
z -= k
d = n - k
n = [k, d].max
k = [k, d].min
end
 
s.flatten.join
end
 
puts e(5, 13)
# Should output: 1001010010100
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
=={{header|Rust}}==
{{trans|Python}}
<syntaxhighlight lang="">
fn e(k: i32, n: i32) -> Vec<u8> {
let mut s: Vec<Vec<u8>> = (0..n)
.map(|i| if i < k { vec![1] } else { vec![0] })
.collect();
 
let mut d = n - k;
let mut n = std::cmp::max(k, d);
let mut k = std::cmp::min(k, d);
let mut z = d;
 
while z > 0 || k > 1 {
for i in 0..(k as usize) {
let mut extension = s[s.len() - 1 - i].clone();
s[i].append(&mut extension);
}
s.truncate(s.len() - (k as usize));
z -= k;
d = n - k;
n = std::cmp::max(k, d);
k = std::cmp::min(k, d);
}
 
s.into_iter().flatten().collect()
}
 
fn main() {
let result = e(5, 13);
let result_string: String = result.into_iter().map(|digit| digit.to_string()).collect();
println!("{}", result_string);
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
=={{header|Scala}}==
{{trans|Java}}
<syntaxhighlight lang="Scala">
object SequenceGenerator {
 
def main(args: Array[String]): Unit = {
val result = generateSequence(5, 13)
println(result) // Should print 1001010010100
}
 
def generateSequence(k: Int, n: Int): String = {
var s = List.fill(n)(List(0)).zipWithIndex.map { case (list, index) =>
if (index < k) List(1) else List(0)
}
 
var (d, nVar, kVar, z) = (n - k, math.max(k, n - k), math.min(k, n - k), n - k)
 
while (z > 0 || kVar > 1) {
for (i <- 0 until kVar) {
s = s.updated(i, s(i) ++ s(s.size - 1 - i))
}
s = s.take(s.size - kVar)
z -= kVar
d = nVar - kVar
nVar = math.max(kVar, d)
kVar = math.min(kVar, d)
}
 
s.flatten.mkString
}
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
</pre>
 
=={{header|Sidef}}==
{{trans|Ruby}}
<syntaxhighlight lang="ruby">func e(k, n) {
var s = (^n -> map { |i| i < k ? [1] : [0] })
 
var d = (n - k)
n = max(k, d)
k = min(k, d)
var z = d
 
while ((z > 0) || (k > 1)) {
k.times { |i|
s[i] += s[-1 - i]
}
s = s.first(-k)
z -= k
d = (n - k)
n = max(k, d)
k = min(k, d)
}
 
s.flat.join
}
 
say e(5, 13)</syntaxhighlight>
{{out}}
<pre>
1001010010100
</pre>
 
=={{header|Swift}}==
{{trans|Java}}
<syntaxhighlight lang="Swift">
import Foundation
 
class SequenceGenerator {
 
static func generateSequence(k: Int, n: Int) -> String {
var s = Array(repeating: [Int](), count: n)
 
for i in 0..<n {
if i < k {
s[i].append(1)
} else {
s[i].append(0)
}
}
 
var d = n - k
var nVar = max(k, d)
var kVar = min(k, d)
var z = d
 
while z > 0 || kVar > 1 {
for i in 0..<kVar {
s[i].append(contentsOf: s[s.count - 1 - i])
}
s = Array(s[0..<(s.count - kVar)])
z -= kVar
d = nVar - kVar
nVar = max(kVar, d)
kVar = min(kVar, d)
}
 
let result = s.flatMap { $0 }.map { String($0) }.joined()
return result
}
}
 
// Example usage
let result = SequenceGenerator.generateSequence(k: 5, n: 13)
print(result) // Should print 1001010010100
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
 
=={{header|Wren}}==
{{trans|Python}}
{{libheader|Wren-seq}}
<syntaxhighlight lang="wren">import "./seq" for Lst
 
var E = Fn.new { |k, n|
var s = (0...n).map { |i| i < k ? [1] : [0] }.toList
var d = n - k
n = k.max(d)
k = k.min(d)
var z = d
while (z > 0 || k > 1) {
for (i in 0...k) s[i].addAll(s[-1 - i])
s = s[0...-k]
z = z - k
d = n - k
n = k.max(d)
k = k.min(d)
}
return Lst.flatten(s)
}
 
System.print(E.call(5, 13).join())</syntaxhighlight>
 
{{out}}
<pre>1001010010100</pre>
 
 
=={{header|Zig}}==
{{trans|Python}}
<syntaxhighlight lang="Zig">
const std = @import("std");
const allocator = std.heap.page_allocator;
 
pub fn main() !void {
const result = try generateSequence(5, 13);
for (result) |item| {
std.debug.print("{}", .{item});
}
std.debug.print("\n", .{});
}
 
fn generateSequence(_k: i32, _n: i32) ![]i32 {
var k=_k; var n=_n;
 
var s = std.ArrayList(std.ArrayList(i32)).init(allocator);
 
for (0..@as(usize, @intCast(n))) |i| {
var innerList = std.ArrayList(i32).init(allocator);
if (i < k) {
try innerList.append(1);
} else {
try innerList.append(0);
}
try s.append(innerList);
}
 
var d:i32 = n-k;
n = @max(k, d);
k = @min(k, d);
var z = d;
 
while (z > 0 or k > 1) {
for (0..@as(usize, @intCast(k))) |i| {
var lastList = s.items[s.items.len - 1 - i];
for (lastList.items) |item| {
try s.items[i].append(item);
}
}
s.shrinkRetainingCapacity(s.items.len - @as(usize, @intCast(k)));
z -= k;
d = n - k;
n = @max(k, d);
k = @min(k, d);
}
 
var result = std.ArrayList(i32).init(allocator);
 
for (s.items) |sublist| {
for (sublist.items) |item| {
try result.append(item);
}
}
return result.toOwnedSlice();
}
</syntaxhighlight>
{{out}}
<pre>
1001010010100
 
</pre>
511

edits