Sua tarefa é pegar uma sequência de caracteres (a música) como entrada (em uma função ou programa) e imprimir (ou retornar) a música como seria em uma caixa de música.
Você receberá apenas os caracteres ABCDEFG.()
como entrada, e a entrada nunca estará vazia. Você também pode receber as letras em minúsculas, se desejar.
Esta é uma caixa de música vazia, de tamanho 3:
.......
.......
.......
Como você pode ver, as linhas têm 7 caracteres e, como o comprimento da caixa de música é 3, temos 3 linhas. Existem apenas .
s aqui, pois a caixa de música está vazia. Vamos colocar música nele!
Primeiro, criamos a caixa de música. Neste exemplo, a entrada será CDAG.DAG
.
O comprimento de CDAG.DAG
é 8, por isso precisamos de uma caixa de música com o comprimento 8:
.......
.......
.......
.......
.......
.......
.......
.......
Em seguida, lemos a entrada, um caractere de cada vez, e colocamos um O
em sua respectiva posição.
O primeiro caractere é C
e a localização de cada nota é equivalente a isso (adicionei espaços para maior clareza):
A B C D E F G
. . . . . . .
. . . . . . .
(and so on)
Se o caractere de entrada for a .
, basta imprimir uma linha vazia.......
Então, o C
seria o terceiro personagem junto. Vamos colocá-lo em nossa caixa de música no topo:
..O....
.......
.......
.......
.......
.......
.......
.......
Repetiremos esse processo para todos os outros caracteres (o texto entre parênteses é apenas para mostrar a nota, você não deve produzir isso):
..O.... (C)
...O... (D)
O...... (A)
......O (G)
....... (.)
...O... (D)
O...... (A)
......O (G)
Por causa de como as caixas de música funcionam, se usarmos um caractere diferente de O
, .
e <insert newline here>
, como um espaço, em nossa saída, ele não tocará a música correta!
Este é um acorde:
(ACE)
Esse acorde está nos instruindo a tocar as notas A
, C
e E
, ao mesmo tempo. Nunca haverá uma pausa (ou seja, a .
) em um acorde.
É assim que seria escrito:
O.O.O...
E é assim que pode aparecer na música: B(ACE)D
Você nunca receberá um acorde em um acorde, ou seja, isso não será válido: (AB(CD)EF)
ou isso A(B())
:, e o acorde não estará vazio, ou seja, isso não será válido:A()B
Você nunca receberá uma entrada inválida.
Exemplos:
B(ACE)D
.O.....
O.O.O..
...O...
B
.O.....
GGABC
......O
......O
O......
.O.....
..O....
...
.......
.......
.......
A..F.C(DA).
O......
.......
.......
.....O.
.......
..O....
O..O...
.......
.(ABCDEF)
.......
OOOOOO.
Espaço em branco à esquerda / à direita na saída é permitido.
Como se trata de código-golfe , o código mais curto vence!
()
duas vezes (por exemploAB(CD)E(FG)
:) ??Respostas:
Pip , 29 bytes
28 bytes de código, +1 para
-l
sinalizador.Recebe entrada em minúsculas como um argumento da linha de comandos. Experimente online!
Explicação
Aqui está uma amostra de como uma entrada é transformada:
fonte
Python 2 ,
9594 bytes-1 byte graças ao Value Ink
Experimente online! ou Experimente todos os casos de teste
Explicação
'@'<i
é verificar sei
há uma letra, substituindo o.
porO
na posição correta.'*'>i
é verificar sei
é um parêntese, se forx=i>'('
vai colocar0
emx
evitar a impressão / compensação deo
, quandoi==')'
, ele vai colocar1
nax
re-permitindo a impressão / compensação deo
.Quando
i=='.'
nada será alterado e'.......'
será impresso.A ordem do caractere é dada pelo código ASCII, onde
'('<')'<'*'<'.'<'@'<'A'
fonte
['.']*7
. Talvez seja uma suspensão de quando você estava usando uma tupla, o que exigiria a vírgula. Além disso, posso estar errado, mas isso parece gerar uma matriz['O', '.', '.', '.', '.', '.', '.']
por linha e não tenho certeza se isso é permitido.Lote, 209 bytes
Funciona acumulando letras e emitindo a linha se o último símbolo visto não for a
(
.fonte
Röda ,
977876 bytesExperimente online!
É uma função anônima que lê a entrada do fluxo. Usá-lo como este:
main { f={...}; push("ABCD") | f() }
. Ele usa o regex da resposta da ETHproductions.Ungolfed:
Resposta anterior:
Experimente online!
Ele funciona dividindo a sequência especificada em locais onde a sequência a seguir contém apenas parênteses correspondentes. Em seguida, para cada acorde, ele percorre as notas possíveis e imprime
O
se a nota é um membro do acorde ou.
não.fonte
JavaScript (ES6),
868576 bytesGuardado 9 bytes graças a @Neil
Explicação
Primeiro, combinamos o que formará cada linha da saída: acordes e caracteres que não fazem parte de um acorde. Então, para cada linha, pegamos a string
ABCDEFG\n
e substituímos cada caractere que não seja de nova linha por umO
se a linha o contiver e por.
outro.fonte
s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG\n`.replace(r,c=>x.match(c)?"O":"."))
.\)
ser.
?JavaScript (ES6),
118116114 bytesCasos de teste
Mostrar snippet de código
fonte
Ruby,
787571 bytesRetorna uma matriz de seqüências de caracteres.
Ungolfed + explicação
fonte
x.gsub(...){l=?.*7;$&.bytes{...};l+$/}
(swapscan
comgsub
, removermap
, e pular a primeira|x|
vez que você pode usar$&
para acessar o último jogo regex) para salvar 3 bytes e retornar uma seqüência de multi-linha em vez. (Também$/
mapeia para uma nova linha por padrão).PHP, 171 bytes
Demolir :
Experimente aqui!
fonte
Retina , 120 bytes
Tenho certeza de que há espaço para jogar golfe, mas agora funciona, então tentarei jogar mais tarde.
Experimente online!
Como funciona
Basicamente, o programa funciona alterando cada caractere para um número e atribuindo um
O
a essa posição em uma linha. Ele mapeiaABCDEFG.
para01234569
.Para gerar as linhas de nota simples, basta colocar um
O
após o número correspondente de.
s e preencher a linha com 7 caracteres.No entanto, os acordes são um pouco mais difíceis de fazer. Um processo semelhante é usado, mas os números devem ser convertidos em incrementos, ou seja, a primeira nota no acorde é (o que for), a segunda é a posição X depois da primeira, a terceira é a posição Y depois disso, etc.
Código
Comece ordenando todos os caracteres dentro dos acordes.
Realize a transliteração (mapeamento) de letras para números.
Substitua todos os dígitos entre colchetes por uma representação unária (usando
x
s), seguida por um espaço.Substitua todos os colchetes de fechamento por
m
seguidos por uma nova linha. Om
será usado como um tipo de marcador para o próximo loop:Esse é um estágio de substituição que fica em loop até que não possa mais ser substituído. Ele pega as duas últimas seqüências de
x
s antes de umm
e subtrai a primeira da segunda, movendo asm
costas. O marcadorm
é necessário porque ele deve executar esta operação da direita para a esquerda.Remova o primeiro
x
de cada sequência, exceto o primeiro.T
ransliterar substituindox
por.
, espaço porO
e excluindom
e(
.Nesse ponto, todas as linhas dos acordes foram criadas. Agora, as linhas de nota única precisam ser criadas.
Substitua cada dígito por tantos
.
s, seguidos por umaO
e uma nova linha.Coloque cada linha no comprimento 7 adicionando
.
s à direita. Isso funciona adicionando 6.
s ao final de cada linha (cada linha terá pelo menos 1 outro caractere) e substituindo cada caractere após os 7 primeiros em cada linha por nada. (Como o.
mapa é 9,O
será cortado nessas linhas)fonte
Perl,
877145 + 2 (-nl
sinalizador) = 47 bytesUsando:
Experimente em Ideone.
fonte
Perl 5 - 78 + 1 (sinalizador) + 2 (aspas de entrada) = 81 bytes
Pode ser executado assim:
fonte
Ruby, 68 bytes
A idéia é modificar a string
.......
toda vez que encontrarmos uma letra, depois a enviar e redefinir, mas somente quando estiver entre colchetes.(
desliga a saída.)
e.
ambos alternam / deixam a saída ligada, mas a última é irrelevante, pois nunca será encontrada dentro de um suporte.Ungolfed in program program
fonte
Python 3, 94 bytes
Uma função anônima
fonte
Haskell , 101 bytes
Experimente online! Uso:
p "AB.(CA)D"
. Retorna uma lista de strings.Explicação:
A função se
p
repete sobre a sequência. Se encontrar um colchete de abertura'('
,(x,_:t)<-span(')'<)r
particione a sequência restanter
nas cadeiasx
antes da ocorrência do colchete de fechamento')'
et
depois dela. Caso contrário, o caractere atualx
será transformado em uma string[x]
. Nos dois casos, a função?
é chamada com a sequência atual de notas e a sequência restante.?
mapeia a função#
sobre a sequência"ABCDEFG"
, onde#
substitui todos os caracteres que não estão na sequência atual de notas por'.'
. A linha da caixa de música resultante é anexada à chamada recursiva dap
lista restanter
.fonte
Retina 0.8.2 , 52 bytes
Experimente online! Recebe entrada em minúsculas. Explicação:
Divida a música em acordes ou notas e comece a criar a saída adicionando a lista de equivalentes de notas.
Para cada nota em cada acorde, altere a saída para a
O
e exclua a nota do acorde.Exclua todas as músicas estranhas agora e altere todas as notas incomparáveis para vazias.
fonte
PHP, 93 bytes
Execute como pipe
-nR
ou experimente on-line .demolir
fonte