你是个糟糕的音乐家。你从不费心去学习如何计算节奏。为了弥补这个缺点,您决定编写一个程序,它将告诉您如何在任何给定的时间签名中计数。你仍然是一个糟糕的音乐家,但你至少可以假装你能数节奏。
给定时间签名,输出所述时间签名的可能计数模式。
For那些不知道音乐术语的人:A 测量时间签名是一段音乐中的一组数字,它告诉你在一次音乐中有多少次节拍,哪一个音符长度是节拍。例如,一个3/4时间签名告诉您,每个度量都有3拍子,四分之一音符(4)是节拍。一个11/16 T.S.告诉你,在一种度量中有11十六音节拍(16)。数数3/4可以简单地算作"1 2 3"。11/16可以算作"1 la li 2 e & a 3 e & a" (这比数到11更直观;我稍后会给它下定义)。重要的是要注意,几乎所有T.S的底部数都是2。“S是2的力量。对于这个挑战,我们将忽略不理性的T.S。‘S。我们也不会看T.S。’以大于16的节拍来衡量。”
生成计数模式的How:带有X/1、X/2或X/4的时间签名可以简单地用数字来计数(4/2可以算作"1 2 3 4")。使用X/8或X/16的S更棘手一些。可以通过将节拍组合在一起形成更大的节拍来计算(6/8,尽管有6‘节拍’,但通常被视为有三重奏细分的2节拍)。在这个挑战中,拍子应该分组为 1**(**"1"**),** 2**(**"1 &"**),** 3**(**"1 la li"**),或者** 4**(**"1 e & a"**)**对于X/8,3组应该优先于2,但是如果可能的话,应该避免1。(对于7/8,尽管3+3+1优先考虑3's,3+2+2更好,因为它避免了1)对于X/16,3组应该优先于4,但是如果可能的话,应该避免2和1。(对11/16来说,尽管3+3+3+2优先考虑3的S,但3+4+4更好,因为它避免了2),重要的是要注意到,分组的顺序并不重要,即3+2和2+3都是5/8__的可接受分组。这在正常情况下是很重要的,但你是个糟糕的音乐家。还要注意的是,T.S.'s‘比1/8’大‘可以完全用2_S和3_’D59_‘来分类;T.S.’比5/16更大‘可以完全用3_和4_分类。
呼!真是一口!
You将以时间签名作为输入。可以在合理范围内格式化(使用常识!)。You将输出一个可接受的计数模式。这将是一串计数(1、la、&等)。被空格隔开。您的输出不应该包括前导或尾随空格。Test案例:澄清一下,“分子”是正整数,“分母”是1__、2__、4__、8__或16__。同样,请注意一些T.S.'s有多个有效的输出。
"Input", "Output"
"1/1", "1"
"3/2", "1 2 3"
"4/4", "1 2 3 4"
"1/8", "1"
"10/8", "1 la li 2 la li 3 & 4 &"
"2/16", "1 &"
"5/16", "1 la li 2 &"
"29/16", "1 la li 2 la li 3 la li 4 la li 5 la li 6 la li 7 la li 8 e & a 9 e & a"
"Input", "Invalid Output"
"6/4", "1 la li 2 la li"
"7/8", "1 la li 2 la li 3"
"10/8", "1 & 2 & 3 & 4 & 5 &"
"12/16", "1 e & a 2 e & a 3 e & a"这是密码-高尔夫,所以以字节为单位的最短答案获胜!
发布于 2022-05-30 19:00:56
Œṗi@€o⁸Ṁ;ṢƊɗÞ:5×6Œ?Ɗ}Ḣị““&“la li“e & a”˹Ƈ€K€K接受节拍和音符长度并打印结果的完整程序。
Œṗi@€o⁸Ṁ;ṢƊɗÞ:5×6Œ?Ɗ}Ḣị“...”˹Ƈ€K€K - Main Link: beats, B; note-length L
Œṗ - all integer partitions of B
} - using L:
Ɗ - last three links as a monad - f(L):
e.g. 1,2,4,8,16
:5 - integer divide by 5 -> 0,0,0,1,3
×6 - multiply by six -> 0,0,0,6,18
Œ? - shortest permutation of [1..N] which has that
lexicographic 1-based-index in a list of all
permutaions of [1..N]
-> [],[],[],[3,2,1],[3,4,2,1]
(our ordering)
Þ - sort (the partitions) by:
ɗ - last three links as a dyad - f(Partition, Ordering)
€ - for each (run-length, R) in the partition:
i@ - first 1-indexed index of R in Ordering or 0
o⁸ - logical OR with the Partition (vectorises)
(replaces 0s with the larger, original Rs)
Ɗ - last three links as a monad - f(X):
Ṁ - maximum of X
Ṣ - sorted X
; - concatenate
Ḣ - head
“...” - ["", "&", "la li", "e & a"]
ị - index into
Ė - enumerate (i.e. [A, B, ...] -> [[1,A],[2,B],...])
€ - for each:
¹Ƈ - keep truthy (i.e. drop the "" entries)
K€ - join each with spaces
K - join with spaces
- implicit print发布于 2022-05-30 22:56:45
NθNη⪫E⊟Φ…⟦Eθ¹E÷⁺²θ³⁻³‹ι﹪±θ³E÷θ³⁺³‹ι﹪θ³⟧⊕÷η⁸⁼θΣι⁺⊕κ§⪪“/^e)R⁼0⁷Vⅉ8⮌✳”,ι 在网上试试!链接是详细的代码版本。解释:
NθNη输入时间签名。
⟦Eθ¹E÷⁺²θ³⁻³‹ι﹪±θ³E÷θ³⁺³‹ι﹪θ³⟧尝试创造三种拍子模式:所有的单一拍子,尽可能多的三组和其余的两组,尽可能多的三组和其余的四组。
…...⊕÷η⁸根据分母的不同,只考虑前两种模式。
Φ...⁼θΣι只保留那些实际上相当于整个酒吧的句型。(这防止了例如5/16试图使用三组和四组)。
⪫E⊟...⁺⊕κ§⪪...,ι 取最后一个成功模式,用其节拍数和组后缀替换通过拆分压缩字符串e & a,, &, la li获得的组尾,最后用空格连接组。
https://codegolf.stackexchange.com/questions/247985
复制相似问题