Rebol3 Code Examplex


Euclidean rhythm

Distribute a given number of beats as evenly as possible across a fixed number of steps.

Rebol [
    title: "Rosetta code: Euclidean rhythm"
    file:  %Euclidean_rhythm.r3
    url:   https://rosettacode.org/wiki/Euclidean_rhythm
]

generate-sequence: function [
    "Generate a sequence of length n with k ones using the Euclidean algorithm."
    k [integer!] n [integer!]
][
    seq: array/initial n []                      ;; n empty rows
    repeat i n [
        append seq/:i either i <= k [1] [0]      ;; first k rows get 1, rest get 0
    ]
    diff:   n - k
    major:  max k diff                           ;; larger partition
    minor:  min k diff                           ;; smaller partition
    remain: diff                                 ;; steps left to distribute
    while [any [remain > 0  minor > 1]] [
        repeat i minor [
            append seq/:i seq/(n + 1 - i)        ;; append mirror row
        ]
        clear skip seq n: n - minor              ;; drop consumed tail rows, update n
        remain: remain - minor
        diff:   major - minor
        major:  max minor diff
        minor:  min minor diff
    ]
    result: copy ""
    foreach row seq [ append result rejoin row ] ;; flatten
]

print [
    "Euclidean rhythm for (5, 13) is:"
    as-yellow generate-sequence 5 13
]

Output:

Euclidean rhythm for (5, 13) is: 1001010010100