A escala maior (ou escala jônica) é uma das escalas musicais mais usadas, principalmente na música ocidental. É uma das escalas diatônicas. Como muitas escalas musicais, é composta por sete notas: a oitava duplica a primeira com o dobro de sua frequência, de modo que é chamada de oitava mais alta da mesma nota.
As sete notas musicais são:
C, D, E, F, G, A, B , C (repetido por exemplo)
Uma escala maior é uma escala diatônica. Tome a sucessão anterior de notas como uma escala maior (na verdade, é a escala C Maior) . A sequência de intervalos entre as notas de uma escala maior é:
inteiro, inteiro, meio, inteiro, inteiro, inteiro, meio
onde "inteiro" representa um tom inteiro (uma curva vermelha em forma de u na figura) e "metade" representa um semitom (uma linha vermelha quebrada na figura).
Nesse caso, de C a D existe um tom inteiro , de D a E existe um tom inteiro , de E a F existe meio tom, etc ...
Temos dois componentes que afetam a distância do som entre as notas. Estes são o símbolo Sharp (♯) e o símbolo plano (♭).
O símbolo Sharp (♯) adiciona meio-tom à nota. Exemplo. De C a D mencionamos que existe um tom inteiro; se usarmos C♯ em vez de C, então de C♯ a D existe meio-tom.
O símbolo Flat (♭) faz o oposto do símbolo Sharp, subtrai o meio-tom da nota. Exemplo: De D a E mencionamos que existe um tom inteiro, se usarmos Db em vez de D, então de Db a E existe um tom e meio.
Por padrão, de nota a nota existir um tom inteiro, exceto E to F
e B to C
na qual existe apenas meio tom.
Observe que, em alguns casos, o uso de arremessos enarmônicos pode criar um equivalente a uma Escala maior. Um exemplo disso é C#, D#, E#, F#, G#, A#, B#, C#
onde E#
e B#
é enarmônico, mas a escala segue a sequência de uma Escala Maior.
Desafio
Dada uma escala, emita um valor verdadeiro se for uma Escala Maior ou equivalente, caso contrário, emita um valor de falsey.
Regras
- Método de E / S padrão permitido
- Aplicam-se regras de código-golfe padrão
- Você não precisa levar em consideração a oitava nota. Suponha que a entrada seja composta apenas por 7 notas
- Suponha que o duplo plano (♭♭), o dobro agudo (♯♯) ou o sinal natural (♮) não existam
Casos de teste
C, D, E, F, G, A, B => true
C#, D#, E#, F#, G#, A#, B# => true
Db, Eb, F, Gb, Ab, Bb, C => true
D, E, Gb, G, A, Cb, C# => true
Eb, E#, G, G#, Bb, B#, D => true
-----------------------------------------------
C, D#, E, F, G, A, B => false
Db, Eb, F, Gb, Ab, B, C => false
G#, E, F, A, B, D#, C => false
C#, C#, E#, F#, G#, A#, B# => false
Eb, E#, Gb, G#, Bb, B#, D => false
fonte
Respostas:
Perl 6 ,
76656359 bytes-4 bytes graças a Phil H
Experimente online!
Explicação
fonte
Node.js v10.9.0 ,
78767169 bytesExperimente online!
Quão?
Cada notan é convertida em um número negativo em [ - 118 , - 71 ] com:
Que dá:
Calculamos as diferenças aos pares módulo12 entre esses valores.
A menor diferença possível entre duas notas é- 47 , portanto basta adicionar 4 × 12 = 48 antes de aplicar o módulo para garantir um resultado positivo.
'#'
'b'
fonte
JavaScript (Node.js) ,
150131125 bytesExperimente online!
-19 bytes graças a Luis felipe
-6 bytes graças a Shaggy
Ungolfed:
fonte
[...'C0D0EF0G0A0B']
em vez de'C0D0EF0G0A0B'.split('')
e+""
em vez de.toString()
salvar alguns bytesx[1]=='#'|-(x[1]=='b')
em vez dex[1]=='#'?1:(x[1]=='b'?-1:0)
salvar alguns bytes também-10 % 12 == 2
. Embora chegou a pensar que este pode falhar em alguns casos ...Dart ,
198197196189bytesExperimente online!
Porta frouxa do Perl antigo 6 respostas /codegolf//a/175522/64722
Versão antiga :
Dardo , 210 bytes
Experimente online!
Ungolfed:
Um passo inteiro é 2, um quarto é 1. Mod 12, caso você pule para uma oitava mais alta. Repete todas as notas e calcula a diferença entre a i-ésima nota e a décima-primeira nota. Concatena o resultado e deve esperar 221222 (2 inteiros, 1 metade, 3 total).
fonte
i=1
parai=0
pode reduzir um byte, alterandofor(;i<7;i++)
parafor(;++i<7;)
. Além disso, os suportes{}
podem ser removidos em torno desse circuito, ao colocar oj+=...
interior da terceira parte do circuito:for(;++i<7;j+='${(y[0]-y[1])%12}')
. E uma última coisa está mudandoreturn j=='221222';
parareturn'221222'==j;
se livrar do espaço. -6 ( 210 bytes ) após essas modificações.if(k>9)k--;if(k>3)k--;
parak-=k>3?k>9?2:1:0;
ek+=m.length<2?0:m[1]=='#'?1:m[1]=='b'?-1:0;return k;
parareturn m.length<2?k:m[1]=='#'?k+1:m[1]=='b'?k-1:k;
. :)C (gcc) ,
-DA=a[i]
+ 183 = 191 bytesExperimente online!
Baseado na resposta Perl.
Recebe a entrada como uma sequência larga.
Ungolfed:
fonte
[Wolfram Language (Mathematica) + pacote Music`, 114 bytes
Adoro música e achei isso interessante, mas eu estava jogando golfe de verdade quando essa oportunidade de código surgiu, então minha apresentação é um pouco atrasada.
Imaginei que tentaria isso de uma maneira totalmente diferente, utilizando algum conhecimento musical real. Acontece que o pacote de músicas do Mathematica conhece a frequência fundamental das notas nomeadas. Primeiro eu converto a string de entrada em sequência de notas nomeadas. Em seguida, tomo as proporções de cada nota sucessiva e duplico as que são menores que 2 (para dar conta da mudança de oitava). Em seguida, comparo essas proporções com as proporções da escala jônica, que tem aproximadamente uma diferença de frequência de 6% entre as notas de meia nota e 12% entre as notas completas.
Mais da metade dos bytes gastos aqui é para converter a entrada em símbolos nomeados.
Experimente online!
fonte
Python 3 ,
175136134 134114112 bytesExperimente online!
Uma implementação de Python 3 de uma linha.
Obrigado a @Arnauld pela ideia de calcular tons usando divisão e módulo.
Graças a @Jo King por -39 bytes.
fonte
[Python]
269202 bytesMelhorias de
Jo King
:Tente!
Ungolfed, com driver de teste:
fonte
Ruby , 109 bytes
Experimente online!
fonte