Introdução
O código de Parsons é apenas uma maneira simples de descrever variações de tom em uma peça musical, seja uma nota maior ou menor que a anterior.
Mesmo se você se lembrar de músicas, ainda é possível lembrar se uma nota sobe ou desce, portanto, o código Parsons pode ajudá-lo a identificar uma música usando um mecanismo de pesquisa.
Descrição
Cada variação é representada por um único caractere, que é um dos seguintes:
R
se a nota for a mesma que a anterior (significa " R epeat" )U
se a nota for maior que a anterior (significa " U p" )D
se a nota for menor que a anterior (significa " D own" )
A nota inicial é escrita como *
.
Exemplo
Aqui está um exemplo de código de Parsons (início de "Ode to Joy" ):
*RUURDDDDRUURDR
Você pode visualizá- lo assim:
*-*
/ \
* *
/ \
*-* * *-*
\ / \
* * *-*
\ /
*-*
Vamos chamar isso de um contorno a partir de agora.
As regras para desenhar esses contornos são consideradas auto-explicadas pelo exemplo acima.
Desafio
Agora vem o verdadeiro desafio.
Escreva um programa que, dado um contorno como entrada, produz seu código Parsons correspondente.
Você não é solicitado a desenhar o contorno, mas o oposto, na verdade.
No contorno, encontre o código Parsons original.
Regras
- Aplicam-se as regras usuais para o golfe com código
- O programa mais curto em número de bytes vence
- A entrada é um contorno e a saída deve ser um código Parsons válido
- Detalhes sobre espaço em branco extra para a entrada são irrelevantes, faça o que for melhor para você
- Você não tem permissão para codificar, de uma maneira ou de outra, partes da saída e / ou do programa usando espaço em branco extra devido à regra anterior
Notas
- Isso pode ser útil para testar
- O código Parsons correspondente para
*
é*
- Uma sequência vazia não é um contorno válido
- Um código Parsons sempre começa com
*
*
que não faz nada?*
? Não. Deveria imprimir*
, suponho. Vou adicionar esta caixa de canto.*
. Sempre.Respostas:
Pitão -
28252725 bytes2 byes economizados graças a @Jakube.
Experimente online aqui .
fonte
*
como entrada. A saída é*0
enquanto deveria ser justa*
. Um zero selvagem e maléfico apareceu.U
eD
, a propósito. Caso contrário, bem feito.CJam, 21 bytes
Dobre as linhas (
:
) vetorizando (.
) uma operação máxima em caracterese>
. Como existe apenas um caractere não espacial em cada coluna, este será o resultado, pois o espaço possui um código ASCII menor que todos os caracteres não espaciais imprimíveis.Desative a mudança e imprima o primeiro asterisco e
(o
, em seguida, mapeie todos os outros (2%
) caracteres restantes paraUDR
usar a indexação modular.Solução antiga (29 bytes)
qN/
obtém linhas de entrada.z
transpõe essa matriz de caracteres.2%
cai todas as linhas ímpares.'*f#
localiza o índice do asterisco em cada linha.0+2ew);
obtém todos os pares sucessivos de índices.::-
calcula suas diferenças, e"RDU"f=
os mapeia para letras (via indexação modular:0 → R
,2 → U
,-2 ≡ 1 → D
). O líder'*
precede o asterisco.Edição : Eu mudei
2ew
para0+2ew);
para contornar o CJam não manipularew
(fatias sucessivas) em listas que são muito curtas. Isso faz o código funcionar para a sequência de entrada*
.Experimente aqui ou assista em ação:
fonte
:-p
*
Porém, ele não funciona como entrada. Eu recebo um bomRuntimeException
lugar.[X]2ew
deve retornar em[]
vez de errar. Vou adicionar uma solução alternativa, no entanto.Python 3,
1291089886 bytesProvavelmente, existem várias maneiras de jogar isso, mas eu gosto que tenha tudo em uma linha.
Editar: agora usando
''.translate()
Edit: Com muitos agradecimentos a wnnmaw .
Editar: alterei o formato de entrada para uma matriz de seqüências de caracteres em vez de uma sequência separada por nova linha para salvar bytes. Além disso, na última edição, eu me misturei
U
eR
, então, corrigi isso.A entrada deve ser uma matriz de seqüências de caracteres. Para o exemplo acima, isso se parece com:
Ungolfed:
fonte
lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')
105 bytes. Principal diferença está usando uma tupla condicional em vez de traduzirRuby, 87 bytes
Requer espaços à direita na entrada para que todas as linhas tenham o mesmo comprimento.
fonte
>:D
.Japt, 38 bytes
40 41 45 46 48Economizou 2 bytes graças a @ETHproductions
Se houvesse um comando trim, isso seria apenas 38 bytes; -; adicionará explicações quando eu terminar de jogar golfe. Não
:P
é o programa que tenta ser engraçado, na verdade é o programa que ignora os caracteres que não são importantes.Experimente online
fonte
x
e transpor e rotacionar funções emy
ez
(dividir em novas linhas, use a função de matriz, junte-se a novas linhas) #Yu ?"RUD"g1+(XrS c -47 g):P
Haskell, 89 bytes
Exemplo de uso:
Transponha a entrada e substitua os caracteres
/
/-
/\
por strings singleton"U"
/"R"
/"D"
. Todos os outros caracteres são substituídos por cadeias vazias""
, que desaparecem mais tarde concatenando tudo. Por fim, anexe o asterisco*
.fonte
Mathematica, 103 bytes
Muito curto, considerando que este é um desafio para o processamento de strings.
fonte
JavaScript (ES6) 90
Uma função anônima. Ele varre a string de entrada char por char, levando em conta a posição na linha atual. Fazendo isso, ele cria uma matriz de saída subsituting
U D R
para/ \ -
no lugar certofonte
Matlab, 62 bytes
Isso requer que a entrada seja retangular (o mesmo número de caracteres em cada linha). Por exemplo
Explicação
fonte