A trombeta é um instrumento de aerofone com válvulas, geralmente afinado B♭
. O som é emitido quando o jogador vibra seus lábios para deslocar o ar dentro do instrumento. Essa vibração é adquirida ajustando a boca de uma maneira específica, chamada embocadura. Embocaduras diferentes, com lábios mais apertados ou mais frouxos, produzem arremessos diferentes.
Além disso, cada válvula na trombeta também altera o tom do instrumento. Quando pressionada, uma válvula fecha um caminho dentro da tubulação do instrumento, fazendo o ar fluir por um caminho mais longo, diminuindo assim o tom do som original. Para os propósitos deste desafio, consideraremos o padrão, B♭
trompete, no qual a primeira válvula abaixa o passo em um passo completo, a segunda abaixa o passo em um meio passo e a terceira abaixa o passo em um e um meio passo.
O desafio
Seu desafio é criar um programa ou função que, com duas entradas embouchure
e valves
determine o tom da nota que está sendo tocada.
Para os propósitos deste desafio, as notas seguirão a sequência:
B♭, B, C, C♯, D, E♭, E, F, F♯, G, G♯, A.
Regras
- A E / S pode ser obtida / fornecida em qualquer método razoável .
- Aplicam-se brechas padrão .
- Você tem permissão para usar
b
e, em#
vez de♭
e♯
se desejar. - A entrada para
valves
pode ser tomada como uma lista de válvulas pressionadas (1, 3
) ou uma lista booleana (1, 0, 1
). - Isso é código-golfe , então o código mais curto em cada idioma vence.
Casos de teste:
Valves
nesses casos de teste é fornecida como uma lista booleana, onde 0 significa deprimido e 1 significa pressionado.
Embouchure: Valves: Output:
B♭ 0 0 0 B♭
B♭ 0 1 0 A
B♭ 1 0 1 F
C♯ 0 0 1 B♭
C♯ 1 1 1 G
E♭ 1 0 0 C♯
G 0 1 1 E♭
G♯ 1 0 0 F♯
G♯ 0 0 1 F
G 1 0 0 F
F♯ 1 0 0 E
D 1 0 1 A
A 1 1 1 E♭
E 1 1 0 C♯
E 0 0 1 C♯
Disclaimer: Ainda não sou muito músico, então peço desculpas por qualquer massacre que possa ter causado nos casos de teste. As correções são apreciadas.
F# 100
ser E não F?C#
trompete sem pressionar nenhuma válvula. Apenas notas específicas (B♭-F-B♭-D-F-A♭-B♭...
), as séries de overtone deB♭
. Ainda assim, mesmo que não reflita um instrumento real, o desafio está perfeitamente bem definido.Respostas:
Pitão
3212511981 bytesExperimente online!
Economizou muitos bytes graças a Jonathan Allan.
Minha solução original (em Python 3 ):
Experimente online!
Guardado 6 bytes graças a @HyperNeutrino.
Explicação
Primeiro, faço uma série de anotações, mas o dobro do comprimento, para que eu não precise me preocupar em dar voltas de
Bb
paraA
.Então, recebo a entrada no seguinte formato (por exemplo):
Em seguida, encontro o índice da nota inicial usando
n.index(e,9)
(o9
existe para garantir que eu comece bem no meio da lista (duplicada). Calculo o deslocamento desejado com a expressão:Onde
f
está a primeira válvula,s
é a segunda válvula et
é a terceira.Finalmente, ele simplesmente imprime a nota encontrada na lista subtraindo o deslocamento do índice inicial.
fonte
"<some string>".split()
divide por espaço em branco por padrãostr
eint
moldes e permitindo a entrada avaliado) e reverter as notas e compensação para a frente (evitando o,9
noindex
. Chamada Try It Online!'Bb', 1, 1, 1
levá-lo ao índice-6
que seriaE
, conforme necessário) - é o que TFeld tem desde feito .Wolfram Language (Mathematica) , 100 bytes (e 134 para uma trombeta em funcionamento)
Experimente online!
Bem direto.
Uma saída melhor pelo custo de 34 bytes.
fonte
Geléia ,
3736 bytesUm link diádico que aceita as válvulas como uma lista de
1
s ou0
s como uma lista que representa[second, first, third]
à esquerda e a embocadura como uma lista de caracteres à direita que retorna uma lista de caracteres.Experimente online!
Quão?
fonte
Ruby , 71 bytes
Experimente online!
70 caracteres, mas 80 bytes
Experimente online!
fonte
Javascript 96 bytes
Seguindo a ideia @vasilescur, esta é a implementação em js
fonte
b
e#
é permitido), mas você precisa usarb
e em#
vez de apartamentos e objetos cortantes.Lote, 188 bytes
Usa
#
eb
: isso significa queEb
eBb
são nomes de variáveis legais;#
é tratado fazendo uma substituição de cadeia de caracteres para+1
. O resultado da substituição da coluna é avaliado automaticamente e as válvulas são levadas em consideração antes de o resultado ser pesquisado em uma lista.fonte
Stax , 32 bytes
Execute e depure on-line
Leva um nome de nota e uma lista de válvulas pressionadas. Ele cria uma matriz de nomes de notas, calcula o intervalo total da válvula e obtém a nota nesse deslocamento na matriz.
Execute este
fonte
Python 2 ,
8479 bytesExperimente online!
fonte
C (gcc) ,
92 8682 bytesExperimente online!
Adaptado da implementação do @ Vazt .
fonte
Perl6 / Rakudo 73 caracteres
Tecnicamente, são 83 bytes porque eu coloquei os caracteres Unicode, mas trocá-los pelos equivalentes ASCII daria 73 bytes.
Como
{code block}
com parâmetros como$^a
este, é um lambda, com uma assinatura($a, $b, $c, $d)
.Chame-o:
Menos golfe:
Aqui dobramos uma string
'...' x 2
usando ox
operador infix e, em seguida, pesquisamos a embocadura seguida por n notas usando o operador smartmatch'...' ~~ /.../
- a regex depende\w\W?
que é um caractere de palavra e talvez um caractere que não seja da palavra.Procuramos n instâncias dessa via
(\w\W?)**{$_}
, nas quais já calculamos n =$_
dos parâmetros$b
para$d
. Isso produz uma correspondência entre a nota de embocadura e a nota resultante, da qual queremos apenas a última, então a igualamos com outra~~ /\w\W?$/
.O cálculo do
$_
primeiro é necessário para permitir$^b
criação implícita de parâmetros no bloco.76 caracteres
Uma alternativa usando uma matriz em vez de correspondências de cadeia de caracteres é mais 3 caracteres:
A localização da embocadura na lista é obtida com
@arr.first: $^a, :k
, que retorna o índice (chave) do elemento encontrado com:k
.Definir a matriz para
$_
(como um objeto) nos permite usar.first
e.[ ]
sobre ele sem gastar muitos caracteres.fonte
C (gcc) , 155 bytes
Experimente online!
Abordagem simples.
A entrada da válvula é 0,1.
A entrada da embocadura deve estar em minúscula. Curiosamente, o TiO não é encontrado
strcmpi()
sem incluirstring.h
, enquanto o mingw-gcc permite o-Wimplicit-function-declaration
aviso padrão .fonte