Dada uma partitura ascii, você deve ser capaz de produzir a nota e seu comprimento correspondente. A partitura conterá entre 5 e 15 notas, inclusive, e será transcrita em uma pauta. Uma pauta é composta de cinco linhas horizontais que compreendem de - (menos) caracteres separados por linhas de espaços. A linha inferior da pauta é equivalente à nota 'E'. A linha de espaços imediatamente acima da linha inferior indica um 'F' e tem um tom mais alto que o 'E' abaixo dela. Isso continua como abaixo. Observe que as notas só sobem para 'G' antes de começar novamente em 'A'. Ver abaixo:
F ----------
E
D ----------
C
B ----------
A
G ----------
F
E ----------
Observe que as letras não estão incluídas na entrada. As notas são sobrepostas no topo da pauta, usando o caractere ao (minúsculas ooh) para indicar o 'cabeçalho da nota'. Este cabeçalho da nota indica a frequência da nota e, portanto, a representação alfabética da mesma como acima. Por exemplo, uma nota colocada na partitura como abaixo indica um 'A':
----
----
----
o
----
----
Uma nota, como o 'A' acima, é chamada de 'nota completa' e seria tocada por uma batida inteira. Outras durações podem ser indicadas pela inclusão de um "caule" subindo da nota e entre zero e três "sinalizadores". Uma haste é composta de três | (barra vertical ou barra vertical) empilhados imediatamente acima da cabeça da nota. Uma haste sem bandeiras é considerada uma 'semínima' e toca por um quarto de batida. Os sinalizadores são caracteres \ (barra invertida) e estão do lado direito da haste. Cada haste reduz pela metade o tempo em que a nota é tocada. O comprimento de cada nota será um dos seguintes: uma nota inteira, semínima, colcheia, semicolcheia ou semagésima segunda. É assim que cada tipo de nota procuraria A:
--------------------
----|---|\--|\--|\--
| | |\ |\
----|---|---|---|\--
o o o o o
--------------------
--------------------
Juntar mais de uma nota fornece uma pontuação. Cada nota pode ser considerada com quatro caracteres de largura, com uma nota na primeira coluna de cada bloco de quatro caracteres. Por exemplo :
|\
----|\--|\----------
|\ | |\
----o---|---o---|\--
| o |
|---------------o---
|
o-------------------
--------------------
O exemplo acima contém as seguintes notas, em ordem: uma semínima 'G', uma trigésima segunda nota 'D', uma colcheia 'C', uma nota completa 'D' e uma semicolcheia 'B'. Cada nota na sua saída deve estar no formato letra / comprimento, em que letra é AG e comprimento é a fração do comprimento da nota quando comparada a uma nota inteira. Como exceção, o comprimento e / caractere não devem ser impressos se a nota for uma nota inteira. Cada nota na sua saída deve ser separada por um único espaço. Portanto, para a pontuação acima, seu código deve gerar o seguinte:
G/4 D/32 C/8 D B/16
- As notas estarão no seguinte intervalo: EFGABCDE F. Observe que apenas a letra precisa ser impressa; a oitava é ignorada.
- Observe que o número de linhas de entrada varia de 9 a 12, pois as notas com menos de um quarto de tempo na linha D ou superior exigirão que mais linhas sejam exibidas completamente.
- Não há meia nota neste caso.
O código mais curto vence (o espaço em branco não conta).
Edit: Corrigido erro no espaçamento em uma entrada.
Algumas entradas de amostra:
|\
----|\--|-------------------
|\ | |
|---|---o---------------o---
| o |\
o---------------|\--|\------
|\ |\ |\
------------|\--|\--o-------
|\ o
------------o---------------
Saída: B / 8 C / 8 D / 8 E / 32 F / 32 G / 32 D
----------------o-------------------
o
------------o-----------------------
o
--------o---------------------------
o
----o-------------------------------
o
o-----------------------------------
Saída: EGBDFFACE
|\
|\
|\
------------o-------|-----------
| o | |\
|---|\--------------|---|\------
| | o |\
o---|---|\--------------o---|\--
o |\ |\
--------|\------------------|---
o o
--------------------------------
Saída: B / 4 A / 8 F / 32 F / 32 EC / 4 B / 32 F / 16
Respostas:
Javascript,
284,279,278,225,221, 220 caracteres (incluindo o espaço em branco necessário)Forro único ( rabeca de teste ):
Legível ( rabeca de teste ):
fonte
;
e fazer alguns truques, você pode tornar isso ainda mais curto.function a(c){b='',d=c.split('\n');for(e=0;d[0][e++];){for(i=f=0;g=d[i++];){h=g[e-1];if(h=='o')b+=(b?' ':'')+String.fromCharCode((d.length+4-i)%7+65);if(h=='|')f=f||4;f*=1+(g[e]=='\\');}if(f)b+='/'+f}return b}
(209 caracteres)Perl, 103 caracteres
(108 se você contar os caracteres de espaço em branco necessários)
Com espaço em branco para apresentação:
Observe que suponho que todas as linhas tenham o mesmo comprimento (conforme a versão revisada da pergunta).
Versão reorganizada com explicações:
(solução antiga e mais longa, mantida porque pode ser interessante mesmo que seja um pouco mais)
Perl,
147126 caracteres(
149131 se você contar o espaço em branco necessário)Com espaço em branco para apresentação:
Reorganizados um pouco para não abusar tanto do idioma:
Note que eu suponho que todas as linhas tenham o mesmo comprimento. Se você deseja permitir linhas mais curtas, uma correção óbvia é adicionar
$_.=1x$c,
no início do programa, a um custo de 9 caracteres.Pensei em outra abordagem para evitar palavras longas como
split
emap
e deixar espaços fazer mais do trabalho, mas o clichê e pontuação se vingaram, e só posso obtê-lo para baixo para uma coqueluche 130 (144 com espaços em branco necessário).O patch para lidar com linhas inacabadas é um pouco mais estranho dessa vez (o que você achou que não poderia ficar mais estranho?). 139 caracteres, 155 com espaço em branco necessário.
fonte
Scala (2.9),
352313291294290277274273 caracteresSe uma função é tudo o que é necessário:
Se um programa completo for necessário:
fonte
J - 108 caracteres
Ungolfed:
fonte
Golfe em Python, 207 caracteres.
Eu começar a jogar golfe código com Python por 2 dias e eu achei que coisas como
import sys
,sys.stdin.read
,sys.stdout.write
são expansivas.fonte