Antes de sair, você não precisa entender muita notação musical para fazer esse desafio.
EXPLICAÇÃO
Nas partituras padrão, claves duplos atravessam a página, servindo como pontos de referência para as notas, informando que nota deve ser tocada. Se você ainda não está familiarizado com a clave de sol e os agudos, aqui está uma descrição da Wikipedia:
Clave é um símbolo musical usado para indicar o tom das notas escritas. Colocado em uma das linhas no início da pauta, indica o nome e o tom das notas nessa linha. Esta linha serve como um ponto de referência pelo qual os nomes das notas em qualquer outra linha ou espaço da pauta podem ser determinados.
Na imagem acima, a metade superior das linhas é a clave de sol, denotada com um
A metade inferior é a clave de sol, denotada com um
Como você pode ver na Clave de Sol, uma nota na parte inferior mais-line é um E . (Eu não estou contando notas fora das linhas clef para este desafio) Na clave de fá, a linha mais baixa é um G . Para concluir esse desafio, você deve fazer o seguinte:
DESAFIO
Dada uma entrada de uma das seguintes formas (sua escolha), converta-a na clave oposta. Seja a clave de sol ou a clave de sol, pode ser um valor Truthey / Falsey no seu idioma (não apenas dois valores), por exemplo
F # T ou F # Verdadeiro ou F # Treble
mas não
F # -1 ou F # 4
Espaços e letras maiúsculas são opcionais, Flats não aparecerão e espaços em branco à direita não são permitidos.
Input Expected Output
E Treble G
F Treble A
F# Treble A#
G Treble B
G# Treble C
A Treble C
A# Treble C#
B Treble D
C Treble E
C# Treble F
D Treble F
D# Treble F#
E Treble G
F Treble A
F# Treble A#
G Bass E
G# Bass F
A Bass F
A# Bass F#
B Bass G
C Bass A
C# Bass A#
D Bass B
D# Bass C
E Bass C
F Bass D
F# Bass D#
G Bass E
G# Bass F
A Bass F
A# Bass F#
Esteja avisado, este não é um desafio trivial de diferença constante. Observe atentamente as entradas e saídas. Se você olhar para um piano,
as teclas pretas são cortantes, indicadas por #. Observe que não há um E # ou um B #. Isso significa que, se você receber G # na clave de baixo, em vez de retornar E # , precisará retornar F
Isso é código-golfe , então a menor contagem de bytes vence.
fonte
C
vez deC
) está ok?1
e-1
(ou mesmo dizer,4
e-4
) para a entrada de indicador clef permitido ou se isso só será aceitável se forem truthy / Falsey valores em nossa língua?Respostas:
Geléia ,
3534 bytesSinto que alguma aritmética pode conquistar esse método.
Experimente online!
Um programa completo usando 1) o indicador de clave
0
ou1
para Bass ou Treble respectivamente e 2) a nota; e imprimir a nota resultante.Seriam 31 bytes se
-4
e4
forem aceitáveis como os valores de entrada do indicador de clave (entãoÑi+_⁸?4ị¢
pode se tornarÑi+⁸ị¢
), mas isso foi esclarecido como não permitido, a menos que -4 seja falsey e 4 seja verdade, o que não é o caso do Jelly.Quão?
Constrói um teclado com phantom
B#
eE#
teclas, localiza o índice da entrada, compensa que,4
na direção necessária, indexa novamente em um teclado com essas teclas phantom substituídas pelos resultados necessários (a tecla acima deles):fonte
Befunge,
7064 bytesExperimente online!
A entrada deve estar no formato
C# Treble
ouF Bass
, embora a clave possa simplesmente ser a primeira letra (T
ou sejaB
), pois o restante da entrada é ignorado de qualquer maneira.Explicação
Como resultado dessa modificação de código, a próxima sequência de instruções assumirá uma das duas formas:
Neste ponto, a pilha contém
note,0,sharp,space
ounote,0,space
.Neste ponto, a pilha contém
note,0
ou apenasnote
(com um zero implícito abaixo).fonte
Perl 5, 56 bytes
Lê a nota e a clave como duas linhas de STDIN e imprime a nova nota em STDOUT. A clave é
0
para agudos e1
baixos.fonte
-p
a bandeira tio.run/##K0gtyjH9/79YX08/OaNIwcxUW0PXRMvGTju/KEVFTVPVXD/...JavaScript (ES6) 74 bytes
Toma entrada na sintaxe curtimenta
(note)(clef)
ondeclef
é0
para baixo e1
para o triplo .Demo
Mostrar snippet de código
Quão?
Na verdade, isso é um pouco menos divertido do que minha versão anterior, mas a tabela de pesquisa subjacente é agora o
F#,C#,(unused),D#,A#,F,C,G,D,A,E,B,F
que permite reduzir a condição # , evitando o truque de caracteres NUL - que era um pouco limitado, suponho.Versão anterior
7675 bytesDemo
Mostrar snippet de código
Quão?
A entrada (n, c) é processada através das seguintes etapas:
Primeiro, avaliamos
4 * !!n[1] + c + n
onde!!n[1]
é verdadeiro (coagido a 1 ) se a nota contiver um # e falso (coagido a 0 ) caso contrário. A expressão4 * !!n[1] + c
resulta em um valor numérico que é adicionado na frente da string n .Etapa implícita: zeros à esquerda e # à direita são ignorados por
parseInt()
. Por exemplo,"5G#"
é realmente analisado como"5G"
.Convertemos a nova string em um valor decimal, analisando-a como uma quantidade base-21.
Aplicamos o módulo 24.
Aplicamos o módulo 17.
Abaixo está a tabela de resumo de todos os pares de entrada possíveis, juntamente com a saída esperada. Observe que um # deve ser adicionado à saída se o resultado final for 0 , 2 , 3 ou 5 . Daí o uso da máscara binária 101101 ( 45 em decimal).
fonte
Python 2 , 77 bytes
Função que imprime em
STDOUT
.True
converte graves em agudos eFalse
converte agudos em graves.Experimente online!
Explicação:
N=ord(n[0])-63-4*c;
,, calcula o índice (0 a 7) da carta da nova nota, desconsiderando os objectos cortantes.ord(N[0])-63-4*c
obtém o índice da letra atual e adiciona ou subtrai 2, dependendo do valor dec
(variável para alternar a direção da conversão)M=-~N%3<1<len(n);
calcula se essa variável precisará ou não ser ajustada. Por exemplo, se a nova nota forE
e a nota original tiver uma nitidez, ela precisará ser ajustada para umaF
. A desigualdade encadeada funciona da seguinte maneira:-~N%3<1
verifica se o índice da nova nota está na sequência3n-1
. Isso só produzirá verdadeiro paraE
eB
, as duas notas que não têm um nítido.1<len(n)
verifica se a nota original estava afiada (isso tornaria o comprimento da corda maior que 1). Isso é necessário, pois, se não houver nitidez, não será necessário ajustar as novas letras da nota.M
comoTrue
ouFalse
, que pode ser usado no cálculo como1
e0
respectivamente, para executar o ajuste, precisamos adicionar apenas M a N e módulo por 7.chr((N+M)%7+65)
adiciona o ajuste, se necessário, e depois converte o valor de um índice em um caractere.+n[1:2-M]
acrescentará um símbolo nítido se ambosM=0
(nenhum ajuste foi feito) e o valor original também tiver um nítido.fonte
Java 8, 119 bytes
Explicação:
Experimente aqui.
fonte
n->b->((char)((n.charAt(0)-(b?0:4))%7+65)+n.substring(1)).replaceAll("B#","C").replaceAll("E#","F")
R , 111 bytes
Experimente online!
Ungolfed:
fonte