História de fundo [o que não é verdade]
Um piano é configurado assim:
No entanto, no meu piano, todas as teclas pretas estão quebradas!
Ainda quero tocar alguns acordes no meu piano quebrado.
Na música, um acorde é um grupo de notas tocadas juntas. Para permitir a entrada de acordes, primeiro definirei o que é um semitom.
O que é um semitom?
Um semitom é a menor distância na música ocidental. Se você observar a parte superior do piano, verá que geralmente pode passar de uma tecla preta para uma tecla branca ou vice-versa; no entanto, entre B
e C
e E
e F
não há nenhuma chave preta.
O que é um acorde?
Para os propósitos deste desafio, definimos um acorde como um monte de notas com um certo número de semitons entre eles. Por exemplo, vamos dar uma olhada em um 4-3-3
acorde a partir de C
(para pessoas da música, este é um acorde V 7 em Fá maior). Começamos às C
. Contamos até 4 semitons: C#
, D
, D#
, E
. A próxima nota é E
, e contamos 3 semitons depois que: F
, F#
, G
. A próxima nota é G
, e contamos 3 semitons depois que: G#
, A
, Bb
. Então, nós chegamos C-E-G-Bb
. Yay! Mas espere ... Bb
é uma chave preta e eles estão quebrados ... No entanto, se começarmos G
, conseguimos G-B-D-F
! Yay!
Entrada
A entrada é fornecida como uma lista de números inteiros em qualquer formato razoável. Isso representa o acorde como descrito acima.
Resultado
A saída deve ser uma lista de notas nas quais eu posso começar a precisar usar apenas teclas brancas. Isso também pode ser apenas uma sequência de até 7 notas, porque todos os nomes-chave terão um caractere. Você também deve poder ter uma saída vazia.
Casos de teste
input -> output // comments
4 3 -> C F G // this is a major triad
3 4 -> D E A // this is a minor triad
4 3 3 -> G // this is the major-minor seventh chord
3 3 3 -> [empty output] // this is the diminished-diminished seventh chord. All of them use black keys
4 4 -> [empty output] // this is an augmented triad
3 3 -> B // this is a diminished triad
1 -> B E // this is just a minor second
11 -> C F // this is just a major seventh
Outras especificações
- Lacunas padrão proibidas
- Você pode assumir que a entrada possui pelo menos um número inteiro
- Você pode assumir que todos os números inteiros são não negativos e menores que 12 (porque o piano repete a cada 12 notas)
- A saída pode estar em qualquer ordem
Critérios Vencedores
O envio mais curto válido a partir de 15 de abril será aceito.
Respostas:
Gelatina , 25 bytes
Experimente online! ou veja uma suíte de testes
Como?
fonte
MATL , 31 bytes
Obrigado a Jonathan Allan pela correção.
Experimente online! Ou verifique todos os casos de teste .
Explicação
O padrão
2 2 1 2 2 2 1
especifica os intervalos entre as teclas brancas consecutivas. O programa usa um loop que aplica todos os turnos cíclicos a esse padrão básico, a fim de testar cada tecla como uma nota mais baixa potencial do acorde de entrada. Para cada turno, é obtida a soma cumulativa do padrão. Por exemplo, paraB
potencial nota mais baixa, o padrão foi deslocado para1 2 2 1 2 2 2
e sua soma cumulativa é1 3 5 6 8 10 12
.Agora, para ver se isso pode suportar um
4 3 3
acorde, calculamos a soma cumulativa dos intervalos de acorde, que é4 7 10
; reduza-o via módulo 12 baseado em 1 (um intervalo de14
daria2
); e verifique se esses números são todos membros dos valores permitidos1 3 5 6 8 10 12
. Esse não é o caso neste exemplo. Se fosse esse o caso, exibiríamos a cartaB
.A correspondência entre turnos cíclicos e letras de saída é definida pela sequência
'BAGFEDC'
. Isso indica que'B'
(primeiro caractere) corresponde a um deslocamento cíclico de1
;'A'
(segundo caractere) corresponde a uma mudança cíclica em2
etc.fonte
Mathematica, 110 bytes (codificação ISO 8859-1)
Define uma função unária
±
usando uma lista de números inteiros como entrada (sem restrições no tamanho ou sinais dos números inteiros, na verdade) e retorna uma lista de cadeias de caracteres de um caractere. Por exemplo,±{3,4}
retorna{"A","D","E"}
."A#BC#D#EF#G#"~StringTake~{Mod[#,12,1]}&/@#
é uma função que transforma uma lista de números inteiros nos nomes de notas correspondentes, exceto que#
significa qualquer tecla preta. Isso é aplicado a cada elemento deAccumulate[i~Prepend~#]&/@Range@12
, que cria uma lista de valores de notas a partir da lista de entrada de intervalos de notas, começando com cada nota possível de 1 a 12. Filtramos todas as listas de nomes de notas que contêm"#"
usingSelect[...,FreeQ@"#"]
e, em seguida, retorne a primeira nota em cada lista restante usando#&@@@
.fonte
+/-
símbolo.Accumulate[i~Prepend~#]&
porque, caso contrário, haveria um conflito de curry. Sinta-se livre para encontrar uma solução alternativa!Python 2,
159155 bytes(Postando isso depois de verificar se há um envio válido mais curto que este)
Praticamente apenas a solução trivial. Entradas como uma lista de números inteiros e saídas com cada caractere em uma linha individual.
-4 bytes removendo uma variável desnecessária
fonte
JavaScript (ES6),
727168 bytesPassa por cada tecla, omitindo as teclas pretas, e depois verificando se a soma acumulada de semitons nunca chega a uma tecla preta.
Editar: salvou 3 bytes graças a @Arnauld.
fonte