Entrada
O símbolo de qualquer acorde triádico (consulte http://en.wikipedia.org/wiki/Chord_(music)#Triads ).
Saída
As notas que constituem o acorde dado.
Exemplos
Entrada: AM
Saída:A C# E
Entrada: C#m
Saída:C# E G#
Entrada: Db+
Saída:C# F A
Entrada: C0
Saída:C D# F#
Bônus
-50 se você também pode lidar com sétimos acordes
-150 para realmente tocar o som do acorde
-150 para usar caracteres imprimíveis para mostrar como tocar o acorde em um piano; exemplo para AM
:
┌─┬─┬┬─┬─┬─┬─┬┬─┲┱─┬─┬─┲━┱┬─┲━┱─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┲┛┗┱┘ │ ┗┯┛└┲┛ ┃ └┬┘└┬┘└┬┘ │
│ │ │ │ │ ┃ ┃ │ │ ┃ ┃ │ │ │ │
└──┴──┴──┴──┴──┺━━┹──┴──┴──┺━━┹──┴──┴──┴──┘
-100 para usar caracteres imprimíveis para mostrar como tocar o acorde em uma guitarra; exemplo para AM
:
x o o o o o
┌───┬───┬───┬───┬───┐
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ █ █ █ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
(consulte https://en.wikipedia.org/wiki/Box-drawing_character )
Regras
O resultado deve ser um programa ou script de linha de comando.
A entrada e a saída podem ser de qualquer forma, desde que sigam um padrão de notação musical.
Uma representação de violão ou piano é considerada válida se e somente se contiver as três (triádicas) ou as quatro (sétimas) notas necessárias e nada mais. A mesma nota pode estar presente várias vezes no acorde.
Bibliotecas externas não são permitidas, exceto para geração de som (nesse caso
#include
, asimport
diretivas ... não são adicionadas à contagem de caracteres).Este é o código de golfe, o código mais curto vence!
Um pouco de teoria musical ...
Na música tonal ocidental moderna, cada oitava é composta por doze notas sucessivas, frequentemente observadas:
A
A#
B
C
C#
D
D#
E
F
F#
G
G#
Ou:
La
La#
Si
Do
Do#
Re
Re#
Mi
Fa
Fa#
Sol
Sol#
Neste sistema, consideramos que duas notas sucessivas (por exemplo , A
e A#
, ou E
e F
) são separadas por um semitom. Além disso, as notas são uma espécie de "loop": o que se segue imediatamente G#
é A
.
Um acorde é constituído por algumas (2, 3, 4, às vezes mais) notas que "soam bem juntas". Por exemplo, acordes triádicos contêm três notas diferentes e acordes da sétima contêm quatro notas diferentes.
Vamos definir os quatro acordes triádicos como:
Tríade maior : contém a raiz do acorde (nesta pergunta, a nota dada como entrada), o terço maior da raiz (4 semitons acima da raiz) e o quinto perfeito para a raiz (7 semitons acima da raiz) ); isso pode ser simbolizado 0-4-7
Tríade menor , simbolizada 0-3-7
Tríade aumentada , simbolizada 0-4-8
Tríade diminuída , simbolizada 0-3-6
Assim, por exemplo, se você quiser fazer uma tríade maior C , observou C
, CM
, Cmaj
, você vai precisar de três observou:
- 0: a raiz , neste caso, um
C
- 4: o terço menor , 4 semitons acima da raiz; isso é um
E
- 7: o quinto perfeito , 7 semitons acima da raiz: a
G
Isto é o que a 0-4-7
, 0-3-7
, 0-4-8
e 0-3-6
notações usadas acima de média! Para os sétimos acordes, use o seguinte padrão:
Por hoje é isso! Agora, surpreenda-me com um código incrível ... Se você tiver alguma dúvida, adicione alguns comentários abaixo.
Db+
é queDb F A
não há D # ou G lá. Talvez seja um pouco mais teoria do que o necessário, as fórmulas eram a parte importante. Se você realmente deseja incluir todos os oito dos sétimos acordes listados na wikipedia, você deve especificar a entrada. Presumo que a produção artística do piano e da guitarra seja flexível.Respostas:
BBC BASIC
Emulador em bbcbasic.co.uk
Rev 1, 340 - 150 teclado - 150 jogando = 40
Aqui está a versão mais recente, na qual eu consegui incluir os seguintes aprimoramentos enquanto aumentava apenas mais alguns caracteres.
A entrada pode ser editada confortavelmente na tela antes de pressionar return (eu estava usando GET $ antes para obter pressionamentos de tecla únicos, porque o BBC Basic não permite que você acesse um único caractere de uma string, como se a string fosse uma matriz. volumosa função MID $ para extrair uma sequência de um caractere de dentro da sequência.
Ambos os lados do teclado são exibidos, bem como a linha completa entre E e F.
Para compensar os caracteres adicionados pelo texto acima, reorganizei o programa para eliminar declarações de impressão desnecessárias e excluí alguns espaços em branco que, à primeira vista, pareciam que não podiam ser excluídos. No BBC Basic, todas as funções incorporadas são palavras reservadas, e você pode colocar um nome de variável antes delas, sem espaço entre elas. Os nomes de variáveis não podem começar com uma palavra reservada. Para tornar o programa menos confuso para ler, alterei todas as variáveis para minúsculas.
Embora a apresentação pareça muito melhor, o programa a seguir já está
totalmente completo.(Veja a correção abaixo.) Geralmente, novas linhas e dois pontos são intercambiáveis, exceto quando uma instrução IF é usada. Nesse caso, todas as instruções na mesma linha (separadas por dois pontos) são executadas condicionalmente. As instruções após a nova linha não são controladas pelo FI e sempre serão executadas.Programa rev 1 340 caracteres
CORREÇÃO: O BASIC da BBC de RT Russell para Windows permite eliminar algumas novas linhas e dois pontos, reduzindo o total para 327, veja abaixo. Também simboliza as palavras-chave em caracteres únicos antes de salvar, reduzindo-o para 279.
Saída rev 1
Rev 0, 337 - 150 teclado - 150 jogando = 37Esse é um conceito semelhante à minha resposta do Arduino, mas eu sempre soube que poderia vencer essa contagem de bytes com o básico da BBC. Apenas reconhece objetos cortantes, mas considera B # inválido, você deve colocar C. Isso poderia ser corrigido se realmente fosse considerado importante.
Abandonei a ideia do violão e me concentrei em melhorar o teclado. Agora ele funciona de C a B, e eu adicionei no lado esquerdo do teclado e a linha entre E e F. Isso custa 28 caracteres. O lado direito não seria muito mais.
Aqui estão alguns exemplos de saída, um acorde diminuído de A # (que tem um som bastante estranho nessa inversão) e um acorde maior de B. Observe que a entrada não é ecoada na tela. Conforme a resposta do Arduino, gire a tela no sentido anti-horário para ver.
Versão ungolfed
fonte
Como você pode ver, eu não tentei jogar golfe. Eu sou um nerd de música, e uma das minhas irritações é quando as pessoas escrevem coisas usando as enarmônicas erradas (por exemplo, dizendo que um acorde diminuído de C é CD # F # em vez de C Eb Gb), então eu escrevi este programa que obtém as enarmônicas direita. Faz isso representando cada nota como o número de quintos perfeitos acima de F.
Pelo que vale a pena, se você quiser distinguir enarmônicos, qualquer intervalo musical pode ser bem representado em um programa de computador como um número de quintos perfeitos e um número de oitavas. Um quarto aumentado, por exemplo, é de 6 quintos e -3 oitavas perfeitas, e um quinto diminuído é de -6 quintos perfeitos e 4 oitavas.
Haskell, 441 caracteres
Algumas invocações de exemplo:
fonte
Arduino
A entrada / saída é enviada / recebida do Arduino por uma porta COM. Um usuário pode interagir com isso por meio de um terminal ou do monitor serial no IDE do Arduino. Como você deve ter adivinhado pela minha escolha de plataforma, estou planejando incluir a execução real do acorde (embora ainda não o tenha feito).
Eu lidei com o bônus do teclado com sucesso e tentei lidar com a guitarra, com sucesso limitado.
A caixa de acordes tem 130 bytes, o que é muito longo para valer a pena. Portanto, tentei de outra maneira, apenas imprimindo o estilo Tab dos números de traste. Atualmente, são 81 bytes para um bônus de 81-100 = -19. Se essa abordagem for considerada válida, posso tentar melhorá-la.
Os acordes utilizados são todos do tipo D, com a raiz na 2ª corda, o quinto na 3ª corda e o terceiro na 1ª e na 4ª cordas. As cordas 5 e 6 não são usadas e eu as marquei com Xs à direita da caixa de acordes (a esquerda seria mais usual, mas exemplos marcados à direita podem ser encontrados).
Como o programa considera F como a nota mais baixa (para compatibilidade com o teclado, ao mesmo tempo que evita trastes excessivamente altos com esse formato de acorde), o acorde mais alto é um E (com raiz no 17º traste). Veja exemplo de saída.
O teclado é mais bem sucedido em termos de golfe. É executado a partir de FE em vez de CB pelas razões descritas acima. Ele deve ser visualizado girando a tela 90% no sentido anti-horário, quando você pode ver claramente os contornos das notas pretas e a demarcação entre as notas brancas com
---
. A linha entre B e C pode ser estendida com alguns____
por mais alguns bytes.Vou tentar tocar as notas a seguir. Isso será interessante porque, embora eu acredite que o Arduino Uno tenha 3 temporizadores internos, apenas uma nota de cada vez pode ser tocada usando o comando de tom interno. Existe uma função de biblioteca externa que usa todos os temporizadores de hardware (que atrapalham o serial, mas não será necessário nesse estágio.) Como alternativa, posso tentar produzir os tons no software.
Se eu for bem-sucedido com isso, vou apostar, mas acho que não será o vencedor geral.
Código ungolfed
Saída de amostra Quanto menor o espaçamento entre as linhas do texto, melhor será a aparência. Portanto, parece ótimo quando estou editando a postagem, mas horrível na caixa cinza após a publicação. Em vez disso, publiquei uma captura de tela do monitor serial do Arduino, com espaçamento intermediário entre linhas (e, portanto, com qualidade de exibição).
fonte
Python3 - 315 caracteres
Primeira vez em codegolf! Suporta apenas acordes menores, maiores, diminuídos e aumentados no momento.
fonte
'C C# D D# E F F# G G# A A# B'.split(' ')
vez de sua matriz literal para salvar alguns bytes.if('#'in a):j+=1
->if'#'in a:j+=1
= 2 caracteres a menos para cada instrução. A alteraçãoy
para umarange()
expressão também salva algo. Bem vinda! (e lembre-se de que as novas linhas também contam;))'C C# D D# E F F# G G# A A# B'.split()
;) #y
para armazenar[1,2,4,5,6]
, por que você não pulay
e substitui a linha 4 porfor i in[1,2,4,5,6]:
? De qualquer forma, bem-vindo ao codegolf e espero que você se divirta aqui.Python 506 (unicode como 1 caractere) -150 (som) -150 (teclado) = 206
Para reprodução de som, ele usa
pygame.midi
. Observe que opygame.midi.get_default_output_id()
método não funciona muito bem. Assim, você pode tentar mudar a linhao=Output(get_default_output_id())
parao=Output(1)
,o=Output(2)
, etc. Normalmente, o valor correto é entre 0 e 5.Resultados
fonte
J - 82 char
Independente, lê da entrada do console. Se você precisar de stdin, altere a final
1
para a3
. Reivindicando nenhum bônus, e apenas cobrindo as tríades.Em vez de uma nota nítida, por exemplo,
C#
você deve usar o nome plano equivalenteDb
. (Corrigir isso aumentaria o código em mais de um pouco.) Os quatro tipos de acordes são0
para diminuir,m
para menor,M
para maior e+
para aumentado.A lógica é a seguinte: usamos o último caractere para adicionar um deslocamento à base 0-3-6, que seleciona o tipo de terceiro e quinto. Enquanto isso, usamos a nota para descobrir de onde na escala podemos extrair as notas. Os
;:
dois tornam a nota compatível com a indexação na escala no início e depois (by&.
) transforma as notas puxadas em uma sequência separada por espaço.Exemplo de uso:
fonte
Javascript, 224 caracteres
Este é o meu primeiro código de golfe. Eu acho que pode ser mais curto, mas não consigo encontrar nenhum bytes para salvar.
Suportes principais,
m
para menor,0
para diminuída,+
para aumentada, ou mais de 37 bytes paradim
,aug
.fonte
n[m]==0
pode ser simplesmente!n[m]
. O mesmo se aplica em outro local. Total você pode cortar 6 caracteres facilmente .n
é string,n[m]==0
será convertido0
em"0"
, então é igual an[m]=="0"
."0" == 0
é verdade, mas!"0"
é falsa.AM
. Eu também posso estar errado.Python (
143134 caracteres)Meu primeiro desafio de golfe :), não sei se mais alguns bytes podem ser removidos.
A notação usada aqui é * aug / + maj /, min / - dim
Eu mereço um ponto de bônus por ter a constante 42 no código: P
fonte
n,q,a='A A# B C C# D D# E F F# G G#'.split(),[4,4,3,3],input();m,i=ord(a[-1])-42,n.index(a[:-1])
Python 3: 257 - 150 = 107
Apenas 25 caracteres a mais para vencer a solução J! Ah bem. Existem algumas idéias legais aqui, eu acho.
A entrada é como os exemplos, embora você deva usar nomes nítidos em vez de nomes simples. (por exemplo, Gb deve ser F #)
A saída é uma oitava de um piano, vista de cima e à esquerda, com nomes de notas sobrepostos. Deve ser apenas um pequeno trecho da imaginação.
fonte
CM
, devemos ser capazes de lerC E G
...bool(R)
comR|0
?bool(R)
é 1 (verdadeiro) se não for vazio e 0 (falso) se estiver vazio. O|
operador não trabalha com listas ...Scala 537 caracteres - 50
fonte
Haskell, 273 caracteres
Resultados
fonte