Bạn có biết rằng thuật toán Euclide có khả năng tạo ra nhịp điệu âm nhạc truyền thống ? Chúng ta sẽ thấy cách thức hoạt động của nó bằng cách mô tả một thuật toán tương tự, nhưng hơi khác với thuật toán trong bài báo.
Chọn một số nguyên dương n, tổng số nhịp và số nguyên dương k, số lượng nhịp được phát ra (ghi chú). Chúng ta có thể nghĩ về nhịp điệu như một chuỗi các nbit, ktrong đó là 1s. Ý tưởng của thuật toán là phân phối các số 1 càng nhiều càng tốt giữa các số 0.
Ví dụ: với n = 8và k = 5, chúng tôi bắt đầu với 5 cái và 3 số 0, mỗi số theo thứ tự riêng của nó:
[1] [1] [1] [1] [1] [0] [0] [0]
Tại bất kỳ thời điểm nào, chúng ta sẽ có hai loại trình tự - các loại ở đầu là các chuỗi "cốt lõi" và các loại ở cuối là các chuỗi "còn lại". Ở đây các lõi là [1]s và phần còn lại là [0]s. Miễn là chúng tôi có nhiều hơn một chuỗi còn lại, chúng tôi phân phối chúng trong số các lõi:
[1 0] [1 0] [1 0] [1] [1]
Bây giờ cốt lõi là [1 0]và phần còn lại là [1], và chúng tôi phân phối lại:
[1 0 1] [1 0 1] [1 0]
Bây giờ cốt lõi là [1 0 1]và phần còn lại là [1 0]. Vì chúng tôi chỉ có một chuỗi còn lại, chúng tôi dừng lại và nhận chuỗi
10110110
Đây là những gì nó nghe như, lặp đi lặp lại 4 lần:
Đây là một ví dụ khác, với n = 16và k = 6:
[1] [1] [1] [1] [1] [1] [0] [0] [0] [0] [0] [0] [0] [0] [0] [0]
[1 0] [1 0] [1 0] [1 0] [1 0] [1 0] [0] [0] [0] [0]
[1 0 0] [1 0 0] [1 0 0] [1 0 0] [1 0] [1 0]
[1 0 0 1 0] [1 0 0 1 0] [1 0 0] [1 0 0]
[1 0 0 1 0 1 0 0] [1 0 0 1 0 1 0 0]
1001010010010100
Lưu ý cách chúng tôi kết thúc ở bước cuối cùng với hai chuỗi cốt lõi và không có chuỗi còn lại. Đây là, lặp lại hai lần:
Đầu vào
Bạn có thể viết một hàm hoặc một chương trình đọc toàn bộ từ STDIN, dòng lệnh hoặc tương tự. Đầu vào sẽ là hai số nguyên dương nvà k <= n, mà bạn có thể giả sử theo thứ tự.
Đầu ra
Nhiệm vụ của bạn là xuất ra nhịp điệu được tạo dưới dạng một nchuỗi ký tự dài. Bạn có thể chọn bất kỳ hai ký tự ASCII có thể in riêng biệt (0x20 đến 0x7E) để thể hiện các ghi chú và phần còn lại.
Các trường hợp thử nghiệm
Các trường hợp kiểm tra sau đây sử dụng xđể thể hiện các ghi chú và .s để thể hiện phần còn lại. Đầu vào được đưa ra theo thứ tự n, sau đó k.
1 1 -> x
3 2 -> xx.
5 5 -> xxxxx
8 2 -> x...x...
8 5 -> x.xx.xx.
8 7 -> xxxxxxx.
10 1 -> x.........
11 5 -> x.x.x.x.x..
12 7 -> x.xx.x.xx.x.
16 6 -> x..x.x..x..x.x..
34 21 -> x.xx.x.xx.xx.x.xx.x.xx.xx.x.xx.x.x
42 13 -> x...x..x..x..x...x..x..x..x...x..x..x..x..
42 18 -> x..x.x.x..x.x.x..x.x.x..x.x.x..x.x.x..x.x.
Chấm điểm
Đây là mã golf, vì vậy mã trong ít byte nhất sẽ thắng.
q~\,f>.