Saya seorang musisi, dan saya membutuhkan lebih banyak polyrhythms dalam hidup saya!
Polyrhythm terjadi dalam musik (dan di alam) ketika dua peristiwa (tepukan, catatan, kunang-kunang berkedip dll.) Terjadi pada dua interval reguler yang berbeda. Dua jenis peristiwa terjadi beberapa kali dalam interval yang sama.
Jika saya mengetuk dengan tangan kiri saya dua kali, dan dengan tangan kanan saya 3 kali, dalam ruang waktu yang sama, tampilannya sedikit seperti ini:
------
R . . .
L . .
Tanda hubung di bagian atas menunjukkan panjang pola polimmik, yang merupakan kelipatan umum terendah atau 2 dan 3. Ini dapat dipahami sebagai titik di mana pola berulang.
Ada juga 'metaritme', yang merupakan pola yang dihasilkan ketika kedua tangan mengetuk:
------
R . . .
L . .
M . ...
Ini adalah polyrhythm yang sederhana, dan sangat umum, dengan rasio 3: 2.
Katakan saja saya tidak ingin melakukan polyrhythm sederhana yang dapat saya kerjakan di kepala saya, jadi saya perlu sesuatu untuk menyelesaikannya untuk saya. Saya bisa melakukannya dalam bentuk panjang di atas kertas, atau ...
Aturan:
- Tulis beberapa kode untuk menghasilkan dan menampilkan diagram polyrhythm, seperti dijelaskan di atas.
- Bahasa lama apa saja, cobalah untuk byte paling sedikit.
- Kode Anda mengambil dua argumen:
- Jumlah keran dengan tangan kiri (bilangan bulat positif)
- Jumlah keran dengan tangan kanan (bilangan bulat positif)
- Ini akan menentukan panjangnya, yang merupakan kelipatan umum terendah untuk kedua argumen.
- Baris teratas akan terdiri dari dua karakter spasi putih diikuti oleh tanda hubung menampilkan panjang (panjang * '-')
- Baris kedua dan ketiga akan menunjukkan pola untuk tangan kanan dan kiri:
- Ini akan mulai dengan R atau L, menunjukkan tangan yang mana, diikuti oleh spasi.
- Interval untuk tangan itu adalah panjang dibagi dengan argumennya.
- Ketukan akan dimulai pada karakter ketiga, dilambangkan dengan karakter apa pun yang Anda pilih. Mulai saat itu akan menampilkan karakter 'interval' karakter yang sama terpisah.
- Tidak akan lebih panjang dari garis panjang.
- Baris keempat adalah metaritme:
- Ini akan mulai dengan huruf besar M, diikuti oleh spasi.
- Dari karakter ketiga dan seterusnya, itu akan menampilkan karakter (karakter apa pun yang Anda pilih) di setiap posisi di mana ada ketukan di kanan atau di tangan kiri.
- Trailing whitespace tidak relevan.
Kasus uji:
r = 3, l = 2
------
R . . .
L . .
M . ...
r = 4, l = 3
------------
R . . . .
L . . .
M . .. . ..
r = 4, l = 5
--------------------
R . . . .
L . . . . .
M . .. . . . ..
r = 4, l = 7
----------------------------
R . . . .
L . . . . . . .
M . . .. . . . .. .
r = 4, l = 8
--------
R . . . .
L ........
M ........
Selamat bermain golf!
r
danl
sebagai dua nilai yang terpisah? Bisakah kita menerima array dua elemen saja, misalnya? Bagaimana dengan urutan mereka, apakah itur
diikuti dengan ketatl
?Jawaban:
JavaScript (ES6), 131 byte
Output
0
sebagai karakter tap .Cobalah online!
Bagaimana?
sumber
Java 11,
226234233219 byteAgak panjang; sayang sekali Java tidak memiliki
lcm()
fungsi. Coba online di sini (TIO belum memiliki Java 11, jadi ini menggunakan metode pembantu bukanString.repeat()
).Versi awal saya mengambil interval antara ketukan alih-alih jumlah ketukan. Diperbaiki sekarang Terima kasih kepada Kevin Cruijssen untuk bermain golf 1 byte.
Tidak Disatukan:
sumber
?".":" "
ke?'.':32
.Python 2 ,
187185183174166156148147145 byteDigunakan
-
sebagai karakter ketukCobalah online!
Diselamatkan:
sumber
[i%(w/y)and i%(w/z)>0]
bisa jadi[i%(w/y)!=0<i%(w/z)]
.Perl 6 ,
858078 byte-2 byte terima kasih kepada Jo King.
Cobalah online!
Mengembalikan daftar empat baris.
sumber
Python 2 ,
185 228 223 234249 byteCobalah online!
sumber
r=4, l=8
bekerja dengan baik untuk saya15,25
, itu memberi375
, tetapi seharusnya75
.i%r+i%l+0**i<1
. Selain itu, Anda dapat menghapus versi kode sebelumnya, karena kode tersebut akan disimpan dalam riwayat edit siapa pun yang ingin melihatnyaJelly , 32 byte
Cobalah online!
Mengambil input sebagai daftar
[L,R]
.sumber
C (gcc), 204 byte
Port jawaban Java saya . Panggil dengan
f(number_of_right_hand_taps, number_of_left_hand_taps)
. Cobalah online di sini .sumber
Pyth, 53 byte
Pasti kamar untuk golf. Akan melakukannya ketika saya punya waktu.
Coba di sini
Penjelasan
sumber
C # (Visual C # Interactive Compiler) , 254 byte
Golf Cobalah secara online!
Tidak disatukan
Kode lengkap
Rilis
254 bytes
- Solusi awal.Catatan
sumber
Arang , 52 byte
Cobalah online!Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Hitung LCM dari input dengan mengambil kelipatan pertama
R
yang habis dibagiL
.Cetak LCM, yang secara otomatis menampilkan baris yang diperlukan
-
s yang . Kemudian pindah untuk mencetak ritme dari kanan ke kiri.Lingkarkan angka-angka dari LCM ke 0 dan buat array daftar yang mewakili ketukan tangan kanan dan kiri.
Lingkari ketukan dan tambahkan metarhythm.
Cetak ketukan terbalik ke bawah, tetapi karena ini adalah array, mereka berakhir ke kiri.
Cetak tajuk.
sumber
Ruby ,
130126 byteCobalah online!
sumber
Python 2 , 117 byte
Cobalah online!
sumber
Pyth, 49 byte
Mengharapkan input dalam formulir
[r,l]
. Penggunaan-
untuk menampilkan ketukan. Cobalah online di sini , atau verifikasi semua uji sekaligus di sini .sumber
R ,
161149146 byteCobalah online!
Saya pasti merasa ada ruang untuk perbaikan di sini, tetapi saya mencoba beberapa pendekatan berbeda dan ini adalah satu-satunya yang macet.
Menyingkirkan definisi fungsi internal akan membuat saya cukup bahagia, dan saya mencoba banyak restrukturisasi kucing () untuk mewujudkannya.Nevermind, begitu saya memposting saya menyadari apa yang bisa saya lakukan. Masih pasti beberapa penghematan efisiensi dapat ditemukan.Ada fungsi LCM lain di perpustakaan dengan nama yang lebih pendek, tetapi TIO memiliki angka dan saya menganggapnya lebih berharga saat ini.
sumber
C ++ (gcc) , 197 byte
Cobalah online!
sumber
++p%a+p%b
alih-alih++p%a||p%b